1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
(deny(missing_doc))
//! Useful macro for doing repetetive operations in batch
#[macro_export]
/// Negate all passed variables
/// # Example
///  ```
/// use many_op::negate;
/// let mut testvals = [true, false, true];
/// negate! {
///     testvals[0];
///     testvals[2];
/// };
/// assert_eq!(testvals, [false, false, false]);
/// ```
macro_rules! negate {
    ($($e:expr;)*) => {
        $crate::do_for!(unary !, $($e;)*)
    };
}
#[macro_export]
/// Do an operation for all following variables
/// # Examples
///  ```
/// use many_op::do_for;
/// let mut testvals = [true, true, true];
/// do_for! {unary !,
///     testvals[0];
///     testvals[2];
/// };
/// assert_eq!(testvals, [false, true, false]);
/// ```
/// ```
/// use many_op::do_for;
/// let mut testvals = [true, false, true];
/// do_for! {binary ^, testvals[0];testvals[2];};
/// assert_eq!(testvals, [false, false, false]);
/// ```
/// ```
/// use many_op::do_for;
/// let mut testvals = [1, 2, 3];
/// do_for! {assign +=, testvals[0]; testvals[2];}
/// assert_eq!(testvals, [2, 2, 6])
/// ```
/// ```
/// use many_op::do_for;
/// let mut testvals = [1, 2, 3];
/// do_for! {binary +, testvals[0] => testvals[1]; testvals[2] => testvals[0];}
/// assert_eq!(testvals, [3, 2, 6])
/// ```
macro_rules! do_for {
    (binary $op:tt, $($i:expr;)*) => {
        $($i = $i $op $i);*
    };
    (binary $op:tt, $($i:expr => $e:expr;)*) => {
        $($i = $i $op $e);*
    };
    (unary $op:tt, $($i:expr;)*) => {
        $($i = $op $i);*
    };
    (assign $a_op:tt, $($i:expr;)*) => {
        $($i $a_op $i);*
    };
}
mod tests {
    #[test]
    fn binary_two_ops() {
        let mut testvals = [1, 2, 3];
        do_for! {binary +, testvals[0] => testvals[1]; testvals[2] => testvals[0];}
        assert_eq!(testvals, [3, 2, 6])
    }
}