diff --git a/src/helpers.rs b/src/helpers.rs index 6109cbd..477a460 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -17,12 +17,30 @@ You should have received a copy of the GNU Affero General Public License along with range_bounds_map. If not, see . */ -use std::ops::{RangeBounds, Bound}; +use std::cmp::Ordering; +use std::ops::{Bound, RangeBounds}; -use labels::{trivial, tested}; +use labels::{tested, trivial}; use crate::bound_ord::BoundOrd; +//todo why is pub(crate) needed? +pub(crate) fn cmp_range_bounds_with_bound_ord( + range_bounds: &A, + bound_ord: BoundOrd<&B>, +) -> Ordering +where + A: RangeBounds, + B: Ord, +{ + if bound_ord < BoundOrd::start(range_bounds.start_bound()) { + Ordering::Greater + } else if bound_ord > BoundOrd::end(range_bounds.end_bound()) { + Ordering::Less + } else { + Ordering::Equal + } +} #[derive(Debug, PartialEq)] enum Config { diff --git a/src/range_bounds_map.rs b/src/range_bounds_map.rs index b52678c..1f71852 100644 --- a/src/range_bounds_map.rs +++ b/src/range_bounds_map.rs @@ -22,8 +22,8 @@ use std::iter::once; use std::marker::PhantomData; use std::ops::{Bound, RangeBounds}; -use btree_monstousity::BTreeMap; use btree_monstousity::btree_map::SearchBoundCustom; +use btree_monstousity::BTreeMap; use itertools::Itertools; use labels::{parent_tested, tested, trivial}; use serde::de::{MapAccess, Visitor}; @@ -31,7 +31,7 @@ use serde::ser::SerializeMap; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use crate::bound_ord::BoundOrd; -use crate::helpers::is_valid_range_bounds; +use crate::helpers::{cmp_range_bounds_with_bound_ord, is_valid_range_bounds}; use crate::TryFromBounds; /// An ordered map of non-overlapping [`RangeBounds`] based on [`BTreeMap`]. @@ -431,16 +431,20 @@ where Q: RangeBounds, { let lower_comp = |inner_range_bounds: &K| { - BoundOrd::start(range_bounds.start_bound()) - .cmp(&BoundOrd::start(inner_range_bounds.start_bound())) + cmp_range_bounds_with_bound_ord( + inner_range_bounds, + BoundOrd::start(range_bounds.start_bound()), + ) }; let upper_comp = |inner_range_bounds: &K| { - BoundOrd::start(range_bounds.start_bound()) - .cmp(&BoundOrd::start(inner_range_bounds.start_bound())) + cmp_range_bounds_with_bound_ord( + inner_range_bounds, + BoundOrd::end(range_bounds.end_bound()), + ) }; - let lower_bound = SearchBoundCustom::Included; - let upper_bound = SearchBoundCustom::Included; + let lower_bound = SearchBoundCustom::Included; + let upper_bound = SearchBoundCustom::Included; self.inner .range(lower_comp, lower_bound, upper_comp, upper_bound)