# HG changeset patch # User unc0rr # Date 1539544412 -7200 # Node ID fa9f93393e9c7fdbebdfc19dbdb6f8b75595f53f # Parent 6c8d4e140f27e67006b8ba0a8e307d8712d7b025 Implement vec2d library to use for land arrays in the future diff -r 6c8d4e140f27 -r fa9f93393e9c rust/vec2d/Cargo.toml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/vec2d/Cargo.toml Sun Oct 14 21:13:32 2018 +0200 @@ -0,0 +1,6 @@ +[package] +name = "vec2d" +version = "0.1.0" +authors = ["Andrey Korotaev "] + +[dependencies] diff -r 6c8d4e140f27 -r fa9f93393e9c rust/vec2d/src/lib.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/vec2d/src/lib.rs Sun Oct 14 21:13:32 2018 +0200 @@ -0,0 +1,77 @@ +use std::iter; +use std::ops::{Index, IndexMut}; + +struct Vec2D { + data: Vec, + width: usize, + height: usize, +} + +impl Index for Vec2D { + type Output = [T]; + + #[inline] + fn index(&self, row: usize) -> &[T] { + debug_assert!(row < self.height); + + let pos = row * self.width; + + &self.data[pos..pos + self.width] + } +} + +impl IndexMut for Vec2D { + #[inline] + fn index_mut(&mut self, row: usize) -> &mut [T] { + debug_assert!(row < self.height); + + let pos = row * self.width; + + &mut self.data[pos..pos + self.width] + } +} + +impl Vec2D { + pub fn new(width: usize, height: usize, value: T) -> Self { + let mut vec = Self { + data: Vec::new(), + width, + height, + }; + + vec.data.extend(iter::repeat(value).take(width * height)); + + vec + } + + #[inline] + pub fn width(&self) -> usize { + self.width + } + + #[inline] + pub fn height(&self) -> usize { + self.height + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn basics() { + let mut v: Vec2D = Vec2D::new(2, 3, 0xff); + + assert_eq!(v.width, 2); + assert_eq!(v.height, 3); + + assert_eq!(v[0][0], 0xff); + assert_eq!(v[2][1], 0xff); + + v[2][1] = 0; + + assert_eq!(v[2][0], 0xff); + assert_eq!(v[2][1], 0); + } +}