A Rust macro for easily assigning to slices
you can set the entire contents of the slice to whatever you want ```Rust let slice = &mut [0; 3] as &mut [i32]; // this is to simulate having only a slice without knowning its size
setslice! { slice = 1, 2, 3; // this list is internally counted and converted to an array at compile-time } asserteq!(slice, &[1, 2, 3]);
// ... or you can only set parts of the slice let slice = &mut [0; 5] as &mut [i32];
setslice! { slice[..3] = 1, 2, 3; } asserteq!(slice, &[1, 2, 3, 0, 0]); ```
you can also do multiple assigns in one macro call ```Rust let slice = &mut [0; 5] as &mut [i32];
setslice! { slice[..2] = 1, 2; slice[3..] = 4, 5; } asserteq!(slice, &[1, 2, 0, 4, 5]); ```
You can use expressions to set to the slices, either as values to be moved in, or as references if they are move values you must specify a const expression size in parentheses ```Rust let slice = &mut [0; 5] as &mut [i32]; let array = [1, 2]; let vec = vec![3, 4];
setslice! { slice[..2]: (2) = array; slice[3..]: (2) = vec; // vec is moved into setslice } println!("array = {:?}", array); // fine, array is a copy type // println!("vec = {:?}", vec); // compile time error, vec is moved into the setslice and dropped asserteq!(slice, &[1, 2, 0, 3, 4]); ```
but you don't have to move into set_slice if you get a reference with references you must specify if the contents should be copied or cloned but they must derive Copy or Clone respectively ```Rust let slice = &mut [0; 5] as &mut [i32]; let array = [1, 2]; let vec = vec![3, 4];
setslice! { slice[..2] = copy &array; // array is NOT moved into setslice, and contents are copied slice[3..] = copy &vec; // vec is NOT moved into setslice, and contents are copied } println!("array = {:?}", array); // this is fine, array was borrowed println!("vec = {:?}", vec); // this is fine, vec was borrowed asserteq!(slice, &[1, 2, 0, 3, 4]); ```
```Rust
enum A { Zero, One }; let mut slice: [A; 5] = [A::Zero, A::Zero, A::Zero, A::Zero, A::Zero]; let slice = &mut slice as &mut [A]; let array = [A::One, A::One]; let vec = vec![A::One; 2];
setslice! { slice[..2] = clone &array; // array is NOT moved into setslice, and contents are cloned slice[3..] = clone &vec; // vec is NOT moved into setslice, and contents are cloned // slice[3..] = copy &vec; // this won't work because 'A' is not a copy type } println!("array = {:?}", array); // this is fine, array was borrowed println!("vec = {:?}", vec); // this is fine, vec was borrowed asserteq!(slice, &[A::One, A::One, A::Zero, A::One, A::One]); ```
these ranges can be mixed and matched with the other sub-sections ```Rust let slice = &mut [0; 3] as &mut [i32]; let init = 1; let end = 2;
set_slice! { slice = 1, 2, 3; slice[..] = 1, 2, 3; slice[0..] = 1, 2, 3; slice[..3] = 1, 2, 3; slice[0..3] = 1, 2, 3; slice[0..2] = 1, 2; slice[1..2] = 2; slice[index..2] = 2; slice[1..end] = 2; slice[index..end] = 2; slice[index..] = 2, 3; slice[..end] = 1, 2; } ```
```Rust let slice = &mut [0; 3] as &mut [i32]; let vec_move = vec![1, 2, 3];
setslice! { slice = vecmove; } let vec_move = vec![1, 2, 3];
setslice! { slice[..] = vecmove; } let vec_move = vec![1, 2];
setslice! { slice[..2] = vecmove; } ```
```Rust let slice = &mut [0; 3] as &mut [i32]; let array = [1, 2, 3]; let vec = vec![1, 2, 3];
// only works if slice implements copy set_slice! { slice = copy &vec; slice = copy &array; slice[..2] = copy &vec[1..]; slice[..2] = copy &array[1..]; }
// only works if slice implements clone set_slice! { slice = clone &vec; slice = clone &array; slice[..2] = clone &vec[1..]; slice[..2] = clone &array[1..]; } ```