#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum ShapeExtent<D> {
Exact(D),
UpperBound(D),
Unknown,
}
impl<D> ShapeExtent<D> {
pub fn exact(dim: D) -> Self {
Self::Exact(dim)
}
pub fn upper_bound(dim: D) -> Self {
Self::UpperBound(dim)
}
pub fn unknown() -> Self {
Self::Unknown
}
pub fn is_exact(&self) -> bool {
matches!(self, Self::Exact(_))
}
pub fn as_exact(&self) -> Option<&D> {
match self {
Self::Exact(dim) => Some(dim),
Self::UpperBound(_) | Self::Unknown => None,
}
}
pub fn bound_expr(&self) -> Option<&D> {
match self {
Self::Exact(dim) | Self::UpperBound(dim) => Some(dim),
Self::Unknown => None,
}
}
pub fn map<E>(self, f: impl FnOnce(D) -> E) -> ShapeExtent<E> {
match self {
Self::Exact(dim) => ShapeExtent::Exact(f(dim)),
Self::UpperBound(dim) => ShapeExtent::UpperBound(f(dim)),
Self::Unknown => ShapeExtent::Unknown,
}
}
}