alnyan/yggdrasil: update btree_monstruosity

This commit is contained in:
Mark Poliakov 2024-10-31 13:35:23 +02:00
parent 10fd79828d
commit 6b54882b19
4 changed files with 137 additions and 156 deletions

6
Cargo.lock generated
View File

@ -1,12 +1,12 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "btree_monstrousity"
version = "0.0.4"
version = "0.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4d0977e9c15f276380f16f2e9594257c258172b23af39ffd2e4cf5971cb38c7"
checksum = "2ec92912346b936c974181a172d9abc81f50d41e40118fc101dac8aa8134bee3"
dependencies = [
"cfg-if",
"rustversion",

View File

@ -18,7 +18,7 @@ categories = ["data-structures"]
[dependencies]
serde = { version = "1.0.193", features = ["derive"], default-features = false }
btree_monstrousity = { version = "0.0.4", features = [
btree_monstrousity = { version = "0.0.5", features = [
"btree_drain_filter",
"btree_cursors",
], default-features = false }

View File

@ -25,10 +25,10 @@ use core::fmt::{self, Debug};
use core::iter::once;
use core::marker::PhantomData;
use btree_monstrousity::BTreeMap;
use btree_monstrousity::btree_map::{
IntoIter as BTreeMapIntoIter, SearchBoundCustom,
};
use btree_monstrousity::BTreeMap;
use either::Either;
use itertools::Itertools;
use serde::de::{SeqAccess, Visitor};
@ -53,8 +53,8 @@ use crate::{DiscreteFinite, InclusiveInterval};
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// // Make a map of ranges to booleans
/// let mut map = DiscreteRangeMap::from_slice_strict([
@ -126,8 +126,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::{ie, ii};
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::{ie, ii};
///
/// let mut map = DiscreteRangeMap::new();
///
@ -159,8 +159,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -171,10 +171,10 @@ where
///
/// let mut overlapping = map.overlapping(ie(2, 8));
///
/// assert_eq!(
/// overlapping.collect::<Vec<_>>(),
/// [(&ie(1, 4), &false), (&ie(4, 8), &true)]
/// );
/// assert_eq!(overlapping.collect::<Vec<_>>(), [
/// (&ie(1, 4), &false),
/// (&ie(4, 8), &true)
/// ]);
/// ```
pub fn overlapping<Q>(
&self,
@ -206,8 +206,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -248,8 +248,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -271,8 +271,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
/// let mut map =
/// DiscreteRangeMap::from_slice_strict([(ie(1, 4), false)])
/// .unwrap();
@ -292,8 +292,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -318,8 +318,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::{ie, iu};
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::{ie, iu};
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -367,8 +367,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -379,15 +379,15 @@ where
///
/// let mut removed = map.remove_overlapping(ie(2, 8));
///
/// assert_eq!(
/// removed.collect::<Vec<_>>(),
/// [(ie(1, 4), false), (ie(4, 8), true)]
/// );
/// assert_eq!(removed.collect::<Vec<_>>(), [
/// (ie(1, 4), false),
/// (ie(4, 8), true)
/// ]);
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(8, 100), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [(
/// ie(8, 100),
/// false
/// )]);
/// ```
pub fn remove_overlapping<'a, Q>(
&'a mut self,
@ -431,8 +431,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::{ie, ii};
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::{ie, ii};
///
/// let mut base = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -447,10 +447,11 @@ where
/// ])
/// .unwrap();
///
/// assert_eq!(
/// base.cut(ie(2, 40)).collect::<Vec<_>>(),
/// [(ie(2, 4), false), (ie(4, 8), true), (ie(8, 40), false),]
/// );
/// assert_eq!(base.cut(ie(2, 40)).collect::<Vec<_>>(), [
/// (ie(2, 4), false),
/// (ie(4, 8), true),
/// (ie(8, 40), false),
/// ]);
/// assert_eq!(base, after_cut);
/// ```
pub fn cut<'a, Q>(&'a mut self, range: Q) -> impl Iterator<Item = (K, V)>
@ -750,8 +751,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::{ie, ii, iu};
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::{ie, ii, iu};
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 3), false),
@ -762,15 +763,16 @@ where
///
/// let mut gaps = map.gaps_untrimmed(ii(4, 120));
///
/// assert_eq!(
/// gaps.collect::<Vec<_>>(),
/// [ie(3, 5), ie(7, 9), iu(100)]
/// );
/// assert_eq!(gaps.collect::<Vec<_>>(), [
/// ie(3, 5),
/// ie(7, 9),
/// iu(100)
/// ]);
/// ```
pub fn gaps_untrimmed<'a, Q>(
&'a self,
range: Q,
) -> impl Iterator<Item = K> + '_
) -> impl Iterator<Item = K> + 'a
where
Q: RangeType<I> + 'a,
{
@ -837,8 +839,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::{ie, ii, iu};
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::{ie, ii, iu};
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 3), false),
@ -849,15 +851,16 @@ where
///
/// let mut gaps = map.gaps_trimmed(ii(4, 120));
///
/// assert_eq!(
/// gaps.collect::<Vec<_>>(),
/// [ie(4, 5), ie(7, 9), ii(100, 120)]
/// );
/// assert_eq!(gaps.collect::<Vec<_>>(), [
/// ie(4, 5),
/// ie(7, 9),
/// ii(100, 120)
/// ]);
/// ```
pub fn gaps_trimmed<'a, Q>(
&'a self,
range: Q,
) -> impl Iterator<Item = K> + '_
) -> impl Iterator<Item = K> + 'a
where
Q: RangeType<I> + 'a,
{
@ -932,8 +935,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 3), false),
@ -1097,10 +1100,10 @@ where
/// Ok(ie(10, 16))
/// );
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(1, 8), true), (ie(10, 16), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [
/// (ie(1, 8), true),
/// (ie(10, 16), false)
/// ]);
/// ```
pub fn insert_merge_touching(
&mut self,
@ -1185,10 +1188,11 @@ where
/// Ok(ie(10, 16))
/// );
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(1, 4), false), (ie(4, 8), true), (ie(10, 16), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [
/// (ie(1, 4), false),
/// (ie(4, 8), true),
/// (ie(10, 16), false)
/// ]);
/// ```
pub fn insert_merge_touching_if_values_equal(
&mut self,
@ -1286,10 +1290,11 @@ where
/// ie(10, 16)
/// );
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(1, 4), false), (ie(4, 8), false), (ie(10, 16), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [
/// (ie(1, 4), false),
/// (ie(4, 8), false),
/// (ie(10, 16), false)
/// ]);
/// ```
pub fn insert_merge_overlapping(&mut self, range: K, value: V) -> K {
invalid_range_panic(range);
@ -1359,10 +1364,10 @@ where
/// ie(10, 16)
/// );
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(1, 8), false), (ie(10, 16), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [
/// (ie(1, 8), false),
/// (ie(10, 16), false)
/// ]);
/// ```
pub fn insert_merge_touching_or_overlapping(
&mut self,
@ -1423,8 +1428,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map =
/// DiscreteRangeMap::from_slice_strict([(ie(2, 8), false)])
@ -1432,10 +1437,11 @@ where
///
/// map.insert_overwrite(ie(4, 6), true);
///
/// assert_eq!(
/// map.into_iter().collect::<Vec<_>>(),
/// [(ie(2, 4), false), (ie(4, 6), true), (ie(6, 8), false)]
/// );
/// assert_eq!(map.into_iter().collect::<Vec<_>>(), [
/// (ie(2, 4), false),
/// (ie(4, 6), true),
/// (ie(6, 8), false)
/// ]);
/// ```
pub fn insert_overwrite(
&mut self,
@ -1467,8 +1473,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -1501,8 +1507,8 @@ where
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let slice =
/// [(ie(1, 4), false), (ie(4, 8), true), (ie(8, 100), false)];
@ -1545,8 +1551,8 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map = DiscreteRangeMap::new();
///
@ -1563,8 +1569,8 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map = DiscreteRangeMap::new();
///
@ -1581,8 +1587,8 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -1607,8 +1613,8 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let mut map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -1635,8 +1641,8 @@ impl<I, K, V> DiscreteRangeMap<I, K, V> {
///
/// # Examples
/// ```
/// use discrete_range_map::inclusive_interval::ie;
/// use discrete_range_map::DiscreteRangeMap;
/// use discrete_range_map::inclusive_interval::ie;
///
/// let map = DiscreteRangeMap::from_slice_strict([
/// (ie(1, 4), false),
@ -1970,7 +1976,7 @@ mod tests {
use super::*;
use crate::inclusive_interval::{ee, ei, ie, ii, iu, ue, ui, uu};
use crate::utils::{config, contains_point, Config, CutResult};
use crate::utils::{Config, CutResult, config, contains_point};
//only every other number to allow mathematical_overlapping_definition
//to test between bounds in finite using smaller intervalled finite
@ -2017,18 +2023,13 @@ mod tests {
Err(OverlapError { value: true }),
basic_slice(),
);
assert_insert_strict(
basic(),
assert_insert_strict(basic(), (ei(4, 5), true), Ok(()), [
(ui(4), false),
(ei(4, 5), true),
Ok(()),
[
(ui(4), false),
(ei(4, 5), true),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
],
);
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
]);
}
fn assert_insert_strict<const N: usize>(
mut before: DiscreteRangeMap<i8, InclusiveInterval<i8>, bool>,
@ -2163,17 +2164,12 @@ mod tests {
#[test]
fn cut_tests() {
assert_cut(
basic(),
ii(50, 60),
[],
[
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
],
);
assert_cut(basic(), ii(50, 60), [], [
(ui(4), false),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
]);
assert_cut(
basic(),
uu(),
@ -2185,12 +2181,10 @@ mod tests {
],
[],
);
assert_cut(
basic(),
ui(6),
[(ui(4), false), (ei(5, 6), true)],
[(ii(7, 7), false), (ie(14, 16), true)],
);
assert_cut(basic(), ui(6), [(ui(4), false), (ei(5, 6), true)], [
(ii(7, 7), false),
(ie(14, 16), true),
]);
assert_cut(
basic(),
iu(6),
@ -2213,11 +2207,11 @@ mod tests {
assert_gaps_untrimmed(basic(), ii(50, 60), [iu(16)]);
assert_gaps_untrimmed(basic(), iu(50), [iu(16)]);
assert_gaps_untrimmed(basic(), ee(3, 16), [ei(4, 5), ee(7, 14)]);
assert_gaps_untrimmed(
basic(),
ei(3, 16),
[ei(4, 5), ee(7, 14), iu(16)],
);
assert_gaps_untrimmed(basic(), ei(3, 16), [
ei(4, 5),
ee(7, 14),
iu(16),
]);
assert_gaps_untrimmed(basic(), ue(5), []);
assert_gaps_untrimmed(basic(), ui(3), []);
assert_gaps_untrimmed(basic(), ii(5, 5), [ii(5, 5)]);
@ -2225,11 +2219,11 @@ mod tests {
assert_gaps_untrimmed(basic(), ii(7, 7), []);
assert_gaps_untrimmed(basic(), ii(8, 8), [ii(8, 13)]);
assert_gaps_untrimmed(
basic(),
ii(i8::MIN, i8::MAX),
[ei(4, 5), ee(7, 14), ii(16, i8::MAX)],
);
assert_gaps_untrimmed(basic(), ii(i8::MIN, i8::MAX), [
ei(4, 5),
ee(7, 14),
ii(16, i8::MAX),
]);
assert_eq!(
DiscreteRangeMap::from_slice_strict([(
ii(i8::MIN, i8::MAX),
@ -2254,11 +2248,11 @@ mod tests {
assert_gaps_trimmed(basic(), ii(50, 60), [ii(50, 60)]);
assert_gaps_trimmed(basic(), iu(50), [iu(50)]);
assert_gaps_trimmed(basic(), ee(3, 16), [ei(4, 5), ee(7, 14)]);
assert_gaps_trimmed(
basic(),
ei(3, 16),
[ei(4, 5), ee(7, 14), ii(16, 16)],
);
assert_gaps_trimmed(basic(), ei(3, 16), [
ei(4, 5),
ee(7, 14),
ii(16, 16),
]);
assert_gaps_trimmed(basic(), ue(5), []);
assert_gaps_trimmed(basic(), ui(3), []);
assert_gaps_trimmed(basic(), ii(5, 5), [ii(5, 5)]);
@ -2266,11 +2260,11 @@ mod tests {
assert_gaps_trimmed(basic(), ii(7, 7), []);
assert_gaps_trimmed(basic(), ii(8, 8), [ii(8, 8)]);
assert_gaps_trimmed(
basic(),
ii(i8::MIN, i8::MAX),
[ei(4, 5), ee(7, 14), ii(16, i8::MAX)],
);
assert_gaps_trimmed(basic(), ii(i8::MIN, i8::MAX), [
ei(4, 5),
ee(7, 14),
ii(16, i8::MAX),
]);
assert_eq!(
DiscreteRangeMap::from_slice_strict([(
ii(i8::MIN, i8::MAX),
@ -2406,17 +2400,12 @@ mod tests {
#[test]
fn insert_merge_overlapping_tests() {
assert_insert_merge_overlapping(
basic(),
(ii(0, 2), true),
ui(4),
[
(ui(4), true),
(ee(5, 7), true),
(ii(7, 7), false),
(ie(14, 16), true),
],
);
assert_insert_merge_overlapping(basic(), (ii(0, 2), true), 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),
@ -2445,12 +2434,10 @@ mod tests {
(ii(14, 18), true),
],
);
assert_insert_merge_overlapping(
basic(),
(uu(), false),
assert_insert_merge_overlapping(basic(), (uu(), false), uu(), [(
uu(),
[(uu(), false)],
);
false,
)]);
}
fn assert_insert_merge_overlapping<const N: usize>(
mut before: DiscreteRangeMap<i8, InclusiveInterval<i8>, bool>,
@ -2592,15 +2579,12 @@ mod tests {
map.insert_strict(r3, "range3").unwrap();
let r: Vec<_> = map.drain().collect();
assert_eq!(
&r,
&[
(ie(0, 10), "range0"),
(ie(20, 30), "range1"),
(ie(40, 50), "range2"),
(ie(60, 70), "range3"),
]
);
assert_eq!(&r, &[
(ie(0, 10), "range0"),
(ie(20, 30), "range1"),
(ie(40, 50), "range2"),
(ie(60, 70), "range3"),
]);
assert!(map.is_empty());
}
@ -2619,14 +2603,11 @@ mod tests {
let r: Vec<_> = map.cut_with_origin(ie(5, 45)).collect();
assert_eq!(
&r,
&[
(ie(0, 10), ie(5, 10), "range0"),
(ie(20, 30), ie(20, 30), "range1"),
(ie(40, 50), ie(40, 45), "range2")
]
);
assert_eq!(&r, &[
(ie(0, 10), ie(5, 10), "range0"),
(ie(20, 30), ie(20, 30), "range1"),
(ie(40, 50), ie(40, 45), "range2")
]);
}
#[test]

View File

@ -101,7 +101,7 @@ where
pub fn gaps_untrimmed<'a, Q>(
&'a self,
range: Q,
) -> impl Iterator<Item = K> + '_
) -> impl Iterator<Item = K> + 'a
where
Q: RangeType<I> + 'a,
{
@ -111,7 +111,7 @@ where
pub fn gaps_trimmed<'a, Q>(
&'a self,
range: Q,
) -> impl Iterator<Item = K> + '_
) -> impl Iterator<Item = K> + 'a
where
Q: RangeType<I> + 'a,
{