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 Traversal {
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 Linear: Traversal {
#[must_use]
fn pos_to_index(pos: Pos<usize>, width: usize) -> usize;
#[must_use]
fn index_to_pos(index: usize, width: usize) -> Pos<usize>;
#[must_use]
fn len_aligned(size: Size) -> usize;
#[must_use]
fn rect_to_range(size: Size, rect: Rect<usize>) -> Option<Range<usize>>;
fn slice_rect_aligned<E>(slice: &[E], size: Size, rect: Rect<usize>) -> Option<&[E]>;
fn slice_rect_aligned_mut<E>(
slice: &mut [E],
size: Size,
rect: Rect<usize>,
) -> 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];
}