mod internal_node;
mod leaf;
mod leaf_node;
mod node;
use std::fmt;
use std::iter::FusedIterator;
use std::marker::PhantomData;
use std::ops::Bound::{Excluded, Included, Unbounded};
use std::ops::RangeBounds;
use std::panic::UnwindSafe;
use std::pin::pin;
use std::sync::atomic::Ordering::{AcqRel, Acquire};
use sdd::{AtomicRaw, PrivateCollector, RawPtr};
use crate::utils::{
AsyncPager, deref_unchecked, drop_in_place, fake_ref, get_owned, likely, retire, undefined,
};
use crate::{Comparable, Guard};
use leaf::Iter as LeafIter;
use leaf::RevIter as LeafRevIter;
use leaf::{InsertResult, Leaf, RemoveResult};
use node::Node;
pub struct TreeIndex<K, V> {
root: AtomicRaw<Node<K, V>>,
private_collector: PrivateCollector,
}
pub struct Iter<'t, K, V> {
root: &'t AtomicRaw<Node<K, V>>,
forward: Option<LeafIter<'t, K, V>>,
backward: Option<LeafRevIter<'t, K, V>>,
guard: &'t Guard,
}
pub struct Range<'t, K, V, Q: ?Sized, R: RangeBounds<Q>> {
root: &'t AtomicRaw<Node<K, V>>,
forward: Option<LeafIter<'t, K, V>>,
backward: Option<LeafRevIter<'t, K, V>>,
bounds: R,
check_upper_bound: bool,
check_lower_bound: bool,
guard: &'t Guard,
query: PhantomData<fn() -> Q>,
}
pub enum Proximity<'t, K, V> {
Exact(Iter<'t, K, V>),
Between(Iter<'t, K, V>),
Smaller(Iter<'t, K, V>),
Larger(Iter<'t, K, V>),
Empty,
}
impl<K, V> TreeIndex<K, V> {
#[cfg(not(feature = "loom"))]
#[inline]
#[must_use]
pub const fn new() -> Self {
Self {
root: AtomicRaw::null(),
private_collector: PrivateCollector::new(),
}
}
#[cfg(feature = "loom")]
#[inline]
#[must_use]
pub fn new() -> Self {
Self {
root: AtomicRaw::null(),
private_collector: PrivateCollector::new(),
}
}
#[inline]
pub fn clear(&self) {
let guard = Guard::new();
retire::<(K, V), _>(
self.root.swap(RawPtr::null(), Acquire, &guard),
&self.private_collector,
&guard,
);
}
#[inline]
#[must_use]
pub fn depth(&self) -> usize {
let guard = Guard::new();
deref_unchecked(self.root.load(Acquire, &guard)).map_or(0, |root| root.depth(1, &guard))
}
}
impl<K, V> TreeIndex<K, V>
where
K: Clone + Ord,
{
#[inline]
pub async fn insert_async(&self, mut key: K, mut val: V) -> Result<(), (K, V)> {
let mut pinned_pager = pin!(AsyncPager::default());
loop {
{
let guard = Guard::new();
let root_ptr = self.root.load(Acquire, &guard);
if let Some(root) = deref_unchecked(root_ptr) {
match root.insert::<_, false>(
key,
val,
&self.private_collector,
&mut pinned_pager,
&guard,
) {
Ok(r) => match r {
InsertResult::Success => return Ok(()),
InsertResult::Duplicate(k, v) => {
return Err((k, v));
}
InsertResult::Full(k, v) => {
(key, val) = (k, v);
Node::split_root(
root_ptr,
&self.root,
&self.private_collector,
&mut pinned_pager,
&guard,
);
}
},
Err((k, v)) => (key, val) = (k, v),
}
} else {
let new_root_ptr = Node::new_leaf_node().into_raw();
if self
.root
.compare_exchange(RawPtr::null(), new_root_ptr, AcqRel, Acquire, &guard)
.is_err()
{
drop(get_owned(new_root_ptr));
continue;
}
}
};
pinned_pager.wait().await;
}
}
#[inline]
pub fn insert_sync(&self, mut key: K, mut val: V) -> Result<(), (K, V)> {
let guard = Guard::new();
loop {
let root_ptr = self.root.load(Acquire, &guard);
if let Some(root) = deref_unchecked(root_ptr) {
match root.insert::<(), false>(key, val, &self.private_collector, &mut (), &guard) {
Ok(r) => match r {
InsertResult::Success => return Ok(()),
InsertResult::Duplicate(k, v) => {
return Err((k, v));
}
InsertResult::Full(k, v) => {
(key, val) = (k, v);
Node::split_root(
root_ptr,
&self.root,
&self.private_collector,
&mut (),
&guard,
);
}
},
Err((k, v)) => (key, val) = (k, v),
}
} else {
let new_root_ptr = Node::new_leaf_node().into_raw();
if self
.root
.compare_exchange(RawPtr::null(), new_root_ptr, AcqRel, Acquire, &guard)
.is_err()
{
drop(get_owned(new_root_ptr));
}
}
}
}
#[inline]
pub async fn upsert_async(&self, mut key: K, mut val: V) {
let mut pinned_pager = pin!(AsyncPager::default());
loop {
{
let guard = Guard::new();
let root_ptr = self.root.load(Acquire, &guard);
if let Some(root) = deref_unchecked(root_ptr) {
match root.insert::<_, true>(
key,
val,
&self.private_collector,
&mut pinned_pager,
&guard,
) {
Ok(r) => match r {
InsertResult::Success => return,
InsertResult::Full(k, v) => {
(key, val) = (k, v);
Node::split_root(
root_ptr,
&self.root,
&self.private_collector,
&mut pinned_pager,
&guard,
);
}
InsertResult::Duplicate(..) => undefined(),
},
Err((k, v)) => (key, val) = (k, v),
}
} else {
let new_root_ptr = Node::new_leaf_node().into_raw();
if self
.root
.compare_exchange(RawPtr::null(), new_root_ptr, AcqRel, Acquire, &guard)
.is_err()
{
drop(get_owned(new_root_ptr));
continue;
}
}
};
pinned_pager.wait().await;
}
}
#[inline]
pub fn upsert_sync(&self, mut key: K, mut val: V) {
let guard = Guard::new();
loop {
let root_ptr = self.root.load(Acquire, &guard);
if let Some(root) = deref_unchecked(root_ptr) {
match root.insert::<(), true>(key, val, &self.private_collector, &mut (), &guard) {
Ok(r) => match r {
InsertResult::Success => return,
InsertResult::Full(k, v) => {
(key, val) = (k, v);
Node::split_root(
root_ptr,
&self.root,
&self.private_collector,
&mut (),
&guard,
);
}
InsertResult::Duplicate(..) => undefined(),
},
Err((k, v)) => (key, val) = (k, v),
}
} else {
let new_root_ptr = Node::new_leaf_node().into_raw();
if self
.root
.compare_exchange(RawPtr::null(), new_root_ptr, AcqRel, Acquire, &guard)
.is_err()
{
drop(get_owned(new_root_ptr));
}
}
}
}
#[inline]
pub async fn remove_async<Q>(&self, key: &Q) -> bool
where
Q: Comparable<K> + ?Sized,
{
self.remove_if_async(key, |_| true).await
}
#[inline]
pub fn remove_sync<Q>(&self, key: &Q) -> bool
where
Q: Comparable<K> + ?Sized,
{
self.remove_if_sync(key, |_| true)
}
#[inline]
pub async fn remove_if_async<Q, F: FnMut(&V) -> bool>(&self, key: &Q, mut condition: F) -> bool
where
Q: Comparable<K> + ?Sized,
{
let mut pinned_pager = pin!(AsyncPager::default());
let mut removed = false;
loop {
{
let guard = Guard::new();
if let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
if let Ok(result) = root.remove_if(
key,
&mut condition,
&self.private_collector,
&mut pinned_pager,
&guard,
) {
removed |=
result == RemoveResult::Success || result == RemoveResult::Retired;
if !root.cleanup_needed()
|| Node::cleanup_root(
&self.root,
&self.private_collector,
&mut pinned_pager,
&guard,
)
{
return removed;
}
}
} else {
return removed;
}
}
pinned_pager.wait().await;
}
}
#[inline]
pub fn remove_if_sync<Q, F: FnMut(&V) -> bool>(&self, key: &Q, mut condition: F) -> bool
where
Q: Comparable<K> + ?Sized,
{
let guard = Guard::new();
let mut removed = false;
while let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
if let Ok(result) = root.remove_if(
key,
&mut condition,
&self.private_collector,
&mut (),
&guard,
) {
removed |= result == RemoveResult::Success || result == RemoveResult::Retired;
if !root.cleanup_needed()
|| Node::cleanup_root(&self.root, &self.private_collector, &mut (), &guard)
{
return removed;
}
}
}
removed
}
#[inline]
pub async fn remove_range_async<Q, R: RangeBounds<Q>>(&self, range: R)
where
Q: Comparable<K> + ?Sized,
{
let mut pinned_pager = pin!(AsyncPager::default());
let start_unbounded = matches!(range.start_bound(), Unbounded);
loop {
{
let guard = Guard::new();
if let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
if let Ok(num_children) = root.remove_range(
&range,
start_unbounded,
None,
None,
&self.private_collector,
&mut pinned_pager,
&guard,
) {
if num_children >= 2
|| Node::cleanup_root(
&self.root,
&self.private_collector,
&mut pinned_pager,
&guard,
)
{
return;
}
} else {
Node::cleanup_root(&self.root, &self.private_collector, &mut (), &guard);
}
} else {
return;
}
}
pinned_pager.wait().await;
}
}
#[inline]
pub fn remove_range_sync<Q, R: RangeBounds<Q>>(&self, range: R)
where
Q: Comparable<K> + ?Sized,
{
let guard = Guard::new();
let start_unbounded = matches!(range.start_bound(), Unbounded);
while let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
if let Ok(num_children) = root.remove_range(
&range,
start_unbounded,
None,
None,
&self.private_collector,
&mut (),
&guard,
) {
if num_children < 2
&& !Node::cleanup_root(&self.root, &self.private_collector, &mut (), &guard)
{
continue;
}
break;
}
Node::cleanup_root(&self.root, &self.private_collector, &mut (), &guard);
}
}
#[inline]
pub fn peek<'t, Q>(&'t self, key: &Q, guard: &'t Guard) -> Option<&'t V>
where
Q: Comparable<K> + ?Sized,
{
if let Some(root) = deref_unchecked(self.root.load(Acquire, guard)) {
return root.search_value(key, guard);
}
None
}
#[inline]
pub fn peek_with<Q, R, F: FnOnce(&K, &V) -> R>(&self, key: &Q, reader: F) -> Option<R>
where
Q: Comparable<K> + ?Sized,
{
let guard = Guard::new();
self.peek_entry(key, &guard).map(|(k, v)| reader(k, v))
}
#[inline]
pub fn peek_entry<'t, Q>(&'t self, key: &Q, guard: &'t Guard) -> Option<(&'t K, &'t V)>
where
Q: Comparable<K> + ?Sized,
{
if let Some(root) = deref_unchecked(self.root.load(Acquire, guard)) {
return root.search_entry(key, guard);
}
None
}
#[inline]
pub async fn read_async<Q, R, F: FnOnce(&K, &V) -> R>(
&self,
key: &Q,
mut reader: F,
) -> Option<R>
where
Q: Comparable<K> + ?Sized,
{
let mut pinned_pager = pin!(AsyncPager::default());
loop {
{
let guard = Guard::new();
if let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
match root.read_entry(key, reader, &mut pinned_pager, &guard) {
Ok(r) => return r,
Err(f) => reader = f,
}
} else {
return None;
}
}
pinned_pager.wait().await;
}
}
#[inline]
pub fn read_sync<Q, R, F: FnOnce(&K, &V) -> R>(&self, key: &Q, mut reader: F) -> Option<R>
where
Q: Comparable<K> + ?Sized,
{
let guard = Guard::new();
loop {
if let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
match root.read_entry(key, reader, &mut (), &guard) {
Ok(r) => return r,
Err(f) => reader = f,
}
} else {
return None;
}
}
}
#[inline]
pub fn contains<Q>(&self, key: &Q) -> bool
where
Q: Comparable<K> + ?Sized,
{
self.peek(key, &Guard::new()).is_some()
}
#[inline]
pub fn len(&self) -> usize {
let guard = Guard::new();
self.iter(&guard).count()
}
#[inline]
pub fn is_empty(&self) -> bool {
let guard = Guard::new();
self.iter(&guard).next().is_none()
}
#[inline]
pub const fn iter<'t>(&'t self, guard: &'t Guard) -> Iter<'t, K, V> {
Iter::new(&self.root, guard)
}
#[inline]
pub const fn range<'t, Q, R: RangeBounds<Q>>(
&'t self,
range: R,
guard: &'t Guard,
) -> Range<'t, K, V, Q, R>
where
Q: Comparable<K> + ?Sized,
{
Range::new(&self.root, range, guard)
}
pub fn locate<'t, Q>(&'t self, key: &Q, guard: &'t Guard) -> Proximity<'t, K, V>
where
Q: Comparable<K> + ?Sized,
{
if let Some(root) = deref_unchecked(self.root.load(Acquire, guard)) {
if let Some(mut iter) = root.approximate::<_, true>(key, guard) {
let mut prev_iter = iter.clone();
while let Some((k, _)) = iter.get() {
let comparison = key.compare(k);
if comparison.is_eq() {
return Proximity::Exact(Iter {
root: &self.root,
forward: Some(iter),
backward: None,
guard,
});
} else if comparison.is_lt() {
return Proximity::Between(Iter {
root: &self.root,
forward: Some(prev_iter),
backward: Some(iter.rev()),
guard,
});
}
prev_iter = iter.clone();
if iter.next().is_none() && iter.jump(guard).is_none() {
break;
}
}
if prev_iter.get().is_some() {
return Proximity::Smaller(Iter {
root: &self.root,
forward: None,
backward: Some(prev_iter.rev()),
guard,
});
}
}
if let Some(iter) = root.approximate::<_, false>(key, guard) {
let mut rev_iter = iter.rev();
let mut prev_rev_iter = rev_iter.clone();
while let Some((k, _)) = rev_iter.get() {
let comparison = key.compare(k);
if comparison.is_eq() {
return Proximity::Exact(Iter {
root: &self.root,
forward: Some(rev_iter.rev()),
backward: None,
guard,
});
} else if comparison.is_gt() {
return Proximity::Between(Iter {
root: &self.root,
forward: Some(rev_iter.rev()),
backward: Some(prev_rev_iter),
guard,
});
}
prev_rev_iter = rev_iter.clone();
if rev_iter.next().is_none() && rev_iter.jump(guard).is_none() {
break;
}
}
if prev_rev_iter.get().is_some() {
return Proximity::Larger(Iter {
root: &self.root,
forward: Some(prev_rev_iter.rev()),
backward: None,
guard,
});
}
}
}
Proximity::Empty
}
}
impl<K, V> Clone for TreeIndex<K, V>
where
K: Clone + Ord,
V: Clone,
{
#[inline]
fn clone(&self) -> Self {
let self_clone = Self::default();
for (k, v) in self.iter(&Guard::new()) {
let _result: Result<(), (K, V)> = self_clone.insert_sync(k.clone(), v.clone());
}
self_clone
}
}
impl<K, V> fmt::Debug for TreeIndex<K, V>
where
K: Clone + fmt::Debug + Ord,
V: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let guard = Guard::new();
f.write_str("TreeIndex { ")?;
if let Some(root) = deref_unchecked(self.root.load(Acquire, &guard)) {
f.write_str(" root: ")?;
root.fmt(f)?;
}
f.write_str(" }")
}
}
impl<K, V> Default for TreeIndex<K, V> {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl<K, V> Drop for TreeIndex<K, V> {
#[inline]
fn drop(&mut self) {
drop_in_place(self.root.load(Acquire, fake_ref(self)));
for _ in 0..4 {
Guard::new().accelerate();
}
}
}
impl<K, V> PartialEq for TreeIndex<K, V>
where
K: Clone + Ord,
V: PartialEq,
{
#[inline]
fn eq(&self, other: &Self) -> bool {
let guard = Guard::new();
Iterator::eq(self.iter(&guard), other.iter(&guard))
}
}
impl<K, V> UnwindSafe for TreeIndex<K, V> {}
impl<'t, K, V> Iter<'t, K, V> {
#[inline]
#[must_use]
pub const fn get(&self) -> Option<(&'t K, &'t V)> {
if let Some(iter) = self.forward.as_ref() {
iter.get()
} else {
None
}
}
#[inline]
#[must_use]
pub const fn get_back(&self) -> Option<(&'t K, &'t V)> {
if let Some(rev_iter) = self.backward.as_ref() {
rev_iter.get()
} else {
None
}
}
#[inline]
pub const fn flip(&mut self) -> bool {
if self.backward.is_none() && self.get().is_some() {
if let Some(forward) = self.forward.take() {
self.backward = Some(forward.rev());
return true;
}
}
if self.forward.is_none() && self.get_back().is_some() {
if let Some(backward) = self.backward.take() {
self.forward = Some(backward.rev());
return true;
}
}
self.forward.is_none() && self.backward.is_none()
}
#[inline]
const fn new(root: &'t AtomicRaw<Node<K, V>>, guard: &'t Guard) -> Iter<'t, K, V> {
Iter::<'t, K, V> {
root,
forward: None,
backward: None,
guard,
}
}
}
impl<'t, K, V> Iter<'t, K, V>
where
K: Ord,
{
fn check_collision<const FORWARD: bool>(
&self,
entry: (&'t K, &'t V),
) -> Option<(&'t K, &'t V)> {
let other_entry = if FORWARD {
self.backward.as_ref().and_then(LeafRevIter::get)
} else {
self.forward.as_ref().and_then(LeafIter::get)
};
let Some(other_entry) = other_entry else {
return None;
};
if (FORWARD && other_entry.0 > entry.0) || (!FORWARD && other_entry.0 < entry.0) {
return Some(entry);
}
None
}
}
impl<K, V> Clone for Iter<'_, K, V>
where
K: Clone + Ord,
{
#[inline]
fn clone(&self) -> Self {
Self {
root: self.root,
forward: self.forward.as_ref().map(LeafIter::clone),
backward: self.backward.as_ref().map(LeafRevIter::clone),
guard: self.guard,
}
}
}
impl<K, V> fmt::Debug for Iter<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Iter")
.field("forward_iter", &self.forward)
.field("backward_iter", &self.backward)
.finish()
}
}
impl<K, V> DoubleEndedIterator for Iter<'_, K, V>
where
K: Clone + Ord,
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
if self.backward.is_none() {
let root = deref_unchecked(self.root.load(Acquire, self.guard))?;
if let Some(rev_iter) = root.max(self.guard) {
self.backward.replace(rev_iter);
}
}
if let Some(rev_iter) = self.backward.as_mut() {
if let Some(entry) = rev_iter.next() {
if likely(self.forward.is_none()) {
return Some(entry);
}
return self.check_collision::<false>(entry);
}
if let Some(entry) = rev_iter.jump(self.guard) {
if likely(self.forward.is_none()) {
return Some(entry);
}
return self.check_collision::<false>(entry);
}
rev_iter.rewind();
}
None
}
}
impl<'t, K, V> Iterator for Iter<'t, K, V>
where
K: Clone + Ord,
{
type Item = (&'t K, &'t V);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.forward.is_none() {
let root = deref_unchecked(self.root.load(Acquire, self.guard))?;
if let Some(iter) = root.min(self.guard) {
self.forward.replace(iter);
}
}
if let Some(iter) = self.forward.as_mut() {
if let Some(entry) = iter.next() {
if likely(self.backward.is_none()) {
return Some(entry);
}
return self.check_collision::<true>(entry);
}
if let Some(entry) = iter.jump(self.guard) {
if likely(self.backward.is_none()) {
return Some(entry);
}
return self.check_collision::<true>(entry);
}
iter.rewind();
}
None
}
}
impl<'t, K, V, Q, R> From<Range<'t, K, V, Q, R>> for Iter<'t, K, V>
where
Q: Comparable<K> + ?Sized,
R: RangeBounds<Q>,
{
#[inline]
fn from(range: Range<'t, K, V, Q, R>) -> Self {
Self {
root: range.root,
forward: range.forward,
backward: range.backward,
guard: range.guard,
}
}
}
impl<K, V> FusedIterator for Iter<'_, K, V> where K: Clone + Ord {}
impl<K, V> UnwindSafe for Iter<'_, K, V> {}
impl<'t, K, V, Q: ?Sized, R: RangeBounds<Q>> Range<'t, K, V, Q, R> {
#[inline]
const fn new(
root: &'t AtomicRaw<Node<K, V>>,
range: R,
guard: &'t Guard,
) -> Range<'t, K, V, Q, R> {
Range::<'t, K, V, Q, R> {
root,
forward: None,
backward: None,
bounds: range,
check_upper_bound: false,
check_lower_bound: false,
guard,
query: PhantomData,
}
}
}
impl<'t, K, V, Q, R> Range<'t, K, V, Q, R>
where
K: Clone + Ord,
Q: Comparable<K> + ?Sized,
R: RangeBounds<Q>,
{
#[inline]
pub fn get(&self) -> Option<(&'t K, &'t V)> {
self.forward.as_ref().and_then(|iter| {
if let Some(entry) = iter.get() {
if !self.check_upper_bound || self.check_upper_bound(entry.0) {
return Some(entry);
}
}
None
})
}
#[inline]
pub fn get_back(&self) -> Option<(&'t K, &'t V)> {
self.backward.as_ref().and_then(|rev_iter| {
if let Some(entry) = rev_iter.get() {
if !self.check_lower_bound || self.check_lower_bound(entry.0) {
return Some(entry);
}
}
None
})
}
#[inline]
pub fn flip(&mut self) -> bool {
if self.backward.is_none() && self.get().is_some() {
if let Some(forward) = self.forward.take() {
let backward = forward.rev();
let min_key = backward.min_key();
self.backward = Some(backward);
self.check_upper_bound = false;
self.set_check_lower_bound(min_key);
return true;
}
}
if self.forward.is_none() && self.get_back().is_some() {
if let Some(backward) = self.backward.take() {
let forward = backward.rev();
let max_key = forward.max_key();
self.forward = Some(forward);
self.check_lower_bound = false;
self.set_check_upper_bound(max_key);
return true;
}
}
self.forward.is_none() && self.backward.is_none()
}
fn start_forward(&mut self) -> Option<(&'t K, &'t V)> {
let root = deref_unchecked(self.root.load(Acquire, self.guard))?;
let mut leaf_iter = match self.bounds.start_bound() {
Excluded(k) | Included(k) => root.approximate::<_, true>(k, self.guard),
Unbounded => None,
};
if leaf_iter.is_none() {
if let Some(mut iter) = root.min(self.guard) {
iter.next();
leaf_iter.replace(iter);
}
}
let mut leaf_iter = leaf_iter?;
while let Some((k, v)) = leaf_iter.get() {
let check_failed = match self.bounds.start_bound() {
Excluded(key) => key.compare(k).is_ge(),
Included(key) => key.compare(k).is_gt(),
Unbounded => false,
};
if check_failed {
if leaf_iter.next().is_none() {
leaf_iter.jump(self.guard)?;
}
continue;
}
let max_key = leaf_iter.max_key();
self.set_check_upper_bound(max_key);
self.forward.replace(leaf_iter);
return Some((k, v));
}
None
}
fn start_backward(&mut self) -> Option<(&'t K, &'t V)> {
let root = deref_unchecked(self.root.load(Acquire, self.guard))?;
let mut leaf_iter = match self.bounds.end_bound() {
Excluded(k) | Included(k) => root
.approximate::<_, false>(k, self.guard)
.map(LeafIter::rev),
Unbounded => None,
};
if leaf_iter.is_none() {
if let Some(mut iter) = root.max(self.guard) {
iter.next();
leaf_iter.replace(iter);
}
}
let mut leaf_iter = leaf_iter?;
while let Some((k, v)) = leaf_iter.get() {
let check_failed = match self.bounds.end_bound() {
Excluded(key) => key.compare(k).is_le(),
Included(key) => key.compare(k).is_lt(),
Unbounded => false,
};
if check_failed {
if leaf_iter.next().is_none() {
leaf_iter.jump(self.guard)?;
}
continue;
}
let min_key = leaf_iter.min_key();
self.set_check_lower_bound(min_key);
self.backward.replace(leaf_iter);
return Some((k, v));
}
None
}
#[inline]
fn forward_unbounded(&mut self) -> Option<(&'t K, &'t V)> {
if self.forward.is_none() {
return self.start_forward();
}
if let Some(leaf_iter) = self.forward.as_mut() {
if let Some(result) = leaf_iter.next() {
return Some(result);
}
if let Some(entry) = leaf_iter.jump(self.guard) {
let max_key = leaf_iter.max_key();
self.set_check_upper_bound(max_key);
return Some(entry);
}
leaf_iter.rewind();
}
None
}
#[inline]
fn backward_unbounded(&mut self) -> Option<(&'t K, &'t V)> {
if self.backward.is_none() {
return self.start_backward();
}
if let Some(leaf_iter) = self.backward.as_mut() {
if let Some(result) = leaf_iter.next() {
return Some(result);
}
if let Some(entry) = leaf_iter.jump(self.guard) {
let min_key = leaf_iter.min_key();
self.set_check_lower_bound(min_key);
return Some(entry);
}
leaf_iter.rewind();
}
None
}
#[inline]
fn set_check_upper_bound(&mut self, max_key: Option<&'t K>) {
self.check_upper_bound = match self.bounds.end_bound() {
Excluded(key) => max_key.is_some_and(|k| key.compare(k).is_le()),
Included(key) => max_key.is_some_and(|k| key.compare(k).is_lt()),
Unbounded => false,
};
}
#[inline]
fn set_check_lower_bound(&mut self, min_key: Option<&'t K>) {
self.check_lower_bound = match self.bounds.start_bound() {
Excluded(key) => min_key.is_some_and(|k| key.compare(k).is_ge()),
Included(key) => min_key.is_some_and(|k| key.compare(k).is_gt()),
Unbounded => false,
};
}
fn check_collision<const FORWARD: bool>(
&self,
entry: (&'t K, &'t V),
) -> Option<(&'t K, &'t V)> {
let other_entry = if FORWARD {
self.backward.as_ref().and_then(LeafRevIter::get)
} else {
self.forward.as_ref().and_then(LeafIter::get)
};
let Some(other_entry) = other_entry else {
return None;
};
if (FORWARD && other_entry.0 > entry.0) || (!FORWARD && other_entry.0 < entry.0) {
return Some(entry);
}
None
}
fn check_lower_bound(&self, k: &K) -> bool {
match self.bounds.start_bound() {
Excluded(key) => key.compare(k).is_lt(),
Included(key) => key.compare(k).is_le(),
Unbounded => true,
}
}
fn check_upper_bound(&self, k: &K) -> bool {
match self.bounds.end_bound() {
Excluded(key) => key.compare(k).is_gt(),
Included(key) => key.compare(k).is_ge(),
Unbounded => true,
}
}
}
impl<K, V, Q, R> Clone for Range<'_, K, V, Q, R>
where
K: Clone + Ord,
Q: Comparable<K> + ?Sized,
R: Clone + RangeBounds<Q>,
{
#[inline]
fn clone(&self) -> Self {
Self {
root: self.root,
forward: self.forward.as_ref().map(LeafIter::clone),
backward: self.backward.as_ref().map(LeafRevIter::clone),
bounds: self.bounds.clone(),
check_upper_bound: self.check_upper_bound,
check_lower_bound: self.check_lower_bound,
guard: self.guard,
query: PhantomData,
}
}
}
impl<K, V, Q: ?Sized, R: RangeBounds<Q>> fmt::Debug for Range<'_, K, V, Q, R> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Range")
.field("forward_iter", &self.forward)
.field("backward_iter", &self.backward)
.field("check_upper_bound", &self.check_upper_bound)
.field("check_lower_bound", &self.check_upper_bound)
.finish()
}
}
impl<K, V, Q, R> DoubleEndedIterator for Range<'_, K, V, Q, R>
where
K: Clone + Ord,
Q: Comparable<K> + ?Sized,
R: RangeBounds<Q>,
{
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
if let Some(entry) = self.backward_unbounded() {
if self.check_lower_bound && !self.check_lower_bound(entry.0) {
return None;
}
if likely(self.forward.is_none()) {
return Some(entry);
}
return self.check_collision::<false>(entry);
}
None
}
}
impl<'t, K, V, Q, R> Iterator for Range<'t, K, V, Q, R>
where
K: Clone + Ord,
Q: Comparable<K> + ?Sized,
R: RangeBounds<Q>,
{
type Item = (&'t K, &'t V);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if let Some(entry) = self.forward_unbounded() {
if self.check_upper_bound && !self.check_upper_bound(entry.0) {
return None;
}
if likely(self.backward.is_none()) {
return Some(entry);
}
return self.check_collision::<true>(entry);
}
None
}
}
impl<K, V, Q, R> FusedIterator for Range<'_, K, V, Q, R>
where
K: Clone + Ord,
Q: Comparable<K> + ?Sized,
R: RangeBounds<Q>,
{
}
impl<K, V, Q, R> UnwindSafe for Range<'_, K, V, Q, R>
where
Q: ?Sized,
R: RangeBounds<Q> + UnwindSafe,
{
}
impl<K, V> fmt::Debug for Proximity<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Exact(iter) => f.debug_tuple("Exact").field(iter).finish(),
Self::Between(iter) => f.debug_tuple("Between").field(iter).finish(),
Self::Smaller(iter) => f.debug_tuple("Smaller").field(iter).finish(),
Self::Larger(iter) => f.debug_tuple("Larger").field(iter).finish(),
Self::Empty => write!(f, "Empty"),
}
}
}