pub struct SquareMatrix<T> {
size: usize,
data: Vec<Vec<Option<T>>>,
}
impl<T: Clone> SquareMatrix<T> {
pub fn new(size: usize) -> Self {
if size == 0 {
panic!("Matrix size must be at least 1, got {}", size);
}
let mut row: Vec<Option<T>> = Vec::new();
row.resize(size, None);
let mut data: Vec<Vec<Option<T>>> = Vec::new();
data.resize(size, row);
Self { size, data }
}
pub fn size(&self) -> usize {
self.size
}
pub fn get(&self, row: usize, column: usize) -> Option<&T> {
if let Some(row) = self.data.get(row) {
if let Some(entry) = row.get(column) {
return entry.as_ref();
}
}
None
}
pub fn set(&mut self, row: usize, column: usize, value: T) {
if let Some(row) = self.data.get_mut(row) {
if let Some(entry) = row.get_mut(column) {
*entry = Some(value.to_owned());
}
}
}
pub fn set_all_to(&mut self, value: &T) {
for row in self.data.iter_mut() {
for entry in row.iter_mut() {
*entry = Some(value.clone());
}
}
}
}
pub struct Vector<T> {
size: usize,
data: Vec<Option<T>>,
}
impl<T: Clone> Vector<T> {
pub fn new(size: usize) -> Self {
if size == 0 {
panic!("Vector size must be at least 1, got {}", size);
}
let mut data: Vec<Option<T>> = Vec::new();
data.resize(size, None);
Self { size, data }
}
pub fn size(&self) -> usize {
self.size
}
pub fn get(&self, position: usize) -> Option<&T> {
self.data.get(position)?.as_ref()
}
pub fn set(&mut self, position: usize, value: T) {
if let Some(entry) = self.data.get_mut(position) {
*entry = Some(value.to_owned());
}
}
pub fn set_all_to(&mut self, value: &T) {
for entry in self.data.iter_mut() {
*entry = Some(value.clone());
}
}
}