extracted the InclusiveInterval into a separate module

This commit is contained in:
ripytide
2023-12-27 13:26:50 +00:00
parent 05e2d147bd
commit 6de99232df
4 changed files with 77 additions and 73 deletions
+2 -2
View File
@@ -27,7 +27,7 @@ for some methods so if in doubt check a methods trait bounds.
## Example using an Inclusive-Exclusive range ## Example using an Inclusive-Exclusive range
```rust ```rust
use discrete_range_map::test_ranges::ie; use discrete_range_map::inclusive_interval::ie;
use discrete_range_map::DiscreteRangeMap; use discrete_range_map::DiscreteRangeMap;
let mut map = DiscreteRangeMap::new(); let mut map = DiscreteRangeMap::new();
@@ -45,7 +45,7 @@ assert_eq!(map.contains_point(5), true);
```rust ```rust
use std::ops::{Bound, RangeBounds}; use std::ops::{Bound, RangeBounds};
use discrete_range_map::test_ranges::ie; use discrete_range_map::inclusive_interval::ie;
use discrete_range_map::{ use discrete_range_map::{
DiscreteFinite, DiscreteRangeMap, InclusiveInterval, DiscreteFinite, DiscreteRangeMap, InclusiveInterval,
InclusiveRange, InclusiveRange,
+28 -63
View File
@@ -24,7 +24,6 @@ use core::cmp::Ordering;
use core::fmt::{self, Debug}; use core::fmt::{self, Debug};
use core::iter::once; use core::iter::once;
use core::marker::PhantomData; use core::marker::PhantomData;
use core::ops::{Bound, RangeBounds};
use btree_monstrousity::btree_map::{ use btree_monstrousity::btree_map::{
IntoIter as BTreeMapIntoIter, SearchBoundCustom, IntoIter as BTreeMapIntoIter, SearchBoundCustom,
@@ -37,7 +36,7 @@ use serde::ser::SerializeSeq;
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::utils::{cmp_point_with_range, cut_range, is_valid_range, overlaps}; use crate::utils::{cmp_point_with_range, cut_range, is_valid_range, overlaps};
use crate::DiscreteFinite; use crate::{DiscreteFinite, InclusiveInterval};
/// An ordered map of non-overlapping ranges based on [`BTreeMap`]. /// An ordered map of non-overlapping ranges based on [`BTreeMap`].
/// ///
@@ -54,7 +53,7 @@ use crate::DiscreteFinite;
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// // Make a map of ranges to booleans /// // Make a map of ranges to booleans
@@ -93,40 +92,6 @@ pub struct OverlapError<V> {
pub value: V, pub value: V,
} }
/// A compatibility type used in [`RangeType`] for allowing the library to
/// create the custom K type used in the map when necessary.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct InclusiveInterval<I> {
/// The start of the interval, inclusive.
pub start: I,
/// The end of the interval, inclusive.
pub end: I,
}
impl<I> RangeBounds<I> for InclusiveInterval<I>
where
I: PointType,
{
fn start_bound(&self) -> Bound<&I> {
Bound::Included(&self.start)
}
fn end_bound(&self) -> Bound<&I> {
Bound::Included(&self.end)
}
}
impl<I> InclusiveRange<I> for InclusiveInterval<I>
where
I: PointType,
{
fn start(&self) -> I {
self.start
}
fn end(&self) -> I {
self.end
}
}
/// The marker trait for valid point types, a blanket implementation is provided for all types /// The marker trait for valid point types, a blanket implementation is provided for all types
/// which implement this traits' super-traits so you shouln't need to implement this yourself. /// which implement this traits' super-traits so you shouln't need to implement this yourself.
pub trait PointType: Ord + Copy + DiscreteFinite {} pub trait PointType: Ord + Copy + DiscreteFinite {}
@@ -161,7 +126,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::{ie, ii}; /// use discrete_range_map::inclusive_interval::{ie, ii};
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::new(); /// let mut map = DiscreteRangeMap::new();
@@ -194,7 +159,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -241,7 +206,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -283,7 +248,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -306,7 +271,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// let mut map = /// let mut map =
/// DiscreteRangeMap::from_slice_strict([(ie(1, 4), false)]) /// DiscreteRangeMap::from_slice_strict([(ie(1, 4), false)])
@@ -327,7 +292,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -353,7 +318,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::{ie, iu}; /// use discrete_range_map::inclusive_interval::{ie, iu};
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -402,7 +367,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -466,7 +431,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::{ie, ii}; /// use discrete_range_map::inclusive_interval::{ie, ii};
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut base = DiscreteRangeMap::from_slice_strict([ /// let mut base = DiscreteRangeMap::from_slice_strict([
@@ -633,7 +598,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::{ie, iu}; /// use discrete_range_map::inclusive_interval::{ie, iu};
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -727,7 +692,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -765,7 +730,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::{DiscreteRangeMap, OverlapError}; /// use discrete_range_map::{DiscreteRangeMap, OverlapError};
/// ///
/// let mut map = DiscreteRangeMap::new(); /// let mut map = DiscreteRangeMap::new();
@@ -865,7 +830,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::{DiscreteRangeMap, OverlapError}; /// use discrete_range_map::{DiscreteRangeMap, OverlapError};
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -953,7 +918,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::{DiscreteRangeMap, OverlapError}; /// use discrete_range_map::{DiscreteRangeMap, OverlapError};
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -1054,7 +1019,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::{DiscreteRangeMap, OverlapError}; /// use discrete_range_map::{DiscreteRangeMap, OverlapError};
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -1127,7 +1092,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::{DiscreteRangeMap, OverlapError}; /// use discrete_range_map::{DiscreteRangeMap, OverlapError};
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -1215,7 +1180,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = /// let mut map =
@@ -1254,7 +1219,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -1288,7 +1253,7 @@ where
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let slice = /// let slice =
@@ -1332,7 +1297,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::new(); /// let mut map = DiscreteRangeMap::new();
@@ -1350,7 +1315,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::new(); /// let mut map = DiscreteRangeMap::new();
@@ -1368,7 +1333,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -1394,7 +1359,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let mut map = DiscreteRangeMap::from_slice_strict([ /// let mut map = DiscreteRangeMap::from_slice_strict([
@@ -1422,7 +1387,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// ///
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
@@ -1443,7 +1408,7 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
/// # Examples /// # Examples
/// ``` /// ```
/// use discrete_range_map::DiscreteRangeMap; /// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::test_ranges::ie; /// use discrete_range_map::inclusive_interval::ie;
/// ///
/// let map = DiscreteRangeMap::from_slice_strict([ /// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false), /// (ie(1, 4), false),
@@ -1713,7 +1678,7 @@ mod tests {
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use super::*; use super::*;
use crate::test_ranges::{ee, ei, ie, ii, iu, ue, ui, uu}; use crate::inclusive_interval::{ee, ei, ie, ii, iu, ue, ui, uu};
use crate::utils::{config, contains_point, Config, CutResult}; use crate::utils::{config, contains_point, Config, CutResult};
//only every other number to allow mathematical_overlapping_definition //only every other number to allow mathematical_overlapping_definition
@@ -17,10 +17,48 @@ You should have received a copy of the GNU Affero General Public License
along with discrete_range_map. If not, see <https://www.gnu.org/licenses/>. along with discrete_range_map. If not, see <https://www.gnu.org/licenses/>.
*/ */
//! A collection of helper functions for making [`InclusiveInterval`]s from `i8`'s used for testing //! A module containing [`InclusiveInterval`] and it's various constructor functions.
//! and example purposes.
use crate::{DiscreteFinite, InclusiveInterval}; use core::ops::{RangeBounds, Bound};
use serde::{Serialize, Deserialize};
use crate::{DiscreteFinite, PointType, InclusiveRange};
/// The interval type used throughout this crate both for the examples and
/// for use by library users if they don't wish to create their own
/// interval types.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct InclusiveInterval<I> {
/// The start of the interval, inclusive.
pub start: I,
/// The end of the interval, inclusive.
pub end: I,
}
impl<I> RangeBounds<I> for InclusiveInterval<I>
where
I: PointType,
{
fn start_bound(&self) -> Bound<&I> {
Bound::Included(&self.start)
}
fn end_bound(&self) -> Bound<&I> {
Bound::Included(&self.end)
}
}
impl<I> InclusiveRange<I> for InclusiveInterval<I>
where
I: PointType,
{
fn start(&self) -> I {
self.start
}
fn end(&self) -> I {
self.end
}
}
/// An unbounded-unbounded interval /// An unbounded-unbounded interval
pub fn uu() -> InclusiveInterval<i8> { pub fn uu() -> InclusiveInterval<i8> {
+6 -5
View File
@@ -35,7 +35,7 @@ along with discrete_range_map. If not, see <https://www.gnu.org/licenses/>.
//! ## Example using an Inclusive-Exclusive range //! ## Example using an Inclusive-Exclusive range
//! //!
//! ```rust //! ```rust
//! use discrete_range_map::test_ranges::ie; //! use discrete_range_map::inclusive_interval::ie;
//! use discrete_range_map::DiscreteRangeMap; //! use discrete_range_map::DiscreteRangeMap;
//! //!
//! let mut map = DiscreteRangeMap::new(); //! let mut map = DiscreteRangeMap::new();
@@ -53,7 +53,7 @@ along with discrete_range_map. If not, see <https://www.gnu.org/licenses/>.
//! ```rust //! ```rust
//! use std::ops::{Bound, RangeBounds}; //! use std::ops::{Bound, RangeBounds};
//! //!
//! use discrete_range_map::test_ranges::ie; //! use discrete_range_map::inclusive_interval::ie;
//! use discrete_range_map::{ //! use discrete_range_map::{
//! DiscreteFinite, DiscreteRangeMap, InclusiveInterval, //! DiscreteFinite, DiscreteRangeMap, InclusiveInterval,
//! InclusiveRange, //! InclusiveRange,
@@ -384,11 +384,12 @@ pub(crate) mod utils;
pub mod discrete_finite; pub mod discrete_finite;
pub mod discrete_range_map; pub mod discrete_range_map;
pub mod discrete_range_set; pub mod discrete_range_set;
pub mod test_ranges; pub mod inclusive_interval;
pub use crate::discrete_finite::DiscreteFinite; pub use crate::discrete_finite::DiscreteFinite;
pub use crate::discrete_range_map::{ pub use crate::discrete_range_map::{
DiscreteRangeMap, InclusiveInterval, InclusiveRange, OverlapError, DiscreteRangeMap, InclusiveRange, OverlapError, PointType, RangeType,
PointType, RangeType,
}; };
pub use crate::discrete_range_set::DiscreteRangeSet; pub use crate::discrete_range_set::DiscreteRangeSet;
pub use crate::inclusive_interval::InclusiveInterval;