numas/array/slice.rs
1/// Returns indices for slicing, each dimension separated with ';' and range with '=>'
2///
3/// # Examples
4///
5/// ```
6/// #[macro_use] extern crate numas;
7///
8/// assert_eq!(s![1; 5 => 2; 3], vec![1, 0, 5, 2, 3, 0]);
9/// assert_eq!(s![1; 5; 2; 3], vec![1, 0, 5, 0, 2, 0, 3, 0]);
10/// ```
11#[macro_export]
12macro_rules! s {
13 ($($( $y:expr )=>*);*) => (
14 {
15 let mut vec: Vec<usize> = Vec::new();
16
17 $(
18 tuple![vec; $( $y ),*];
19 )*
20
21 vec
22 }
23 )
24}
25
26/// Adds to vector always two values, if only one value provided use zero instead
27///
28/// # Examples
29///
30/// ```
31/// #[macro_use] extern crate numas;
32///
33/// let mut vec: Vec<i32> = Vec::new();
34/// tuple![vec; 1, 5];
35/// assert_eq!(vec, vec![1, 5]);
36///
37/// tuple![vec; 5];
38/// assert_eq!(vec, vec![1, 5, 5, 0])
39/// ```
40#[macro_export]
41macro_rules! tuple {
42 ($vec:expr; $y:expr, $x:expr) => {
43 $vec.push($y);
44 $vec.push($x);
45 };
46
47 ($vec:expr; $y:expr) => {
48 $vec.push($y);
49 $vec.push(0);
50 };
51}