#![no_std]
#![forbid(unsafe_code)]
#[doc(hidden)]
pub use core::convert::TryInto;
#[macro_export]
macro_rules! index_fixed {
(&mut $s:expr ; .. $e:expr) => {
index_fixed!(&mut $s; 0 , .. $e )
};
(&mut $s:expr ; $b:expr , ... $e:expr) => {
index_fixed!(&mut $s; $b , .. ($e + 1))
};
(&mut $s:expr ; $b:expr , .. $e:expr) => { {
fn conv<T>(b: &mut[T]) -> &mut[T;$e - $b] {
use $crate::TryInto;
b.try_into().unwrap()
}
conv(&mut $s[$b..$e])
} };
(& $s:expr ; .. $e:expr) => {
index_fixed!(& $s ; 0 , .. $e)
};
(& $s:expr ; $b:expr , ... $e:expr) => {
index_fixed!(& $s ; $b , .. ($e + 1))
};
(& $s:expr ; $b:expr , .. $e:expr) => { {
fn conv<T>(b: &[T]) -> &[T;$e - $b] {
use $crate::TryInto;
b.try_into().unwrap()
}
conv(& $s[$b..$e])
} };
}
#[macro_export]
macro_rules! index_fixed_get {
(&mut $s:expr ; .. $e:expr) => {
index_fixed_get!(&mut $s; 0 , .. $e )
};
(&mut $s:expr ; $b:expr , ... $e:expr) => {
index_fixed_get!(&mut $s; $b , .. ($e + 1))
};
(&mut $s:expr ; $b:expr , .. $e:expr) => { {
fn conv<T>(a: Option<&mut[T]>) -> Option<&mut[T;$e - $b]> {
a.map(|b| {
use $crate::TryInto;
b.try_into().unwrap()
})
}
conv($s.get_mut($b..$e))
} };
(& $s:expr ; .. $e:expr) => {
index_fixed_get!(& $s ; 0 , .. $e)
};
(& $s:expr ; $b:expr , ... $e:expr) => {
index_fixed_get!(& $s ; $b , .. ($e + 1))
};
(& $s:expr ; $b:expr , .. $e:expr) => { {
fn conv<T>(a: Option<&[T]>) -> Option<&[T;$e - $b]> {
a.map(|b| {
use $crate::TryInto;
b.try_into().unwrap()
})
}
conv($s.get($b..$e))
} };
}