devela/num/geom/metric/
region.rs

1// devela::num::geom::metric::distance
2//
3//! Defines [`Region`], [`RegionStrided`].
4//
5
6use crate::{Extent, Position, Stride};
7
8#[doc = crate::TAG_GEOM!()]
9/// A [`Position`]ed [`Extent`].
10#[must_use]
11#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub struct Region<T, const D: usize> {
13    ///
14    pub pos: Position<T, D>,
15    ///
16    pub size: Extent<T, D>,
17}
18
19#[doc = crate::TAG_GEOM!()]
20/// A [`Stride`]d [`Region`] defining structured traversal.
21///
22/// `RegionStrided` extends `Region` by adding a stride, allowing
23/// structured access to subregions or non-contiguous patterns.
24///
25/// - Used in **grids, datasets, and memory layouts**.
26/// - Supports **efficient structured stepping** (e.g. row-major iteration).
27#[must_use]
28#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
29pub struct RegionStrided<T, const D: usize> {
30    /// The positioned extent.
31    pub region: Region<T, D>,
32    /// The step size per dimension.
33    pub stride: Stride<T, D>,
34}
35
36/* impls */
37
38#[rustfmt::skip]
39impl<T, const D: usize> Region<T, D> {
40    /// Returns a new `Region` from a `pos`ition and a `size`.
41    pub const fn new(pos: Position<T, D>, size: Extent<T, D>) -> Self { Self { pos, size } }
42
43    ///
44    pub fn position(&self) -> Position<T, D> where T: Clone { self.pos.clone() }
45    ///
46    pub fn extent(&self) -> Extent<T, D> where T: Clone { self.size.clone() }
47}
48impl<T, const D: usize> From<(Position<T, D>, Extent<T, D>)> for Region<T, D> {
49    fn from(from: (Position<T, D>, Extent<T, D>)) -> Self {
50        Self::new(from.0, from.1)
51    }
52}
53impl<T, const D: usize> From<(Extent<T, D>, Position<T, D>)> for Region<T, D> {
54    fn from(from: (Extent<T, D>, Position<T, D>)) -> Self {
55        Self::new(from.1, from.0)
56    }
57}