add Vec2 to lib.rs
This commit is contained in:
parent
5bcc40b030
commit
6cc7cb8752
@ -1,6 +1,7 @@
|
|||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
use std::ops::{Index, IndexMut};
|
||||||
|
|
||||||
use color_eyre::{eyre};
|
use color_eyre::{eyre};
|
||||||
use eyre::eyre;
|
use eyre::eyre;
|
||||||
@ -69,3 +70,52 @@ pub trait IterExt: Iterator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<I: Iterator> IterExt for I {}
|
impl<I: Iterator> IterExt for I {}
|
||||||
|
|
||||||
|
|
||||||
|
// 2d container, functions kind of like a "vec of vecs" but all data is stored in a single vec for memory contiguity
|
||||||
|
pub struct Vec2<T> {
|
||||||
|
data: Vec<T>,
|
||||||
|
columns: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<T> Vec2<T> {
|
||||||
|
fn new(columns: usize) -> Vec2<T> {
|
||||||
|
Vec2 {data: Vec::<T>::new(), columns}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn push<S: IntoIterator<Item=T>>(&mut self, row: S) {
|
||||||
|
self.data.extend(row.into_iter());
|
||||||
|
}
|
||||||
|
|
||||||
|
// This works just fine, for some reason
|
||||||
|
fn rows(&self) -> impl Iterator<Item=&[T]> {
|
||||||
|
self.data.chunks_exact(self.columns)
|
||||||
|
}
|
||||||
|
|
||||||
|
// But this doesn't?
|
||||||
|
fn rows_mut(&mut self) -> impl Iterator<Item=&mut [T]> {
|
||||||
|
self.data.chunks_exact_mut(self.columns)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn values(&self) -> impl Iterator<Item=&T> {
|
||||||
|
self.data.iter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<T> Index<usize> for Vec2<T> {
|
||||||
|
type Output = [T];
|
||||||
|
fn index(&self, index: usize) -> &Self::Output {
|
||||||
|
let start = self.columns * index;
|
||||||
|
&self.data[start..(start + self.columns)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<T> IndexMut<usize> for Vec2<T> {
|
||||||
|
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
|
||||||
|
let start = self.columns * index;
|
||||||
|
&mut self.data[start..(start + self.columns)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user