finished implementing overlapping

This commit is contained in:
ripytide
2023-04-02 19:17:13 +01:00
parent 032e28866d
commit 2c6eda2db8
2 changed files with 32 additions and 10 deletions
+20 -2
View File
@@ -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 <https://www.gnu.org/licenses/>.
*/
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<A, B>(
range_bounds: &A,
bound_ord: BoundOrd<&B>,
) -> Ordering
where
A: RangeBounds<B>,
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 {
+12 -8
View File
@@ -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<I>,
{
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)