use core::ops::Range;
use crate::{Pos, Rect, Size, int::Int};
mod block;
pub use block::Block;
mod col_major;
pub use col_major::ColumnMajor;
mod row_major;
pub use row_major::RowMajor;
pub trait Layout {
fn iter_pos<T: Int>(rect: Rect<T>) -> impl Iterator<Item = Pos<T>>;
fn iter_rect<T: Int>(rect: Rect<T>, size: Size) -> impl Iterator<Item = Rect<T>>;
}
pub trait LinearLayout: Layout {
#[must_use]
fn pos_to_index<T: Int>(pos: Pos<T>, stride: usize) -> usize;
#[must_use]
fn index_to_pos<T: Int>(index: usize, stride: usize) -> Pos<T>;
#[must_use]
fn checked_index_to_pos<T: Int>(index: usize, stride: usize) -> Option<Pos<T>> {
let pos = Self::index_to_pos::<usize>(index, stride);
Some(Pos::new(
T::checked_from_usize(pos.x)?,
T::checked_from_usize(pos.y)?,
))
}
#[must_use]
fn len_aligned(size: Size) -> usize;
#[must_use]
fn rect_to_range<T: Int>(size: Size<T>, rect: Rect<T>) -> Option<Range<usize>>;
#[must_use]
fn slice_rect_aligned<T: Int, E>(slice: &[E], size: Size<T>, rect: Rect<T>) -> Option<&[E]>;
#[must_use]
fn slice_rect_aligned_mut<T: Int, E>(
slice: &mut [E],
size: Size<T>,
rect: Rect<T>,
) -> Option<&mut [E]>;
#[must_use]
fn slice_aligned<E>(slice: &[E], size: Size, axis: usize) -> &[E];
#[must_use]
fn slice_aligned_mut<E>(slice: &mut [E], size: Size, axis: usize) -> &mut [E];
}