#![doc = include_str!("../README.md")]
mod boundary;
mod impls;
mod index;
mod map;
mod resize;
mod storage;
mod util;
mod zip;
use std::fmt::Debug;
#[cfg(feature = "serde")]
mod serde;
pub use boundary::Boundary;
use boundary::IntoBoundary;
use storage::{Array2dStorage, Array2dStorageOwned};
pub use zip::Zip;
pub mod traits {
pub use crate::boundary::IntoBoundary;
pub use crate::index::Array2dIndexing;
pub use crate::storage::{Array2dStorage, Array2dStorageMut, Array2dStorageOwned};
pub use crate::zip::GenericArray2dRef;
}
#[derive(Clone, Copy)]
pub struct GenericArray2d<S: Array2dStorage> {
data: S,
boundary: Boundary,
pitch: usize,
}
impl<S: Array2dStorage<Item: Debug>> Debug for GenericArray2d<S> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("GenericArray2d")
.field("boundary", &self.boundary)
.field("data", &self.data.slice())
.field("pitch", &self.pitch)
.finish()
}
}
pub type Array2d<T> = GenericArray2d<Vec<T>>;
pub type Array2dRef<'t, T> = GenericArray2d<&'t [T]>;
pub type Array2dMut<'t, T> = GenericArray2d<&'t mut [T]>;
impl<T> Default for Array2dRef<'_, T> {
fn default() -> Self {
Array2dRef {
data: &[],
boundary: Boundary::EMPTY,
pitch: 0,
}
}
}
impl<T> Default for Array2dMut<'_, T> {
fn default() -> Self {
Array2dMut {
data: &mut [],
boundary: Boundary::EMPTY,
pitch: 0,
}
}
}
impl<T: Default + Array2dStorageOwned> Default for GenericArray2d<T> {
fn default() -> Self {
GenericArray2d {
data: Default::default(),
boundary: Boundary::EMPTY,
pitch: 0,
}
}
}
impl<S: Array2dStorage> IntoBoundary for &GenericArray2d<S> {
fn into_boundary(self) -> Boundary {
self.boundary
}
}