#![no_std]
#[macro_export]
macro_rules! ax {
(x) => { 0usize };
(y) => { 1usize };
(z) => { 2usize };
(w) => { 3usize };
}
#[macro_export]
macro_rules! axs {
( $( $d:ident ), * ) => { [ $( ax!($d), )* ] };
( $d:ident; $i:expr ) => { [ax!($d); $i] };
}
#[macro_export]
macro_rules! axr {
( $a:ident..$b:ident ) => { ax!($a)..ax!($b) };
( $a:ident..=$b:ident ) => { ax!($a)..=ax!($b) };
( $a:ident..$b:expr ) => { ax!($a)..$b };
( $a:ident..=$b:expr ) => { ax!($a)..=$b };
( ..$a:ident ) => { ..ax!($a) };
( ..=$a:ident ) => { ..=ax!($a) };
( $a:ident.. ) => { ax!($a).. };
( ($a:expr)..$b:ident ) => { $a..ax!($b) };
( ($a:expr)..=$b:ident ) => { $a..=ax!($b) };
}
#[cfg(test)]
mod tests {
#[cfg(test)]
mod ax {
#[test]
fn it_works() {
assert_eq!(ax!(x), 0);
assert_eq!(ax!(y), 1);
assert_eq!(ax!(z), 2);
assert_eq!(ax!(w), 3);
}
}
#[cfg(test)]
mod axs {
#[test]
fn it_works() {
assert_eq!(axs![x,y,z,w], [0,1,2,3]);
assert_eq!(axs![x,z,y], [0,2,1]);
assert_eq!(axs![x,y,x,y], [0,1,0,1]);
}
}
#[cfg(test)]
mod axr {
#[test]
fn ident_to_ident_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![x..z]];
assert_eq!(*slice, [0,1]);
}
#[test]
fn ident_to_eq_ident_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![y..=w]];
assert_eq!(*slice, [1,2,3]);
}
#[test]
fn ident_to_expr_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![y..9]];
assert_eq!(*slice, [1,2,3,4,5,6,7,8]);
}
#[test]
fn ident_to_eq_expr_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![x..=5]];
assert_eq!(*slice, [0,1,2,3,4,5]);
}
#[test]
fn inf_to_ident_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![..w]];
assert_eq!(*slice, [0,1,2]);
}
#[test]
fn inf_to_eq_ident_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![..=w]];
assert_eq!(*slice, [0,1,2,3]);
}
#[test]
fn ident_to_inf_works() {
let arr = [0,1,2,3,4,5,6,7,8,9];
let slice = &arr[axr![x..]];
assert_eq!(*slice, arr);
}
#[test]
fn expr_to_ident_works() {
let arr = [0,1,2,3,4];
let slice = &arr[axr!((0)..z)];
assert_eq!(*slice, [0,1]);
let expr = 1usize;
let slice = &arr[axr!((expr)..w)];
assert_eq!(*slice, [1, 2]);
}
#[test]
fn expr_to_eq_ident_works() {
let arr = [0,1,2,3,4];
let slice = &arr[axr!((0)..=z)];
assert_eq!(*slice, [0,1,2]);
let expr = 1usize;
let slice = &arr[axr!((expr)..=w)];
assert_eq!(*slice, [1,2,3]);
}
}
}