rust/vec2d/src/lib.rs
changeset 13916 cd437d76978a
parent 13915 f64790b2a725
child 13924 a140f28decc4
equal deleted inserted replaced
13915:f64790b2a725 13916:cd437d76978a
     1 use std::iter;
       
     2 use std::ops::{Index, IndexMut};
     1 use std::ops::{Index, IndexMut};
       
     2 use std::slice::SliceIndex;
     3 
     3 
     4 struct Vec2D<T> {
     4 pub struct Vec2D<T> {
     5     data: Vec<T>,
     5     data: Vec<T>,
     6     width: usize,
     6     width: usize,
     7     height: usize,
     7     height: usize,
     8 }
     8 }
     9 
     9 
    47 
    47 
    48     #[inline]
    48     #[inline]
    49     pub fn height(&self) -> usize {
    49     pub fn height(&self) -> usize {
    50         self.height
    50         self.height
    51     }
    51     }
       
    52 
       
    53     #[inline]
       
    54     pub fn get_mut(&mut self, row: usize, column: usize) -> Option<&mut <usize as SliceIndex<[T]>>::Output> {
       
    55         self.data.get_mut(row * self.width + column)
       
    56     }
    52 }
    57 }
    53 
    58 
    54 #[cfg(test)]
    59 #[cfg(test)]
    55 mod tests {
    60 mod tests {
    56     use super::*;
    61     use super::*;
    67 
    72 
    68         v[2][1] = 0;
    73         v[2][1] = 0;
    69 
    74 
    70         assert_eq!(v[2][0], 0xff);
    75         assert_eq!(v[2][0], 0xff);
    71         assert_eq!(v[2][1], 0);
    76         assert_eq!(v[2][1], 0);
       
    77 
       
    78         v.get_mut(2, 1).map(|v| *v = 1);
       
    79         assert_eq!(v[2][1], 1);
       
    80 
       
    81         assert_eq!(v.get_mut(2, 2), None);
    72     }
    82     }
    73 }
    83 }