#[macro_export]
macro_rules! s {
(@parse [$($elems:expr),*] ) => { $crate::view::SliceInfo::new(vec![$($elems),*]) };
(@parse [$($elems:expr),*] $num:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Index($num)] $($rest)*)
};
(@parse [$($elems:expr),*] $num:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Index($num)] )
};
(@parse [$($elems:expr),*] $s:literal ..= $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive($s, $e)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal ..= $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive($s, $e)] )
};
(@parse [$($elems:expr),*] - $s:literal ..= $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive(-$s, $e)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal ..= $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive(-$s, $e)] )
};
(@parse [$($elems:expr),*] $s:literal ..= - $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive($s, -$e)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal ..= - $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive($s, -$e)] )
};
(@parse [$($elems:expr),*] - $s:literal ..= - $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive(-$s, -$e)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal ..= - $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::RangeInclusive(-$s, -$e)] )
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, 1)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, 1)] )
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, 1)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, 1)] )
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, 1)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, 1)] )
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, 1)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, 1)] )
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal ; $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, $step)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal ; $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, $step)] )
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal ; $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, $step)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal ; $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, $step)] )
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal ; $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, $step)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal ; $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, $step)] )
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal ; $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, $step)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal ; $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, $step)] )
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal ; - $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, -$step)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. $e:literal ; - $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, $e, -$step)] )
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal ; - $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, -$step)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. $e:literal ; - $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, $e, -$step)] )
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal ; - $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, -$step)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. - $e:literal ; - $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range($s, -$e, -$step)] )
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal ; - $step:literal , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, -$step)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. - $e:literal ; - $step:literal ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::Range(-$s, -$e, -$step)] )
};
(@parse [$($elems:expr),*] $s:literal .. , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::From($s)] $($rest)*)
};
(@parse [$($elems:expr),*] $s:literal .. ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::From($s)] )
};
(@parse [$($elems:expr),*] - $s:literal .. , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::From(-$s)] $($rest)*)
};
(@parse [$($elems:expr),*] - $s:literal .. ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::From(-$s)] )
};
(@parse [$($elems:expr),*] .. , $($rest:tt)*) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::All] $($rest)*)
};
(@parse [$($elems:expr),*] .. ) => {
s!(@parse [$($elems,)* $crate::view::SliceArg::All] )
};
($($rest:tt)*) => {
s!(@parse [] $($rest)*)
};
}
#[macro_export]
macro_rules! tensor {
($($tt:tt)*) => {{
let s = stringify!($($tt)*);
$crate::Tensor::from_string_literal(s)
.expect("Failed to create tensor from string literal")
}};
}
#[cfg(test)]
mod tests {
use super::*;
use crate::dtype::{DTYPE_FLOAT32, DTYPE_INT32};
#[test]
fn test_tensor_macro() {
let t = tensor!([[1, -2], [3, 4]]);
assert_eq!(t.shape(), &[2, 2]);
assert_eq!(t.dtype(), DTYPE_INT32);
assert_eq!(t.to_vec::<i32>().unwrap(), vec![1, -2, 3, 4]);
let t = tensor!([[1.0, 2.0], [3.0, 4.0]]);
assert_eq!(t.dtype(), DTYPE_FLOAT32);
assert_eq!(t.to_vec::<f32>().unwrap(), vec![1.0, 2.0, 3.0, 4.0]);
let t = tensor!([[1, 2.0], [3, -4]]);
assert_eq!(t.dtype(), DTYPE_FLOAT32);
assert_eq!(t.to_vec::<f32>().unwrap(), vec![1.0, 2.0, 3.0, -4.0]);
let t = tensor!([]);
assert_eq!(t.shape(), &[0]);
assert_eq!(t.size(), 0);
}
}