use crate::{
CheckSortedDisjoint, Integer, IntoKeys, Keys, RangeSetBlaze, SortedDisjoint,
iter_map::{IntoIterMap, IterMap},
map_op, map_unary_op,
range_values::{IntoRangeValuesIter, MapIntoRangesIter, MapRangesIter, RangeValuesIter},
set::extract_range,
sorted_disjoint_map::{IntoString, SortedDisjointMap},
sym_diff_iter_map::SymDiffIterMap,
unsorted_priority_map::{SortedDisjointMapWithLenSoFar, UnsortedPriorityMap},
values::{IntoValues, Values},
};
#[cfg(feature = "std")]
use alloc::sync::Arc;
use alloc::vec::Vec;
use alloc::{collections::BTreeMap, rc::Rc};
use core::{
borrow::Borrow,
cmp::{Ordering, max},
convert::From,
fmt, mem,
ops::{BitOr, BitOrAssign, Index, RangeBounds, RangeInclusive},
panic,
};
use num_traits::{One, Zero};
const STREAM_OVERHEAD: usize = 10;
pub trait ValueRef: Borrow<Self::Target> + Clone {
type Target: Eq + Clone;
fn into_value(self) -> Self::Target;
}
impl<V> ValueRef for &V
where
V: Eq + Clone,
{
type Target = V;
#[inline]
fn into_value(self) -> Self::Target {
self.clone()
}
}
impl<V> ValueRef for Rc<V>
where
V: Eq + Clone,
{
type Target = V;
#[inline]
fn into_value(self) -> Self::Target {
Self::try_unwrap(self).unwrap_or_else(|rc| (*rc).clone())
}
}
#[cfg(feature = "std")]
impl<V> ValueRef for Arc<V>
where
V: Eq + Clone,
{
type Target = V;
#[inline]
fn into_value(self) -> Self::Target {
Self::try_unwrap(self).unwrap_or_else(|arc| (*arc).clone())
}
}
#[expect(clippy::redundant_pub_crate)]
#[derive(Clone, Hash, Default, PartialEq, Eq, Debug)]
pub(crate) struct EndValue<T, V> {
pub(crate) end: T,
pub(crate) value: V,
}
#[derive(Clone, Hash, PartialEq)]
pub struct RangeMapBlaze<T: Integer, V> {
pub(crate) len: <T as Integer>::SafeLen,
pub(crate) btree_map: BTreeMap<T, EndValue<T, V>>,
}
impl<T: Integer, V: Eq + Clone> Default for RangeMapBlaze<T, V> {
fn default() -> Self {
Self {
len: <T as Integer>::SafeLen::zero(),
btree_map: BTreeMap::new(),
}
}
}
impl<T: Integer, V: Eq + Clone + fmt::Debug> fmt::Debug for RangeMapBlaze<T, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.range_values().into_string())
}
}
impl<T: Integer, V: Eq + Clone + fmt::Debug> fmt::Display for RangeMapBlaze<T, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.range_values().into_string())
}
}
impl<T: Integer, V: Eq + Clone> RangeMapBlaze<T, V> {
pub fn iter(&self) -> IterMap<T, &V, RangeValuesIter<'_, T, V>> {
IterMap::new(self.range_values())
}
pub fn keys(&self) -> Keys<T, &V, RangeValuesIter<'_, T, V>> {
Keys::new(self.range_values())
}
#[inline]
pub fn into_keys(self) -> IntoKeys<T, V> {
IntoKeys::new(self.btree_map.into_iter())
}
pub fn values(&self) -> Values<T, &V, RangeValuesIter<'_, T, V>> {
Values::new(self.range_values())
}
#[inline]
pub fn into_values(self) -> IntoValues<T, V> {
IntoValues::new(self.btree_map.into_iter())
}
#[must_use]
pub fn first_key_value(&self) -> Option<(T, &V)> {
self.btree_map
.first_key_value()
.map(|(k, end_value)| (*k, &end_value.value))
}
pub fn get(&self, key: T) -> Option<&V> {
self.get_key_value(key).map(|(_, value)| value)
}
pub fn get_key_value(&self, key: T) -> Option<(T, &V)> {
self.btree_map
.range(..=key)
.next_back()
.and_then(|(_start, end_value)| {
if key <= end_value.end {
Some((key, &end_value.value))
} else {
None
}
})
}
#[must_use]
pub fn last_key_value(&self) -> Option<(T, &V)> {
self.btree_map
.last_key_value()
.map(|(_, end_value)| (end_value.end, &end_value.value))
}
pub fn from_sorted_disjoint_map<VR, I>(iter: I) -> Self
where
VR: ValueRef<Target = V>,
I: SortedDisjointMap<T, VR>,
{
let mut iter_with_len = SortedDisjointMapWithLenSoFar::new(iter);
let btree_map: BTreeMap<T, EndValue<T, VR::Target>> = (&mut iter_with_len).collect();
Self {
btree_map,
len: iter_with_len.len_so_far(),
}
}
#[allow(dead_code)]
#[must_use]
pub(crate) fn len_slow(&self) -> <T as Integer>::SafeLen {
Self::btree_map_len(&self.btree_map)
}
pub fn append(&mut self, other: &mut Self) {
let original_other_btree_map = core::mem::take(&mut other.btree_map);
other.len = <T as Integer>::SafeLen::zero();
for (start, end_value) in original_other_btree_map {
self.internal_add(start..=end_value.end, end_value.value);
}
}
pub fn clear(&mut self) {
self.btree_map.clear();
self.len = <T as Integer>::SafeLen::zero();
}
#[must_use]
#[inline]
pub fn is_empty(&self) -> bool {
self.btree_map.is_empty()
}
#[must_use]
#[inline]
pub fn is_universal(&self) -> bool {
self.len() == T::safe_len(&(T::min_value()..=T::max_value()))
}
pub fn contains_key(&self, key: T) -> bool {
self.btree_map
.range(..=key)
.next_back()
.is_some_and(|(_, end_value)| key <= end_value.end)
}
fn delete_extra(&mut self, internal_range: &RangeInclusive<T>) {
let (start, end) = internal_range.clone().into_inner();
let mut after = self.btree_map.range_mut(start..);
let (start_after, end_value_after) = after
.next()
.expect("Real Assert: There will always be a next");
debug_assert!(start == *start_after && end == end_value_after.end);
let mut end_new = end;
let mut end_new_same_val = end;
let delete_list = after
.map_while(|(start_delete, end_value_delete)| {
if end_value_after.value == end_value_delete.value {
if *start_delete <= end || *start_delete <= end.add_one() {
end_new_same_val = max(end_new_same_val, end_value_delete.end);
end_new = max(end_new, end_value_delete.end);
self.len -= T::safe_len(&(*start_delete..=end_value_delete.end));
Some(*start_delete)
} else {
None
}
} else if *start_delete <= end {
end_new = max(end_new, end_value_delete.end);
self.len -= T::safe_len(&(*start_delete..=end_value_delete.end));
Some(*start_delete)
} else {
None
}
})
.collect::<Vec<_>>();
if end >= end_new {
for start in delete_list {
self.btree_map.remove(&start);
}
} else if end_new_same_val > end {
self.len += T::safe_len(&(end..=end_new.sub_one()));
debug_assert!(*start_after <= end_new);
end_value_after.end = end_new;
for start in delete_list {
self.btree_map.remove(&start);
}
} else {
for &start in &delete_list[0..delete_list.len() - 1] {
self.btree_map.remove(&start);
}
let last = self
.btree_map
.remove(&delete_list[delete_list.len() - 1])
.expect("Real Assert: There will always be a last");
let last_end = last.end;
debug_assert!(end.add_one() <= last.end); self.btree_map.insert(end.add_one(), last);
self.len += T::safe_len(&(end.add_one()..=last_end));
}
}
pub fn insert(&mut self, key: T, value: V) -> Option<V> {
let old = self.get(key).cloned();
self.internal_add(key..=key, value);
old
}
#[allow(clippy::manual_assert)] pub fn range<R>(&self, range: R) -> IntoIterMap<T, V>
where
R: RangeBounds<T>,
{
let (start, end) = extract_range(range);
assert!(
start <= end,
"start (inclusive) must be less than or equal to end (inclusive)"
);
let bounds = CheckSortedDisjoint::new([start..=end]);
let range_map_blaze = self
.range_values()
.map_and_set_intersection(bounds)
.into_range_map_blaze();
range_map_blaze.into_iter()
}
pub fn ranges_insert<R>(&mut self, range: R, value: V) -> bool
where
R: RangeBounds<T>,
{
let len_before = self.len;
let (start, end) = extract_range(range);
self.internal_add(start..=end, value);
self.len != len_before
}
#[allow(clippy::missing_panics_doc)]
pub fn remove(&mut self, key: T) -> Option<V> {
let (start_ref, end_value_mut) = self.btree_map.range_mut(..=key).next_back()?;
let end = end_value_mut.end;
if end < key {
return None;
}
let start = *start_ref;
debug_assert!(start <= key, "Real Assert: start <= key");
self.len -= <T::SafeLen>::one();
let value = if start == key {
self.btree_map
.remove(&start)
.expect("Real Assert: There will always be a start")
.value
} else {
debug_assert!(start < key, "Real Assert: start < key");
end_value_mut.end = key.sub_one();
end_value_mut.value.clone()
};
if key < end {
self.btree_map.insert(
key.add_one(),
EndValue {
end,
value: value.clone(),
},
);
}
Some(value)
}
#[must_use]
pub fn split_off(&mut self, key: T) -> Self {
let old_len = self.len;
let old_btree_len = self.btree_map.len();
let mut new_btree = self.btree_map.split_off(&key);
let Some(last_entry) = self.btree_map.last_entry() else {
self.len = T::SafeLen::zero();
return Self {
btree_map: new_btree,
len: old_len,
};
};
let end_value = last_entry.get();
let end = end_value.end;
if end < key {
let (a_len, b_len) = self.two_element_lengths(old_btree_len, &new_btree, old_len);
self.len = a_len;
return Self {
btree_map: new_btree,
len: b_len,
};
}
let value = end_value.value.clone();
last_entry.into_mut().end = key.sub_one();
new_btree.insert(key, EndValue { end, value });
let (a_len, b_len) = self.two_element_lengths(old_btree_len, &new_btree, old_len);
self.len = a_len;
Self {
btree_map: new_btree,
len: b_len,
}
}
fn two_element_lengths(
&self,
old_btree_len: usize,
new_btree: &BTreeMap<T, EndValue<T, V>>,
mut old_len: <T as Integer>::SafeLen,
) -> (<T as Integer>::SafeLen, <T as Integer>::SafeLen) {
if old_btree_len / 2 < new_btree.len() {
let a_len = Self::btree_map_len(&self.btree_map);
old_len -= a_len;
(a_len, old_len)
} else {
let b_len = Self::btree_map_len(new_btree);
old_len -= b_len;
(old_len, b_len)
}
}
fn btree_map_len(btree_map: &BTreeMap<T, EndValue<T, V>>) -> T::SafeLen {
btree_map.iter().fold(
<T as Integer>::SafeLen::zero(),
|acc, (start, end_value)| acc + T::safe_len(&(*start..=end_value.end)),
)
}
#[inline]
fn has_gap(end_before: T, start: T) -> bool {
end_before
.checked_add_one()
.is_some_and(|end_before_succ| end_before_succ < start)
}
#[cfg(never)]
#[inline]
fn adjust_touching_for_insert(
&mut self,
stored_start: T,
stored_end_value: EndValue<T, V>,
range: &mut RangeInclusive<T>,
value: &V,
) {
let stored_value = &stored_end_value.value;
let stored_end = stored_end_value.end;
if stored_value == value {
let new_start = min(*range.start(), stored_start);
let new_end = max(*range.end(), stored_end);
*range = new_start..=new_end;
self.len -= T::safe_len(&(stored_start..=stored_end));
self.btree_map.remove(&stored_start);
return;
}
let overlaps = stored_start <= *range.end() && stored_end >= *range.start();
if overlaps {
self.len -= T::safe_len(&(stored_start..=stored_end));
self.btree_map.remove(&stored_start);
if stored_start < *range.start() {
let left_end = range.start().sub_one(); self.len += T::safe_len(&(stored_start..=left_end));
self.btree_map.insert(
stored_start,
EndValue {
end: left_end,
value: stored_value.clone(),
},
);
}
if stored_end > *range.end() {
let right_start = range.end().add_one();
self.len += T::safe_len(&(right_start..=stored_end));
self.btree_map.insert(
right_start,
EndValue {
end: stored_end,
value: stored_end_value.value, },
);
}
}
}
#[cfg(never)]
pub(crate) fn internal_add(&mut self, mut range: RangeInclusive<T>, value: V) {
use core::ops::Bound::{Included, Unbounded};
let start = *range.start();
let end = *range.end();
if end < start {
return;
}
let mut candidates = self
.btree_map
.range::<T, _>((Unbounded, Included(&start))) .rev()
.take(2)
.filter(|(_stored_start, stored_end_value)| {
let end = stored_end_value.end;
end >= start || (start != T::min_value() && end >= start.sub_one())
});
if let Some(mut candidate) = candidates.next() {
if let Some(another_candidate) = candidates.next() {
candidate = another_candidate;
}
let stored_start: T = *candidate.0;
let stored_end_value: EndValue<T, V> = candidate.1.clone();
self.adjust_touching_for_insert(
stored_start,
stored_end_value,
&mut range, &value,
);
}
loop {
let next_entry = self
.btree_map
.range::<T, _>((Included(range.start()), Unbounded))
.next();
let Some((&stored_start, stored_end_value)) = next_entry else {
break; };
let second_last_possible_start = *range.end();
let maybe_latest_start = if second_last_possible_start == T::max_value() {
None
} else {
Some(second_last_possible_start.add_one())
};
if maybe_latest_start.map_or(false, |latest| stored_start > latest) {
break; }
if let Some(latest) = maybe_latest_start {
if stored_start == latest && stored_end_value.value != value {
break; }
}
let end_value_clone = stored_end_value.clone();
self.adjust_touching_for_insert(stored_start, end_value_clone, &mut range, &value);
}
let start_key = *range.start();
let end_key = *range.end();
self.btree_map.insert(
start_key,
EndValue {
end: end_key,
value,
},
);
debug_assert!(self.len == self.len_slow());
}
#[cfg(never)]
pub(crate) fn internal_add(&mut self, mut range: RangeInclusive<T>, value: V) {
use core::ops::Bound::{Included, Unbounded};
use std::collections::btree_map::CursorMut;
let start = *range.start();
let end = *range.end();
if end < start {
return;
}
let mut candidates = self
.btree_map
.range::<T, _>((Unbounded, Included(&start))) .rev()
.take(2)
.filter(|(_stored_start, stored_end_value)| {
let end = stored_end_value.end;
end >= start || (start != T::min_value() && end >= start.sub_one())
});
if let Some(mut candidate) = candidates.next() {
if let Some(another_candidate) = candidates.next() {
candidate = another_candidate;
}
let stored_start: T = *candidate.0;
let stored_end_value: EndValue<T, V> = candidate.1.clone();
self.adjust_touching_for_insert(
stored_start,
stored_end_value,
&mut range, &value,
);
}
loop {
let mut cur: CursorMut<'_, T, EndValue<T, V>> = self
.btree_map
.lower_bound_mut(Bound::Included(range.start()));
let Some(peeked) = cur.peek_next() else {
break;
};
let (&stored_start, maybe_end_value) = peeked;
let last_ok = *range.end();
if last_ok == T::max_value() {
if stored_start > last_ok {
break;
}
} else {
let latest = last_ok.add_one();
if stored_start > latest {
break;
}
if stored_start == latest && maybe_end_value.value != value {
break;
}
}
let cloned = maybe_end_value.clone();
cur.remove_next();
self.adjust_touching_for_insert(stored_start, cloned, &mut range, &value);
}
let start_key = *range.start();
let end_key = *range.end();
self.btree_map.insert(
start_key,
EndValue {
end: end_key,
value, },
);
self.len += T::safe_len(&(start_key..=end_key));
debug_assert!(self.len == self.len_slow());
}
#[allow(clippy::too_many_lines)]
#[allow(clippy::cognitive_complexity)]
pub(crate) fn internal_add(&mut self, range: RangeInclusive<T>, value: V) {
let (start, end) = range.clone().into_inner();
if end < start {
return;
}
let mut before_iter = self.btree_map.range_mut(..=start).rev();
let Some((start_before, end_value_before)) = before_iter.next() else {
self.internal_add2(&range, value);
return;
};
let start_before = *start_before;
let end_before = end_value_before.end;
if Self::has_gap(end_before, start) {
self.internal_add2(&range, value);
return;
}
let before_contains_new = end_before >= end;
let same_value = value == end_value_before.value;
if before_contains_new && same_value {
return;
}
if !before_contains_new && same_value {
self.len += T::safe_len(&(end_before..=end.sub_one()));
debug_assert!(start_before <= end); end_value_before.end = end;
self.delete_extra(&(start_before..=end));
return;
}
let same_start = start == start_before;
if !before_contains_new && !same_value && same_start {
let interesting_before_before = match before_iter.next() {
Some(bb) if bb.1.end.add_one() == start && bb.1.value == value => Some(bb),
_ => None,
};
if let Some(bb) = interesting_before_before {
debug_assert!(!before_contains_new && !same_value && same_start);
self.len += T::safe_len(&(bb.1.end.add_one()..=end));
let bb_start = *bb.0;
debug_assert!(bb_start <= end); bb.1.end = end;
self.delete_extra(&(bb_start..=end));
return;
}
debug_assert!(!same_value && same_start && interesting_before_before.is_none());
debug_assert!(end_before < end); self.len += T::safe_len(&(end_before.add_one()..=end));
end_value_before.end = end;
end_value_before.value = value;
self.delete_extra(&range);
return;
}
if !before_contains_new && !same_value && !same_start {
if start <= end_before {
self.len -= T::safe_len(&(start..=end_before));
debug_assert!(start_before <= start.sub_one()); end_value_before.end = start.sub_one(); }
self.internal_add2(&range, value);
return;
}
debug_assert!(before_contains_new && !same_value);
let same_end = end == end_before;
if !same_start && !same_end {
debug_assert!(before_contains_new && !same_value);
debug_assert!(start_before < start && end < end_before);
debug_assert!(start_before <= start.sub_one()); end_value_before.end = start.sub_one();
let before_value = end_value_before.value.clone();
debug_assert!(start <= end); self.btree_map.insert(start, EndValue { end, value });
debug_assert!(end.add_one() <= end_before); self.btree_map.insert(
end.add_one(),
EndValue {
end: end_before,
value: before_value,
},
);
return;
}
if !same_start && same_end {
debug_assert!(before_contains_new && !same_value);
debug_assert!(start_before < start && end == end_before);
debug_assert!(start_before <= start.sub_one()); end_value_before.end = start.sub_one();
debug_assert!(start <= end); self.btree_map.insert(start, EndValue { end, value });
self.delete_extra(&(start..=end));
return;
}
let interesting_before_before = match before_iter.next() {
Some(bb) if bb.1.end.add_one() == start && bb.1.value == value => Some(bb),
_ => None,
};
if let Some(bb) = interesting_before_before {
debug_assert!(before_contains_new && !same_value && same_start);
self.len += T::safe_len(&(bb.1.end.add_one()..=end));
let bb_start = *bb.0;
debug_assert!(bb_start <= end); bb.1.end = end;
self.delete_extra(&(bb_start..=end));
return;
}
if same_end {
debug_assert!(!same_value && same_start && interesting_before_before.is_none());
end_value_before.value = value;
self.delete_extra(&(start_before..=end));
return;
}
{
debug_assert!(
!same_value
&& same_start
&& end < end_before
&& interesting_before_before.is_none()
);
let value_before = core::mem::replace(&mut end_value_before.value, value);
debug_assert!(start_before <= end); end_value_before.end = end;
debug_assert!(end.add_one() <= end_before); self.btree_map.insert(
end.add_one(),
EndValue {
end: end_before,
value: value_before,
},
);
}
}
#[inline]
fn internal_add2(&mut self, internal_range: &RangeInclusive<T>, value: V) {
let (start, end) = internal_range.clone().into_inner();
let end_value = EndValue { end, value };
debug_assert!(start <= end_value.end); let was_there = self.btree_map.insert(start, end_value);
debug_assert!(was_there.is_none()); self.delete_extra(internal_range);
self.len += T::safe_len(internal_range);
}
#[must_use]
pub const fn len(&self) -> <T as Integer>::SafeLen {
self.len
}
#[inline]
#[must_use]
pub fn new() -> Self {
Self {
btree_map: BTreeMap::new(),
len: <T as Integer>::SafeLen::zero(),
}
}
pub fn extend_simple<I>(&mut self, iter: I)
where
I: IntoIterator<Item = (RangeInclusive<T>, V)>,
{
let iter = iter.into_iter();
for (range, value) in iter {
self.internal_add(range, value);
}
}
#[inline]
pub fn extend_from(&mut self, other: Self) {
for (start, end_value) in other.btree_map {
let range = start..=end_value.end;
self.internal_add(range, end_value.value);
}
}
#[inline]
pub fn extend_with(&mut self, other: &Self) {
for (start, end_value) in &other.btree_map {
let range = *start..=end_value.end;
self.internal_add(range, end_value.value.clone());
}
}
pub fn pop_first(&mut self) -> Option<(T, V)>
where
V: Clone,
{
let entry = self.btree_map.first_entry()?;
let (start, end_value) = entry.remove_entry();
self.len -= T::SafeLen::one();
if start == end_value.end {
Some((start, end_value.value))
} else {
let value = end_value.value.clone();
self.btree_map.insert(start.add_one(), end_value);
Some((start, value))
}
}
pub fn pop_last(&mut self) -> Option<(T, V)> {
let mut entry = self.btree_map.last_entry()?;
let start = *entry.key();
self.len -= T::SafeLen::one();
let end = entry.get().end;
if start == end {
let value = entry.remove_entry().1.value;
Some((end, value))
} else {
let value = entry.get().value.clone();
entry.get_mut().end.assign_sub_one();
Some((end, value))
}
}
pub fn range_values(&self) -> RangeValuesIter<'_, T, V> {
RangeValuesIter::new(&self.btree_map)
}
pub fn into_range_values(self) -> IntoRangeValuesIter<T, V> {
IntoRangeValuesIter::new(self.btree_map)
}
pub fn ranges(&self) -> MapRangesIter<'_, T, V> {
MapRangesIter::new(self.btree_map.iter())
}
pub fn into_ranges(self) -> MapIntoRangesIter<T, V> {
MapIntoRangesIter::new(self.btree_map.into_iter())
}
#[must_use]
pub fn ranges_len(&self) -> usize {
self.btree_map.len()
}
#[must_use]
pub fn complement_with(&self, value: &V) -> Self {
self.ranges()
.complement()
.map(|r| (r, value.clone()))
.collect()
}
#[must_use]
pub fn range_values_len(&self) -> usize {
self.btree_map.len()
}
pub fn retain<F>(&mut self, f: F)
where
F: Fn(&T, &V) -> bool,
{
*self = self.iter().filter(|(k, v)| f(k, v)).collect();
}
pub fn ranges_retain<F>(&mut self, mut f: F)
where
F: FnMut(&RangeInclusive<T>, &V) -> bool,
{
self.btree_map.retain(|start, end_value| {
let range = *start..=end_value.end;
if f(&range, &end_value.value) {
true
} else {
self.len -= T::safe_len(&range);
false
}
});
}
}
impl<T, V> IntoIterator for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone,
{
type Item = (T, V);
type IntoIter = IntoIterMap<T, V>;
fn into_iter(self) -> IntoIterMap<T, V> {
IntoIterMap::new(self.btree_map.into_iter())
}
}
impl<'a, T: Integer, V: Eq + Clone> IntoIterator for &'a RangeMapBlaze<T, V> {
type IntoIter = IterMap<T, &'a V, RangeValuesIter<'a, T, V>>;
type Item = (T, &'a V);
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<T: Integer, V: Eq + Clone> BitOr<Self> for RangeMapBlaze<T, V> {
type Output = Self;
fn bitor(self, other: Self) -> Self {
let b_len = other.ranges_len();
if b_len == 0 {
return self;
}
let a_len = self.ranges_len();
if a_len == 0 {
return other;
}
if much_greater_than(a_len, b_len) {
return small_b_over_a(self, other);
}
if much_greater_than(b_len, a_len) {
return small_a_under_b(self, other);
}
(self.into_range_values() | other.into_range_values()).into_range_map_blaze()
}
}
impl<T: Integer, V: Eq + Clone> BitOr<&Self> for RangeMapBlaze<T, V> {
type Output = Self;
fn bitor(self, other: &Self) -> Self {
let b_len = other.ranges_len();
if b_len == 0 {
return self;
}
let a_len = self.ranges_len();
if a_len == 0 {
return other.clone();
}
if much_greater_than(a_len, b_len) {
return small_b_over_a(self, other.clone());
}
if much_greater_than(b_len, a_len) {
return small_a_under_b(self, other.clone());
}
(self.range_values() | other.range_values()).into_range_map_blaze()
}
}
impl<T: Integer, V: Eq + Clone> BitOr<RangeMapBlaze<T, V>> for &RangeMapBlaze<T, V> {
type Output = RangeMapBlaze<T, V>;
fn bitor(self, other: RangeMapBlaze<T, V>) -> RangeMapBlaze<T, V> {
let a_len = self.ranges_len();
if a_len == 0 {
return other;
}
let b_len = other.ranges_len();
if b_len == 0 {
return self.clone();
}
if much_greater_than(b_len, a_len) {
return small_a_under_b(self.clone(), other);
}
if much_greater_than(a_len, b_len) {
return small_b_over_a(self.clone(), other);
}
(self.range_values() | other.range_values()).into_range_map_blaze()
}
}
impl<T: Integer, V: Eq + Clone> BitOr<&RangeMapBlaze<T, V>> for &RangeMapBlaze<T, V> {
type Output = RangeMapBlaze<T, V>;
fn bitor(self, other: &RangeMapBlaze<T, V>) -> RangeMapBlaze<T, V> {
let a_len = self.ranges_len();
if a_len == 0 {
return other.clone();
}
let b_len = other.ranges_len();
if b_len == 0 {
return self.clone();
}
if much_greater_than(a_len, b_len) {
return small_b_over_a(self.clone(), other.clone());
}
if much_greater_than(b_len, a_len) {
return small_a_under_b(self.clone(), other.clone());
}
(self.range_values() | other.range_values()).into_range_map_blaze()
}
}
map_op!(
BitAnd bitand,
RangeMapBlaze<T, V>,
"placeholder",
|a, b| {
b.into_range_values()
.map_and_set_intersection(a.into_ranges())
.into_range_map_blaze()
},
|a, &b| {
b.range_values()
.map_and_set_intersection(a.into_ranges())
.into_range_map_blaze()
},
|&a, b| {
b.into_range_values()
.map_and_set_intersection(a.ranges())
.into_range_map_blaze()
},
|&a, &b| {
b.range_values()
.map_and_set_intersection(a.ranges())
.into_range_map_blaze()
},
);
map_op!(
BitAnd bitand,
RangeSetBlaze<T>,
"placeholder",
|a, b| {
a.into_range_values()
.map_and_set_intersection(b.into_ranges())
.into_range_map_blaze()
},
|a, &b| {
a.into_range_values()
.map_and_set_intersection(b.ranges())
.into_range_map_blaze()
},
|&a, b| {
a.range_values()
.map_and_set_intersection(b.into_ranges())
.into_range_map_blaze()
},
|&a, &b| {
a.range_values()
.map_and_set_intersection(b.ranges())
.into_range_map_blaze()
},
);
map_op!(
BitXor bitxor, RangeMapBlaze<T, V>,
"placeholder",
|a, b| {
SymDiffIterMap::new2(
a.into_range_values(),
b.into_range_values(),
)
.into_range_map_blaze()
},
|a, &b| {
SymDiffIterMap::new2(
a.range_values(),
b.range_values(),
)
.into_range_map_blaze()
},
|&a, b| {
SymDiffIterMap::new2(
a.range_values(),
b.range_values(),
)
.into_range_map_blaze()
},
|&a, &b| {
SymDiffIterMap::new2(
a.range_values(),
b.range_values(),
)
.into_range_map_blaze()
},
);
map_op!(
Sub sub, RangeMapBlaze<T, V>,
"placeholder",
|a, b| {
a.into_range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
|a, &b| {
a.into_range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
|&a, b| {
a.range_values()
.map_and_set_difference(b.into_ranges())
.into_range_map_blaze()
},
|&a, &b| {
a.range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
);
map_op!(
Sub sub, RangeSetBlaze<T>,
"placeholder",
|a, b| {
a.into_range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
|a, &b| {
a.into_range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
|&a, b| {
a.range_values()
.map_and_set_difference(b.into_ranges())
.into_range_map_blaze()
},
|&a, &b| {
a.range_values()
.map_and_set_difference(b.ranges())
.into_range_map_blaze()
},
);
map_unary_op!(
Not not, crate::set::RangeSetBlaze<T>,
"placeholder",
|&m| {
m.ranges()
.complement()
.into_range_set_blaze()
}
);
impl<T, V> Extend<(T, V)> for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone,
{
#[inline]
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = (T, V)>,
{
let iter = iter.into_iter();
for priority in UnsortedPriorityMap::new(iter.map(|(r, v)| (r..=r, Rc::new(v)))) {
let (range, value) = priority.into_range_value();
let value: V = Rc::try_unwrap(value).unwrap_or_else(|_| unreachable!());
self.internal_add(range, value);
}
}
}
impl<T, V> Extend<(RangeInclusive<T>, V)> for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone,
{
#[inline]
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = (RangeInclusive<T>, V)>,
{
let iter = iter.into_iter();
for priority in UnsortedPriorityMap::new(iter.map(|(r, v)| (r, Rc::new(v)))) {
let (range, value) = priority.into_range_value();
let value = Rc::try_unwrap(value).unwrap_or_else(|_| unreachable!());
self.internal_add(range, value);
}
}
}
impl<T, V, const N: usize> From<[(T, V); N]> for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone,
{
fn from(arr: [(T, V); N]) -> Self {
arr.into_iter().collect()
}
}
impl<T: Integer, V: Eq + Clone> Index<T> for RangeMapBlaze<T, V> {
type Output = V;
#[inline]
#[allow(clippy::manual_assert)] fn index(&self, index: T) -> &Self::Output {
self.get(index).unwrap_or_else(|| {
panic!("no entry found for key");
})
}
}
impl<T, V> PartialOrd for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone + Ord,
{
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl<T, V> Ord for RangeMapBlaze<T, V>
where
T: Integer,
V: Eq + Clone + Ord,
{
#[inline]
fn cmp(&self, other: &Self) -> Ordering {
let mut a = self.range_values();
let mut b = other.range_values();
let mut a_rx = a.next();
let mut b_rx = b.next();
loop {
match (a_rx, &b_rx) {
(Some(_), None) => return Ordering::Greater,
(None, Some(_)) => return Ordering::Less,
(None, None) => return Ordering::Equal,
(Some((a_r, a_v)), Some((b_r, b_v))) => {
match a_r.start().cmp(b_r.start()) {
Ordering::Greater => return Ordering::Greater,
Ordering::Less => return Ordering::Less,
Ordering::Equal => { }
}
match a_v.cmp(b_v) {
Ordering::Less => return Ordering::Less,
Ordering::Greater => return Ordering::Greater,
Ordering::Equal => { }
}
match a_r.end().cmp(b_r.end()) {
Ordering::Less => {
a_rx = a.next();
b_rx = Some(((*a_r.end()).add_one()..=*b_r.end(), b_v));
}
Ordering::Greater => {
a_rx = Some(((*b_r.end()).add_one()..=*a_r.end(), a_v));
b_rx = b.next();
}
Ordering::Equal => {
a_rx = a.next();
b_rx = b.next();
}
}
}
}
}
}
}
impl<T: Integer, V: Eq + Clone> Eq for RangeMapBlaze<T, V> {}
impl<T: Integer, V: Eq + Clone> BitOrAssign<&Self> for RangeMapBlaze<T, V> {
fn bitor_assign(&mut self, other: &Self) {
let original_self = mem::take(self); *self = original_self | other; }
}
impl<T: Integer, V: Eq + Clone> BitOrAssign<Self> for RangeMapBlaze<T, V> {
fn bitor_assign(&mut self, other: Self) {
*self = mem::take(self) | other;
}
}
#[inline]
fn much_greater_than(a_len: usize, b_len: usize) -> bool {
let a_len_log2_plus_one: usize = a_len
.checked_ilog2()
.map_or(0, |log| log.try_into().expect("log2 fits usize"))
+ 1;
b_len * a_len_log2_plus_one < STREAM_OVERHEAD * a_len + b_len
}
#[inline]
fn small_b_over_a<T: Integer, V: Eq + Clone>(
mut a: RangeMapBlaze<T, V>,
b: RangeMapBlaze<T, V>,
) -> RangeMapBlaze<T, V> {
debug_assert!(much_greater_than(a.ranges_len(), b.ranges_len()));
for (start, end_value) in b.btree_map {
a.internal_add(start..=(end_value.end), end_value.value);
}
a
}
#[inline]
fn small_a_under_b<T: Integer, V: Eq + Clone>(
a: RangeMapBlaze<T, V>,
mut b: RangeMapBlaze<T, V>,
) -> RangeMapBlaze<T, V> {
debug_assert!(much_greater_than(b.ranges_len(), a.ranges_len()));
let difference = a - &b;
b.extend_simple(
difference
.btree_map
.into_iter()
.map(|(start, v)| (start..=v.end, v.value)),
);
b
}