extern crate minivec;
use crate::Numeric;
#[derive(Default)]
pub struct Image<T>
where
T: Numeric,
{
pub(super) r: minivec::MiniVec<T>,
pub(super) g: minivec::MiniVec<T>,
pub(super) b: minivec::MiniVec<T>,
pub(super) h: usize,
pub(super) w: usize,
}
impl<T> Image<T>
where
T: Numeric,
{
#[must_use]
pub fn new() -> Self {
<Self as std::default::Default>::default()
}
#[must_use]
pub fn r(&self) -> &[T] {
self.r.as_slice()
}
#[must_use]
pub fn g(&self) -> &[T] {
self.g.as_slice()
}
#[must_use]
pub fn b(&self) -> &[T] {
self.b.as_slice()
}
#[must_use]
pub fn width(&self) -> usize {
self.w
}
#[must_use]
pub fn height(&self) -> usize {
self.h
}
#[must_use]
pub fn rgb_iter(&self) -> crate::rgb::Iter<'_, T> {
crate::rgb::Iter::new(&self.r, &self.g, &self.b)
}
}
pub struct Iter<'a, N>
where
N: crate::Numeric,
{
r: std::slice::Iter<'a, N>,
g: std::slice::Iter<'a, N>,
b: std::slice::Iter<'a, N>,
}
impl<'a, N> Iter<'a, N>
where
N: crate::Numeric,
{
pub fn new<R>(r: &'a R, g: &'a R, b: &'a R) -> Self
where
R: std::convert::AsRef<[N]>,
{
Self {
r: r.as_ref().iter(),
g: g.as_ref().iter(),
b: b.as_ref().iter(),
}
}
}
impl<'a, N> std::iter::Iterator for Iter<'a, N>
where
N: crate::Numeric,
{
type Item = [N; 3];
fn next(&mut self) -> Option<Self::Item> {
match (self.r.next(), self.g.next(), self.b.next()) {
(Some(r), Some(g), Some(b)) => Some([*r, *g, *b]),
_ => None,
}
}
}