Skip to content

Instantly share code, notes, and snippets.

@farazshaikh
Created August 11, 2021 06:19
Show Gist options
  • Save farazshaikh/e2a3a1e81727d2aacd77f2f2e6bf976d to your computer and use it in GitHub Desktop.
Save farazshaikh/e2a3a1e81727d2aacd77f2f2e6bf976d to your computer and use it in GitHub Desktop.
2D Slice example in Rust.
std::fmt::Display;
type TwoDSlice<'a, T> = [&'a mut [T]];
fn print2dslice<T: Display>(two_d_slice: &Box<TwoDSlice<T>>) {
for (row_idx, row) in two_d_slice.iter().enumerate() {
println!("");
for (col_idx, elt) in row.iter().enumerate() {
print!("[{} {} {}] ", row_idx, col_idx, elt);
}
}
}
fn assignchar_2dslice<T: Display + From<u8>>(two_d_slice: &mut Box<TwoDSlice<T>>) {
let mut i = 0;
for row in two_d_slice.iter_mut() {
for elt in row.iter_mut() {
*elt = T::from('A' as u8 + i as u8);
i = i + 1;
}
}
}
fn vector_to_slice<T>(mem: &mut Vec<T>, rows: usize, cols: usize) -> Option<Box<TwoDSlice<T>>> {
if mem.len() < rows * cols {
None
} else {
let mut slice = mem.as_mut_slice();
let mut vec_rows = Vec::with_capacity(rows);
for _i in 0..rows {
let (row, rem) = slice.split_at_mut(cols);
vec_rows.push(row);
slice = rem;
}
Some(vec_rows.into_boxed_slice())
}
}
fn main() {
let mut mem = vec!['a'; 2 * 3];
let mut two_d_slice = vector_to_slice(&mut mem, 2, 3).unwrap();
println!("Initialized 2D Array");
print2dslice(&two_d_slice);
println!("\nRe-Assigning");
assignchar_2dslice(&mut two_d_slice);
print2dslice(&two_d_slice);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment