diff --git a/src/discrete_bounds.rs b/src/discrete_bounds.rs
index 7b5719c..99757d3 100644
--- a/src/discrete_bounds.rs
+++ b/src/discrete_bounds.rs
@@ -19,6 +19,8 @@ along with range_bounds_map. If not, see .
use std::ops::{Bound, RangeBounds};
+use crate::range_bounds_map::DiscreteRange;
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DiscreteBounds {
//both are always included
@@ -34,3 +36,13 @@ impl RangeBounds for DiscreteBounds {
Bound::Included(&self.end)
}
}
+
+impl DiscreteRange for DiscreteBounds {
+ fn start(&self) -> I {
+ self.start
+ }
+
+ fn end(&self) -> I {
+ self.end
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 5fe1b2c..3c6b993 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -227,7 +227,5 @@ pub mod range_bounds_map;
pub mod range_bounds_set;
pub use crate::discrete_bounds::DiscreteBounds;
-pub use crate::range_bounds_map::{
- OverlapError, OverlapOrTryFromDiscreteBoundsError, RangeBoundsMap,
-};
+pub use crate::range_bounds_map::{OverlapError, RangeBoundsMap};
pub use crate::range_bounds_set::RangeBoundsSet;
diff --git a/src/range_bounds_map.rs b/src/range_bounds_map.rs
index ce1e9ee..cac5ac7 100644
--- a/src/range_bounds_map.rs
+++ b/src/range_bounds_map.rs
@@ -21,7 +21,6 @@ use std::cmp::Ordering;
use std::fmt::{self, Debug};
use std::iter::once;
use std::marker::PhantomData;
-use std::ops::RangeBounds;
use btree_monstrousity::btree_map::{IntoIter as BTreeMapIntoIter, SearchBoundCustom};
use btree_monstrousity::BTreeMap;
@@ -611,9 +610,9 @@ where
.copied();
if let Some(left) = left_overlapping && let Some(right) = right_overlapping && left.start() == right.start() {
- Ok(Either::Left(self.cut_single_overlapping(range, left)?))
+ Either::Left(self.cut_single_overlapping(range, left))
} else {
- Ok(Either::Right(self.cut_non_single_overlapping(range, left_overlapping, right_overlapping)?))
+ Either::Right(self.cut_non_single_overlapping(range, left_overlapping, right_overlapping))
}
}
fn cut_single_overlapping(
@@ -630,11 +629,11 @@ where
let cut_result = cut_range(single_overlapping_range, range);
let returning_before_cut = match cut_result.before_cut {
- Some(before_cut) => Some(K::try_from_discrete_bounds(before_cut)?),
+ Some(before_cut) => Some(K::from(before_cut)),
None => None,
};
let returning_after_cut = match cut_result.after_cut {
- Some(after_cut) => Some(K::try_from_discrete_bounds(after_cut)?),
+ Some(after_cut) => Some(K::from(after_cut)),
None => None,
};
@@ -647,7 +646,7 @@ where
self.insert_unchecked(after, value.clone());
}
- Ok(once((cut_result.inside_cut.unwrap(), value)))
+ once((cut_result.inside_cut.unwrap(), value))
}
fn cut_non_single_overlapping<'a, Q>(
&'a mut self,
@@ -668,7 +667,7 @@ where
Some((
match cut_result.before_cut {
- Some(before_cut) => Some(K::try_from_discrete_bounds(before_cut)?),
+ Some(before_cut) => Some(K::from(before_cut)),
None => None,
},
cut_result.inside_cut.unwrap(),
@@ -682,7 +681,7 @@ where
Some((
match cut_result.after_cut {
- Some(after_cut) => Some(K::try_from_discrete_bounds(after_cut)?),
+ Some(after_cut) => Some(K::from(after_cut)),
None => None,
},
cut_result.inside_cut.unwrap(),
@@ -709,18 +708,18 @@ where
let keeping_after_entry = after_config
.map(|(_, keeping_after_entry)| (keeping_after_entry, after_value.unwrap()));
- return Ok(keeping_before_entry
+ return keeping_before_entry
.into_iter()
.chain(self.remove_overlapping(range).map(|(key, value)| {
(
(DiscreteBounds {
- start: key.start().into(),
- end: key.end().into(),
+ start: key.start(),
+ end: key.end(),
}),
value,
)
}))
- .chain(keeping_after_entry.into_iter()));
+ .chain(keeping_after_entry.into_iter());
}
/// Returns an iterator of ranges over all the maximally-sized
@@ -813,8 +812,8 @@ where
.collect::>()
.windows(2)
.map(|windows| DiscreteBounds {
- start: windows[0].1.up_if_finite().into(),
- end: windows[1].0.down_if_finite().into(),
+ start: windows[0].1.up().unwrap(),
+ end: windows[1].0.down().unwrap(),
})
.filter(|range| is_valid_range(*range))
//optimisation this would also then be unneccessary
@@ -923,20 +922,18 @@ where
let matching_end = get_end(self, &value);
let returning = match (matching_start, matching_end) {
- (Some(matching_start), Some(matching_end)) => {
- K::try_from_discrete_bounds(DiscreteBounds {
- start: matching_start.start().into(),
- end: matching_end.end().into(),
- })?
- }
- (Some(matching_start), None) => K::try_from_discrete_bounds(DiscreteBounds {
- start: matching_start.start().into(),
- end: range.end().into(),
- })?,
- (None, Some(matching_end)) => K::try_from_discrete_bounds(DiscreteBounds {
- start: range.start().into(),
- end: matching_end.end().into(),
- })?,
+ (Some(matching_start), Some(matching_end)) => K::from(DiscreteBounds {
+ start: matching_start.start(),
+ end: matching_end.end(),
+ }),
+ (Some(matching_start), None) => K::from(DiscreteBounds {
+ start: matching_start.start(),
+ end: range.end(),
+ }),
+ (None, Some(matching_end)) => K::from(DiscreteBounds {
+ start: range.start(),
+ end: matching_end.end(),
+ }),
(None, None) => range,
};
@@ -947,7 +944,7 @@ where
self.insert_unchecked(returning, value);
- Ok(returning)
+ return returning;
}
/// Adds a new entry to the map and merges into other ranges in
@@ -1372,7 +1369,7 @@ where
{
invalid_range_panic(range);
- let _ = self.cut(range)?;
+ let _ = self.cut(range);
self.insert_unchecked(range, value);
}
@@ -1618,7 +1615,7 @@ mod tests {
use super::*;
use crate::test_ranges::{ee, ei, ie, ii, iu, ue, ui, uu};
- use crate::utils::{config, Config, CutResult};
+ use crate::utils::{config, contains_point, Config, CutResult};
//only every other number to allow mathematical_overlapping_definition
//to test between bounds in finite using smaller intervalled finite
@@ -1635,49 +1632,41 @@ mod tests {
])
.unwrap()
}
+ fn basic_slice() -> [(DiscreteBounds, bool); 4] {
+ [
+ (ui(4), false),
+ (ee(5, 7), true),
+ (ii(7, 7), false),
+ (ie(14, 16), true),
+ ]
+ }
#[test]
fn insert_strict_tests() {
- assert_insert_strict(
- basic(),
- (ii(0, 4), false),
- Err(OverlapError),
- None::<[_; 0]>,
- );
- assert_insert_strict(
- basic(),
- (ii(5, 6), false),
- Err(OverlapError),
- None::<[_; 0]>,
- );
- assert_insert_strict(basic(), (ii(4, 5), true), Err(OverlapError), None::<[_; 0]>);
+ assert_insert_strict(basic(), (ii(0, 4), false), Err(OverlapError), basic_slice());
+ assert_insert_strict(basic(), (ii(5, 6), false), Err(OverlapError), basic_slice());
+ assert_insert_strict(basic(), (ii(4, 5), true), Err(OverlapError), basic_slice());
assert_insert_strict(
basic(),
(ei(4, 5), true),
Ok(()),
- Some([
+ [
(ui(4), false),
(ei(4, 5), true),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
- ]),
+ ],
);
}
fn assert_insert_strict(
mut before: RangeBoundsMap, bool>,
to_insert: (DiscreteBounds, bool),
result: Result<(), OverlapError>,
- after: Option<[(DiscreteBounds, bool); N]>,
+ after: [(DiscreteBounds, bool); N],
) {
- let clone = before.clone();
assert_eq!(before.insert_strict(to_insert.0, to_insert.1), result);
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
}
#[test]
@@ -1800,58 +1789,50 @@ mod tests {
#[test]
fn cut_tests() {
- assert_cut(basic(), ii(50, 60), Ok([]), None::<[_; 0]>);
assert_cut(
basic(),
- uu(),
- Ok([
+ ii(50, 60),
+ [],
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
- ]),
- Some([]),
+ ],
+ );
+ assert_cut(
+ basic(),
+ uu(),
+ [
+ (ui(4), false),
+ (ee(5, 7), true),
+ (ii(7, 7), false),
+ (ie(14, 16), true),
+ ],
+ [],
);
assert_cut(
basic(),
ui(6),
- Ok([(ui(4), false), (ei(5, 6), true)]),
- Some([(ii(7, 7), false), (ie(14, 16), true)]),
+ [(ui(4), false), (ei(5, 6), true)],
+ [(ii(7, 7), false), (ie(14, 16), true)],
);
assert_cut(
basic(),
iu(6),
- Ok([(ie(6, 7), true), (ii(7, 7), false), (ie(14, 16), true)]),
- Some([(ui(4), false)]),
+ [(ie(6, 7), true), (ii(7, 7), false), (ie(14, 16), true)],
+ [(ui(4), false)],
);
}
-
fn assert_cut(
- mut before: RangeBoundsMap,
- to_cut: Q,
- result: Result<[(DiscreteBounds, V); Y], TryFromDiscreteBoundsError>,
- after: Option<[(K, V); N]>,
- ) where
- I: Ord + Debug + Copy + Discrete,
- K: DiscreteRange + TryFromDiscreteBounds + PartialEq + Debug + Copy,
- Q: DiscreteRange + Copy,
- V: PartialEq + Debug + Clone,
- {
+ mut before: RangeBoundsMap, bool>,
+ to_cut: DiscreteBounds,
+ result: [(DiscreteBounds, bool); Y],
+ after: [(DiscreteBounds, bool); N],
+ ) {
let clone = before.clone();
- match before.cut(to_cut) {
- Ok(iter) => {
- assert_eq!(iter.collect::>(), result.unwrap());
- }
- Err(x) => {
- assert_eq!(x, result.unwrap_err());
- }
- }
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before.cut(to_cut).collect::>(), result);
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap());
}
#[test]
@@ -1893,124 +1874,109 @@ mod tests {
assert_insert_merge_touching(
basic(),
(ii(0, 4), false),
- Err(OverlapOrTryFromDiscreteBoundsError::Overlap(OverlapError)),
- None::<[_; 0]>,
+ Err(OverlapError),
+ [
+ (ui(4), false),
+ (ee(5, 7), true),
+ (ii(7, 7), false),
+ (ie(14, 16), true),
+ ],
);
assert_insert_merge_touching(
basic(),
(ee(7, 10), false),
Ok(ie(7, 10)),
- Some([
+ [
(ui(4), false),
(ee(5, 7), true),
(ie(7, 10), false),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_touching(
basic(),
(ee(7, 11), true),
Ok(ie(7, 11)),
- Some([
+ [
(ui(4), false),
(ee(5, 7), true),
(ie(7, 11), true),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_touching(
basic(),
(ee(7, 14), false),
Ok(ie(7, 16)),
- Some([(ui(4), false), (ee(5, 7), true), (ie(7, 16), false)]),
+ [(ui(4), false), (ee(5, 7), true), (ie(7, 16), false)],
);
}
- fn assert_insert_merge_touching(
- mut before: RangeBoundsMap,
- to_insert: (K, V),
- result: Result,
- after: Option<[(K, V); N]>,
- ) where
- I: Ord + Debug + Copy + Discrete,
- K: DiscreteRange + TryFromDiscreteBounds + PartialEq + Debug + Copy,
- V: PartialEq + Debug + Clone,
- {
- let clone = before.clone();
+ fn assert_insert_merge_touching(
+ mut before: RangeBoundsMap, bool>,
+ to_insert: (DiscreteBounds, bool),
+ result: Result, OverlapError>,
+ after: [(DiscreteBounds, bool); N],
+ ) {
assert_eq!(
before.insert_merge_touching(to_insert.0, to_insert.1),
result
);
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
}
#[test]
fn insert_merge_touching_if_values_equal_tests() {
assert_insert_merge_touching_if_values_equal(
basic(),
(ii(0, 4), false),
- Err(OverlapOrTryFromDiscreteBoundsError::Overlap(OverlapError)),
- None::<[_; 0]>,
+ Err(OverlapError),
+ basic_slice(),
);
assert_insert_merge_touching_if_values_equal(
basic(),
(ee(7, 10), false),
Ok(ie(7, 10)),
- Some([
+ [
(ui(4), false),
(ee(5, 7), true),
(ie(7, 10), false),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_touching_if_values_equal(
basic(),
(ee(7, 11), true),
Ok(ee(7, 11)),
- Some([
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ee(7, 11), true),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_touching_if_values_equal(
basic(),
(ee(7, 14), false),
Ok(ie(7, 14)),
- Some([
+ [
(ui(4), false),
(ee(5, 7), true),
(ie(7, 14), false),
(ie(14, 16), true),
- ]),
+ ],
);
}
- fn assert_insert_merge_touching_if_values_equal(
- mut before: RangeBoundsMap,
- to_insert: (K, V),
- result: Result,
- after: Option<[(K, V); N]>,
- ) where
- I: Ord + Debug + Copy + Discrete,
- K: DiscreteRange + TryFromDiscreteBounds + PartialEq + Debug + Copy,
- V: Eq + Debug + Clone,
- {
- let clone = before.clone();
+ fn assert_insert_merge_touching_if_values_equal(
+ mut before: RangeBoundsMap, bool>,
+ to_insert: (DiscreteBounds, bool),
+ result: Result, OverlapError>,
+ after: [(DiscreteBounds, bool); N],
+ ) {
assert_eq!(
before.insert_merge_touching_if_values_equal(to_insert.0, to_insert.1),
result
);
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
}
#[test]
@@ -2018,65 +1984,55 @@ mod tests {
assert_insert_merge_overlapping(
basic(),
(ii(0, 2), true),
- Ok(ui(4)),
- Some([
+ ui(4),
+ [
(ui(4), true),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_overlapping(
basic(),
(ie(14, 16), false),
- Ok(ie(14, 16)),
- Some([
+ ie(14, 16),
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), false),
- ]),
+ ],
);
assert_insert_merge_overlapping(
basic(),
(ii(6, 11), false),
- Ok(ei(5, 11)),
- Some([(ui(4), false), (ei(5, 11), false), (ie(14, 16), true)]),
+ ei(5, 11),
+ [(ui(4), false), (ei(5, 11), false), (ie(14, 16), true)],
);
assert_insert_merge_overlapping(
basic(),
(ii(15, 18), true),
- Ok(ii(14, 18)),
- Some([
+ ii(14, 18),
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ii(14, 18), true),
- ]),
+ ],
);
- assert_insert_merge_overlapping(basic(), (uu(), false), Ok(uu()), Some([(uu(), false)]));
+ assert_insert_merge_overlapping(basic(), (uu(), false), uu(), [(uu(), false)]);
}
- fn assert_insert_merge_overlapping(
- mut before: RangeBoundsMap,
- to_insert: (K, V),
- result: Result,
- after: Option<[(K, V); N]>,
- ) where
- I: Ord + Debug + Copy + Discrete,
- K: DiscreteRange + TryFromDiscreteBounds + PartialEq + Debug + Copy,
- V: PartialEq + Debug + Clone,
- {
- let clone = before.clone();
+ fn assert_insert_merge_overlapping(
+ mut before: RangeBoundsMap, bool>,
+ to_insert: (DiscreteBounds, bool),
+ result: DiscreteBounds,
+ after: [(DiscreteBounds, bool); N],
+ ) {
assert_eq!(
before.insert_merge_overlapping(to_insert.0, to_insert.1),
result
);
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
}
#[test]
@@ -2084,85 +2040,70 @@ mod tests {
assert_insert_merge_touching_or_overlapping(
RangeBoundsMap::from_slice_strict([(ie(1, 4), false)]).unwrap(),
(ie(0, 1), true),
- Ok(ie(0, 4)),
- Some([(ie(0, 4), true)]),
+ ie(0, 4),
+ [(ie(0, 4), true)],
);
//copied from insert_merge_overlapping_tests
assert_insert_merge_touching_or_overlapping(
basic(),
(ii(0, 2), true),
- Ok(ui(4)),
- Some([
+ ui(4),
+ [
(ui(4), true),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
- ]),
+ ],
);
assert_insert_merge_touching_or_overlapping(
basic(),
(ie(14, 16), false),
- Ok(ie(14, 16)),
- Some([
+ ie(14, 16),
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), false),
- ]),
+ ],
);
assert_insert_merge_touching_or_overlapping(
basic(),
(ii(6, 11), false),
- Ok(ei(5, 11)),
- Some([(ui(4), false), (ei(5, 11), false), (ie(14, 16), true)]),
+ ei(5, 11),
+ [(ui(4), false), (ei(5, 11), false), (ie(14, 16), true)],
);
assert_insert_merge_touching_or_overlapping(
basic(),
(ii(15, 18), true),
- Ok(ii(14, 18)),
- Some([
+ ii(14, 18),
+ [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ii(14, 18), true),
- ]),
- );
- assert_insert_merge_touching_or_overlapping(
- basic(),
- (uu(), false),
- Ok(uu()),
- Some([(uu(), false)]),
+ ],
);
+ assert_insert_merge_touching_or_overlapping(basic(), (uu(), false), uu(), [(uu(), false)]);
//the only difference from the insert_merge_overlapping
assert_insert_merge_touching_or_overlapping(
basic(),
(ii(7, 14), false),
- Ok(ee(5, 16)),
- Some([(ui(4), false), (ee(5, 16), false)]),
+ ee(5, 16),
+ [(ui(4), false), (ee(5, 16), false)],
);
}
- fn assert_insert_merge_touching_or_overlapping(
- mut before: RangeBoundsMap,
- to_insert: (K, V),
- result: Result,
- after: Option<[(K, V); N]>,
- ) where
- I: Ord + Debug + Copy + Discrete,
- K: DiscreteRange + TryFromDiscreteBounds + PartialEq + Debug + Copy,
- V: PartialEq + Debug + Clone,
- {
- let clone = before.clone();
+ fn assert_insert_merge_touching_or_overlapping(
+ mut before: RangeBoundsMap, bool>,
+ to_insert: (DiscreteBounds, bool),
+ result: DiscreteBounds,
+ after: [(DiscreteBounds, bool); N],
+ ) {
assert_eq!(
before.insert_merge_touching_or_overlapping(to_insert.0, to_insert.1),
result
);
- match after {
- Some(after) => {
- assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
- }
- None => assert_eq!(before, clone),
- }
+ assert_eq!(before, RangeBoundsMap::from_slice_strict(after).unwrap())
}
#[test]
@@ -2184,7 +2125,7 @@ mod tests {
let mathematical_definition_of_overlap = NUMBERS_DOMAIN
.iter()
- .any(|x| range1.contains(x) && range2.contains(x));
+ .any(|x| contains_point(range1, *x) && contains_point(range2, *x));
if our_answer != mathematical_definition_of_overlap {
dbg!(range1, range2);
@@ -2209,8 +2150,8 @@ mod tests {
// The definition of a cut is: A && NOT B
for x in NUMBERS_DOMAIN {
- let base_contains = base.contains(x);
- let cut_contains = cut.contains(x);
+ let base_contains = contains_point(base, *x);
+ let cut_contains = contains_point(base, *x);
if cut_contains {
on_left = false;
@@ -2248,7 +2189,7 @@ mod tests {
}
fn con(x: Option>, point: &i8) -> bool {
match x {
- Some(y) => y.contains(point),
+ Some(y) => contains_point(y, *point),
None => false,
}
}
@@ -2294,21 +2235,10 @@ mod tests {
fn all_valid_test_bounds() -> Vec> {
let mut output = Vec::new();
- for i in NUMBERS
- .into_iter()
- .map(|i| DiscreteBoundOrd::Included(*i))
- .chain(once(DiscreteBoundOrd::StartUnbounded))
- {
- for j in NUMBERS
- .into_iter()
- .map(|j| DiscreteBoundOrd::Included(*j))
- .chain(once(DiscreteBoundOrd::StartUnbounded))
- {
+ for i in NUMBERS {
+ for j in NUMBERS {
if i <= j {
- output.push(DiscreteBounds {
- start: i.into(),
- end: j.into(),
- });
+ output.push(DiscreteBounds { start: *i, end: *j });
}
}
}
diff --git a/src/range_bounds_set.rs b/src/range_bounds_set.rs
index c9823e4..206b511 100644
--- a/src/range_bounds_set.rs
+++ b/src/range_bounds_set.rs
@@ -8,10 +8,7 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::discrete_bounds::DiscreteBounds;
use crate::range_bounds_map::{DiscreteRange, IntoIter as RangeBoundsMapIntoIter};
use crate::stepable::Discrete;
-use crate::try_from_discrete_bounds::TryFromDiscreteBounds;
-use crate::{
- OverlapError, OverlapOrTryFromDiscreteBoundsError, RangeBoundsMap, TryFromDiscreteBoundsError,
-};
+use crate::{OverlapError, RangeBoundsMap};
/// An ordered set of non-overlapping ranges based on [`RangeBoundsMap`].
///
@@ -87,12 +84,12 @@ where
pub fn cut<'a, Q>(
&'a mut self,
range: Q,
- ) -> Result> + '_, TryFromDiscreteBoundsError>
+ ) -> impl Iterator- > + '_
where
Q: DiscreteRange + Copy + 'a,
- K: TryFromDiscreteBounds,
+ K: From>,
{
- self.inner.cut(range).map(|x| x.map(first))
+ self.inner.cut(range).map(first)
}
/// See [`RangeBoundsMap::gaps()`] for more details.
pub fn gaps<'a, Q>(
@@ -119,16 +116,16 @@ where
pub fn insert_merge_touching(
&mut self,
range: K,
- ) -> Result
+ ) -> Result
where
- K: TryFromDiscreteBounds,
+ K: From>,
{
self.inner.insert_merge_touching(range, ())
}
/// See [`RangeBoundsMap::insert_merge_overlapping()`] for more details.
- pub fn insert_merge_overlapping(&mut self, range: K) -> Result
+ pub fn insert_merge_overlapping(&mut self, range: K) -> K
where
- K: TryFromDiscreteBounds,
+ K: From>,
{
self.inner.insert_merge_overlapping(range, ())
}
@@ -136,16 +133,16 @@ where
pub fn insert_merge_touching_or_overlapping(
&mut self,
range: K,
- ) -> Result
+ ) -> K
where
- K: TryFromDiscreteBounds,
+ K: From>,
{
self.inner.insert_merge_touching_or_overlapping(range, ())
}
/// See [`RangeBoundsMap::insert_overwrite()`] for more details.
- pub fn insert_overwrite(&mut self, range: K) -> Result<(), TryFromDiscreteBoundsError>
+ pub fn insert_overwrite(&mut self, range: K)
where
- K: TryFromDiscreteBounds,
+ K: From>,
{
self.inner.insert_overwrite(range, ())
}
diff --git a/src/test_ranges.rs b/src/test_ranges.rs
index 3b98b7a..93697a6 100644
--- a/src/test_ranges.rs
+++ b/src/test_ranges.rs
@@ -1,93 +1,51 @@
-use std::ops::{Bound, RangeBounds};
-
-use crate::discrete_bounds::{DiscreteBound, DiscreteBounds};
+use crate::discrete_bounds::DiscreteBounds;
use crate::stepable::Discrete;
-use crate::{TryFromDiscreteBounds, TryFromDiscreteBoundsError};
pub fn uu() -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Unbounded,
- end: DiscreteBound::Unbounded,
+ start: i8::MIN,
+ end: i8::MAX,
}
}
pub fn ui(x: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Unbounded,
- end: DiscreteBound::Included(x),
+ start: i8::MIN,
+ end: x,
}
}
pub fn ue(x: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Unbounded,
- end: DiscreteBound::Included(x.down().unwrap()),
+ start: i8::MIN,
+ end: x.down().unwrap(),
}
}
pub fn iu(x: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Included(x),
- end: DiscreteBound::Unbounded,
+ start: x,
+ end: i8::MAX,
}
}
//fn eu(x: i8) -> TestBounds {
//(Bound::Excluded(x), Bound::Unbounded)
//}
pub fn ii(x1: i8, x2: i8) -> DiscreteBounds {
- DiscreteBounds {
- start: DiscreteBound::Included(x1),
- end: DiscreteBound::Included(x2),
- }
+ DiscreteBounds { start: x1, end: x2 }
}
pub fn ie(x1: i8, x2: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Included(x1),
- end: DiscreteBound::Included(x2.down().unwrap()),
+ start: x1.up().unwrap(),
+ end: x2.down().unwrap(),
}
}
pub fn ei(x1: i8, x2: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Included(x1.up().unwrap()),
- end: DiscreteBound::Included(x2),
+ start: x1.up().unwrap(),
+ end: x2,
}
}
pub fn ee(x1: i8, x2: i8) -> DiscreteBounds {
DiscreteBounds {
- start: DiscreteBound::Included(x1.up().unwrap()),
- end: DiscreteBound::Included(x2.down().unwrap()),
- }
-}
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub struct IEStrict {
- start: i8,
- end: i8,
-}
-
-pub fn ie_strict(start: i8, end: i8) -> IEStrict {
- IEStrict { start, end }
-}
-
-impl RangeBounds for IEStrict {
- fn start_bound(&self) -> std::ops::Bound<&i8> {
- Bound::Included(&self.start)
- }
- fn end_bound(&self) -> Bound<&i8> {
- Bound::Excluded(&self.end)
- }
-}
-
-impl TryFromDiscreteBounds for IEStrict {
- fn try_from_discrete_bounds(
- discrete_bounds: DiscreteBounds,
- ) -> Result
- where
- Self: Sized,
- {
- match (discrete_bounds.start, discrete_bounds.end) {
- (DiscreteBound::Included(start), DiscreteBound::Included(end)) => Ok(IEStrict {
- start,
- end: end.checked_add(1).ok_or(TryFromDiscreteBoundsError)?,
- }),
- _ => Err(TryFromDiscreteBoundsError),
- }
+ start: x1.up().unwrap(),
+ end: x2.down().unwrap(),
}
}
diff --git a/src/utils.rs b/src/utils.rs
index c025524..f0b6d2d 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -23,12 +23,9 @@ use crate::discrete_bounds::DiscreteBounds;
use crate::range_bounds_map::DiscreteRange;
use crate::stepable::Discrete;
-pub(crate) fn cmp_point_with_range(
- point: I,
- range: K,
-) -> Ordering
+pub(crate) fn cmp_point_with_range(point: I, range: K) -> Ordering
where
- I: Ord,
+ I: Ord,
K: DiscreteRange,
{
if point < range.start() {
@@ -57,20 +54,14 @@ where
I: Ord,
{
if a.start() < b.start() {
- match (
- contains_discrete_bound_ord(a, b.start()),
- contains_discrete_bound_ord(a, b.end()),
- ) {
+ match (contains_point(a, b.start()), contains_point(a, b.end())) {
(false, false) => Config::LeftFirstNonOverlapping,
(true, false) => Config::LeftFirstPartialOverlap,
(true, true) => Config::LeftContainsRight,
(false, true) => unreachable!(),
}
} else {
- match (
- contains_discrete_bound_ord(b, a.start()),
- contains_discrete_bound_ord(b, a.end()),
- ) {
+ match (contains_point(b, a.start()), contains_point(b, a.end())) {
(false, false) => Config::RightFirstNonOverlapping,
(true, false) => Config::RightFirstPartialOverlap,
(true, true) => Config::RightContainsLeft,
@@ -80,18 +71,9 @@ where
}
enum SortedConfig {
- NonOverlapping(
- (DiscreteBoundOrd, DiscreteBoundOrd),
- (DiscreteBoundOrd, DiscreteBoundOrd),
- ),
- PartialOverlap(
- (DiscreteBoundOrd, DiscreteBoundOrd),
- (DiscreteBoundOrd, DiscreteBoundOrd),
- ),
- Swallowed(
- (DiscreteBoundOrd, DiscreteBoundOrd),
- (DiscreteBoundOrd, DiscreteBoundOrd),
- ),
+ NonOverlapping(DiscreteBounds, DiscreteBounds),
+ PartialOverlap(DiscreteBounds, DiscreteBounds),
+ Swallowed(DiscreteBounds, DiscreteBounds),
}
fn sorted_config(a: A, b: B) -> SortedConfig
where
@@ -112,15 +94,12 @@ where
}
}
-pub(crate) fn contains_discrete_bound_ord(
- range: A,
- discrete_bound_ord: DiscreteBoundOrd,
-) -> bool
+pub(crate) fn contains_point(range: A, point: I) -> bool
where
A: DiscreteRange,
I: Ord,
{
- cmp_point_with_range(discrete_bound_ord, range).is_eq()
+ cmp_point_with_range(point, range).is_eq()
}
#[derive(Debug)]
@@ -144,61 +123,55 @@ where
match config(base, cut) {
Config::LeftFirstNonOverlapping => {
result.before_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: base.end().into(),
+ start: base.start(),
+ end: base.end(),
});
}
Config::LeftFirstPartialOverlap => {
result.before_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: cut.start().down_if_finite().into(),
+ start: base.start(),
+ end: cut.start().down_if_finite(),
});
result.inside_cut = Some(DiscreteBounds {
- start: cut.start().into(),
- end: base.end().into(),
+ start: cut.start(),
+ end: base.end(),
});
}
Config::LeftContainsRight => {
result.before_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: cut.start().down_if_finite().into(),
+ start: base.start(),
+ end: cut.start().down_if_finite(),
});
result.inside_cut = Some(DiscreteBounds {
- start: cut.start().into(),
- end: cut.end().into(),
+ start: cut.start(),
+ end: cut.end(),
+ });
+ result.after_cut = Some(DiscreteBounds {
+ start: cut.end().up_if_finite(),
+ end: base.end(),
});
- // exception for Unbounded-ending things
- match cut.end() {
- DiscreteBoundOrd::EndUnbounded => {}
- _ => {
- result.after_cut = Some(DiscreteBounds {
- start: cut.end().up_if_finite().into(),
- end: base.end().into(),
- });
- }
- }
}
Config::RightFirstNonOverlapping => {
result.after_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: base.end().into(),
+ start: base.start(),
+ end: base.end(),
});
}
Config::RightFirstPartialOverlap => {
result.after_cut = Some(DiscreteBounds {
- start: cut.end().up_if_finite().into(),
- end: base.end().into(),
+ start: cut.end().up_if_finite(),
+ end: base.end(),
});
result.inside_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: cut.end().into(),
+ start: base.start(),
+ end: cut.end(),
});
}
Config::RightContainsLeft => {
result.inside_cut = Some(DiscreteBounds {
- start: base.start().into(),
- end: base.end().into(),
+ start: base.start(),
+ end: base.end(),
});
}
}