//! Archived versions of `ops` types. use core::{ cmp, fmt, ops::{Bound, RangeBounds}, }; /// An archived [`Range`](::core::ops::Range). #[derive(Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))] #[cfg_attr(feature = "strict", repr(C))] pub struct ArchivedRange { /// The lower bound of the range (inclusive). pub start: T, /// The upper bound of the range (inclusive). pub end: T, } impl fmt::Debug for ArchivedRange { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.start.fmt(fmt)?; write!(fmt, "..")?; self.end.fmt(fmt)?; Ok(()) } } impl> ArchivedRange { /// Returns `true` if `item` is contained in the range. #[inline] pub fn contains(&self, item: &U) -> bool where T: PartialOrd, U: PartialOrd + ?Sized, { >::contains(self, item) } /// Returns `true` if the range contains no items. #[inline] pub fn is_empty(&self) -> bool { match self.start.partial_cmp(&self.end) { None | Some(cmp::Ordering::Greater) | Some(cmp::Ordering::Equal) => true, Some(cmp::Ordering::Less) => false, } } } impl RangeBounds for ArchivedRange { #[inline] fn start_bound(&self) -> Bound<&T> { Bound::Included(&self.start) } #[inline] fn end_bound(&self) -> Bound<&T> { Bound::Excluded(&self.end) } } // RangeInclusive /// An archived [`RangeInclusive`](::core::ops::RangeInclusive). #[derive(Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))] #[cfg_attr(feature = "strict", repr(C))] pub struct ArchivedRangeInclusive { /// The lower bound of the range (inclusive). pub start: T, /// The upper bound of the range (inclusive). pub end: T, } impl fmt::Debug for ArchivedRangeInclusive { #[inline] fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.start.fmt(fmt)?; write!(fmt, "..=")?; self.end.fmt(fmt)?; Ok(()) } } impl> ArchivedRangeInclusive { /// Returns `true` if `item` is contained in the range. #[inline] pub fn contains(&self, item: &U) -> bool where T: PartialOrd, U: PartialOrd + ?Sized, { >::contains(self, item) } /// Returns `true` if the range contains no items. #[inline] pub fn is_empty(&self) -> bool { match self.start.partial_cmp(&self.end) { None | Some(cmp::Ordering::Greater) => true, Some(cmp::Ordering::Less) | Some(cmp::Ordering::Equal) => false, } } } impl RangeBounds for ArchivedRangeInclusive { #[inline] fn start_bound(&self) -> Bound<&T> { Bound::Included(&self.start) } #[inline] fn end_bound(&self) -> Bound<&T> { Bound::Included(&self.end) } } /// An archived [`RangeFrom`](::core::ops::RangeFrom). #[derive(Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))] #[cfg_attr(feature = "strict", repr(C))] pub struct ArchivedRangeFrom { /// The lower bound of the range (inclusive). pub start: T, } impl fmt::Debug for ArchivedRangeFrom { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { self.start.fmt(fmt)?; write!(fmt, "..")?; Ok(()) } } impl> ArchivedRangeFrom { /// Returns `true` if `item` is contained in the range. #[inline] pub fn contains(&self, item: &U) -> bool where T: PartialOrd, U: ?Sized + PartialOrd, { >::contains(self, item) } } impl RangeBounds for ArchivedRangeFrom { #[inline] fn start_bound(&self) -> Bound<&T> { Bound::Included(&self.start) } #[inline] fn end_bound(&self) -> Bound<&T> { Bound::Unbounded } } /// An archived [`RangeTo`](::core::ops::RangeTo). #[derive(Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))] #[cfg_attr(feature = "strict", repr(C))] pub struct ArchivedRangeTo { /// The upper bound of the range (exclusive). pub end: T, } impl fmt::Debug for ArchivedRangeTo { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "..")?; self.end.fmt(fmt)?; Ok(()) } } impl> ArchivedRangeTo { /// Returns `true` if `item` is contained in the range. #[inline] pub fn contains(&self, item: &U) -> bool where T: PartialOrd, U: ?Sized + PartialOrd, { >::contains(self, item) } } impl RangeBounds for ArchivedRangeTo { #[inline] fn start_bound(&self) -> Bound<&T> { Bound::Unbounded } #[inline] fn end_bound(&self) -> Bound<&T> { Bound::Excluded(&self.end) } } /// An archived [`RangeToInclusive`](::core::ops::RangeToInclusive). #[derive(Clone, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "validation", derive(bytecheck::CheckBytes))] #[cfg_attr(feature = "strict", repr(C))] pub struct ArchivedRangeToInclusive { /// The upper bound of the range (inclusive). pub end: T, } impl fmt::Debug for ArchivedRangeToInclusive { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "..=")?; self.end.fmt(fmt)?; Ok(()) } } impl> ArchivedRangeToInclusive { /// Returns `true` if `item` is contained in the range. #[inline] pub fn contains(&self, item: &U) -> bool where T: PartialOrd, U: ?Sized + PartialOrd, { >::contains(self, item) } } impl RangeBounds for ArchivedRangeToInclusive { #[inline] fn start_bound(&self) -> Bound<&T> { Bound::Unbounded } #[inline] fn end_bound(&self) -> Bound<&T> { Bound::Included(&self.end) } }