use core::borrow::Borrow;
use core::cmp::Ordering;
use core::fmt;
use core::hash::{Hash, Hasher};
use core::iter::FusedIterator;
use core::marker::PhantomData;
use core::ops::{Bound, Index, RangeBounds};
use crate::raw::{Handle, LeafNode, Node, RawOSBTreeMap};
mod capacity;
mod entry;
mod order_statistic;
pub use crate::Rank;
pub use entry::{Entry, OccupiedEntry, VacantEntry};
fn validate_range_bounds<T, R>(range: &R)
where
T: ?Sized + Ord,
R: RangeBounds<T>,
{
if let (Bound::Included(start) | Bound::Excluded(start), Bound::Included(end) | Bound::Excluded(end)) =
(range.start_bound(), range.end_bound())
{
let valid =
if matches!(range.start_bound(), Bound::Excluded(_)) && matches!(range.end_bound(), Bound::Excluded(_)) {
start < end
} else {
start <= end
};
assert!(valid, "range start is greater than range end in OSBTreeMap");
}
}
pub struct OSBTreeMap<K, V> {
raw: RawOSBTreeMap<K, V>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Iter<'a, K, V> {
tree: *const RawOSBTreeMap<K, V>,
front_leaf: Option<Handle>,
front_index: usize,
back_leaf: Option<Handle>,
back_index: usize,
remaining: usize,
_marker: PhantomData<&'a RawOSBTreeMap<K, V>>,
}
unsafe impl<K: Sync, V: Sync> Send for Iter<'_, K, V> {}
unsafe impl<K: Sync, V: Sync> Sync for Iter<'_, K, V> {}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct IterMut<'a, K: 'a, V: 'a> {
tree: *mut RawOSBTreeMap<K, V>,
front_leaf: Option<Handle>,
front_index: usize,
back_leaf: Option<Handle>,
back_index: usize,
remaining: usize,
_marker: PhantomData<&'a mut (K, V)>,
}
unsafe impl<K: Send, V: Send> Send for IterMut<'_, K, V> {}
pub struct IntoIter<K, V> {
inner: alloc::vec::IntoIter<(K, V)>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Keys<'a, K, V> {
inner: Iter<'a, K, V>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Values<'a, K, V> {
inner: Iter<'a, K, V>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct ValuesMut<'a, K, V> {
inner: IterMut<'a, K, V>,
}
unsafe impl<K: Send, V: Send> Send for ValuesMut<'_, K, V> {}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct IntoKeys<K, V> {
inner: IntoIter<K, V>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct IntoValues<K, V> {
inner: IntoIter<K, V>,
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Range<'a, K: 'a, V: 'a> {
tree: *const RawOSBTreeMap<K, V>,
front_leaf: Option<Handle>,
front_index: usize,
back_leaf: Option<Handle>,
back_index: usize,
remaining: usize,
finished: bool,
_marker: PhantomData<&'a RawOSBTreeMap<K, V>>,
}
unsafe impl<K: Sync, V: Sync> Send for Range<'_, K, V> {}
unsafe impl<K: Sync, V: Sync> Sync for Range<'_, K, V> {}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct RangeMut<'a, K: 'a, V: 'a> {
tree: *mut RawOSBTreeMap<K, V>,
front_leaf: Option<Handle>,
front_index: usize,
back_leaf: Option<Handle>,
back_index: usize,
remaining: usize,
finished: bool,
_marker: PhantomData<&'a mut (K, V)>,
}
unsafe impl<K: Send, V: Send> Send for RangeMut<'_, K, V> {}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct ExtractIf<'a, K, V, R, F> {
tree: &'a mut RawOSBTreeMap<K, V>,
keys: alloc::vec::Vec<K>,
index: usize,
pred: F,
_marker: PhantomData<R>,
}
pub(crate) struct ExtractIfInner<'a, K, V, R> {
tree: &'a mut RawOSBTreeMap<K, V>,
keys: alloc::vec::Vec<K>,
index: usize,
_marker: PhantomData<R>,
}
impl<K: Clone + Ord, V, R: RangeBounds<K>> ExtractIfInner<'_, K, V, R> {
pub(crate) fn next<F>(&mut self, pred: &mut F) -> Option<(K, V)>
where
F: FnMut(&K, &mut V) -> bool,
{
while self.index < self.keys.len() {
let key = &self.keys[self.index];
self.index += 1;
let should_remove = self.tree.get_mut(key).is_some_and(|value| pred(key, value));
if should_remove {
if let Some((k, v)) = self.tree.remove_entry(key) {
return Some((k, v));
}
}
}
None
}
pub(crate) fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.keys.len() - self.index))
}
}
impl<K, V> OSBTreeMap<K, V> {
#[must_use]
pub const fn new() -> OSBTreeMap<K, V> {
OSBTreeMap {
raw: RawOSBTreeMap::new(),
}
}
pub fn clear(&mut self) {
self.raw.clear();
}
pub fn get<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q> + Ord + Clone,
Q: ?Sized + Ord,
{
self.raw.get(key)
}
pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
where
K: Borrow<Q> + Ord + Clone,
Q: ?Sized + Ord,
{
self.raw.get_key_value(k)
}
#[allow(clippy::must_use_candidate)]
pub fn first_key_value(&self) -> Option<(&K, &V)>
where
K: Ord + Clone,
{
self.raw.first_key_value()
}
pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
where
K: Ord + Clone,
{
let first_leaf = self.raw.first_leaf()?;
let leaf = self.raw.node(first_leaf).as_leaf();
if leaf.key_count() == 0 {
return None;
}
let key = leaf.key(0).clone();
Some(OccupiedEntry {
key,
leaf_handle: first_leaf,
index: 0,
tree: &mut self.raw,
})
}
pub fn pop_first(&mut self) -> Option<(K, V)>
where
K: Clone + Ord,
{
self.raw.pop_first()
}
#[allow(clippy::must_use_candidate)]
pub fn last_key_value(&self) -> Option<(&K, &V)>
where
K: Ord + Clone,
{
self.raw.last_key_value()
}
pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
where
K: Ord + Clone,
{
let last_leaf = self.raw.last_leaf()?;
let leaf = self.raw.node(last_leaf).as_leaf();
if leaf.key_count() == 0 {
return None;
}
let index = leaf.key_count() - 1;
let key = leaf.key(index).clone();
Some(OccupiedEntry {
key,
leaf_handle: last_leaf,
index,
tree: &mut self.raw,
})
}
pub fn pop_last(&mut self) -> Option<(K, V)>
where
K: Clone + Ord,
{
self.raw.pop_last()
}
pub fn contains_key<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q> + Ord + Clone,
Q: ?Sized + Ord,
{
self.raw.contains_key(key)
}
pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q> + Ord + Clone,
Q: ?Sized + Ord,
{
self.raw.get_mut(key)
}
pub fn insert(&mut self, key: K, value: V) -> Option<V>
where
K: Clone + Ord,
{
self.raw.insert(key, value)
}
pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q> + Clone + Ord,
Q: ?Sized + Ord,
{
self.raw.remove(key)
}
pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q> + Clone + Ord,
Q: ?Sized + Ord,
{
self.raw.remove_entry(key)
}
pub fn retain<F>(&mut self, mut f: F)
where
K: Clone + Ord,
F: FnMut(&K, &mut V) -> bool,
{
let keys_to_remove: alloc::vec::Vec<K> = self
.iter_mut()
.filter_map(|(k, v)| {
if f(k, v) {
None
} else {
Some(k.clone())
}
})
.collect();
for key in keys_to_remove {
self.raw.remove(&key);
}
}
pub fn append(&mut self, other: &mut Self)
where
K: Clone + Ord,
{
if other.is_empty() {
return;
}
if self.is_empty() {
core::mem::swap(&mut self.raw, &mut other.raw);
return;
}
let entries = other.raw.drain_to_vec();
for (k, v) in entries {
self.raw.insert(k, v);
}
}
pub fn range<T, R>(&self, range: R) -> Range<'_, K, V>
where
T: ?Sized + Ord,
K: Borrow<T> + Ord + Clone,
R: RangeBounds<T>,
{
validate_range_bounds(&range);
let (front_leaf, front_index) = match range.start_bound() {
Bound::Unbounded => {
if let Some(first) = self.raw.first_leaf() {
(Some(first), 0)
} else {
(None, 0)
}
}
Bound::Included(start) => {
if let Some((handle, idx)) = self.raw.lower_bound(start) {
(Some(handle), idx)
} else {
(None, 0)
}
}
Bound::Excluded(start) => {
if let Some((handle, idx)) = self.raw.upper_bound(start) {
(Some(handle), idx)
} else {
(None, 0)
}
}
};
let (back_leaf, back_index) = match range.end_bound() {
Bound::Unbounded => {
if let Some(last) = self.raw.last_leaf() {
let leaf = self.raw.node(last).as_leaf();
let count = leaf.key_count();
if count > 0 {
(Some(last), count - 1)
} else {
(None, 0)
}
} else {
(None, 0)
}
}
Bound::Included(end) => {
if let Some((handle, idx)) = self.raw.upper_bound_inclusive(end) {
(Some(handle), idx)
} else {
(None, 0)
}
}
Bound::Excluded(end) => {
if let Some((handle, idx)) = self.raw.lower_bound_exclusive(end) {
(Some(handle), idx)
} else {
(None, 0)
}
}
};
let (finished, remaining) = match (front_leaf, back_leaf) {
(Some(front), Some(back)) => {
let front_key = self.raw.node(front).as_leaf().key(front_index);
let back_key = self.raw.node(back).as_leaf().key(back_index);
if front_key > back_key {
(true, 0)
} else {
let front_rank = self.raw.rank_of::<K>(front_key).unwrap_or(0);
let back_rank = self.raw.rank_of::<K>(back_key).unwrap_or(0);
(false, back_rank - front_rank + 1)
}
}
_ => (true, 0), };
Range {
tree: &raw const self.raw,
front_leaf,
front_index,
back_leaf,
back_index,
remaining,
finished,
_marker: PhantomData,
}
}
pub fn range_mut<T, R>(&mut self, range: R) -> RangeMut<'_, K, V>
where
T: ?Sized + Ord,
K: Borrow<T> + Ord + Clone,
R: RangeBounds<T>,
{
validate_range_bounds(&range);
let (front_leaf, front_index) = match range.start_bound() {
Bound::Unbounded => {
if let Some(first) = self.raw.first_leaf() {
(Some(first), 0)
} else {
(None, 0)
}
}
Bound::Included(start) => {
if let Some((handle, idx)) = self.raw.lower_bound(start) {
(Some(handle), idx)
} else {
(None, 0)
}
}
Bound::Excluded(start) => {
if let Some((handle, idx)) = self.raw.upper_bound(start) {
(Some(handle), idx)
} else {
(None, 0)
}
}
};
let (back_leaf, back_index) = match range.end_bound() {
Bound::Unbounded => {
if let Some(last) = self.raw.last_leaf() {
let leaf = self.raw.node(last).as_leaf();
let count = leaf.key_count();
if count > 0 {
(Some(last), count - 1)
} else {
(None, 0)
}
} else {
(None, 0)
}
}
Bound::Included(end) => {
if let Some((handle, idx)) = self.raw.upper_bound_inclusive(end) {
(Some(handle), idx)
} else {
(None, 0)
}
}
Bound::Excluded(end) => {
if let Some((handle, idx)) = self.raw.lower_bound_exclusive(end) {
(Some(handle), idx)
} else {
(None, 0)
}
}
};
let (finished, remaining) = match (front_leaf, back_leaf) {
(Some(front), Some(back)) => {
let front_key = self.raw.node(front).as_leaf().key(front_index);
let back_key = self.raw.node(back).as_leaf().key(back_index);
if front_key > back_key {
(true, 0)
} else {
let front_rank = self.raw.rank_of::<K>(front_key).unwrap_or(0);
let back_rank = self.raw.rank_of::<K>(back_key).unwrap_or(0);
(false, back_rank - front_rank + 1)
}
}
_ => (true, 0), };
RangeMut {
tree: &raw mut self.raw,
front_leaf,
front_index,
back_leaf,
back_index,
remaining,
finished,
_marker: PhantomData,
}
}
pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
where
K: Ord + Clone,
{
if let Some((leaf_handle, index)) = self.raw.search(&key) {
Entry::Occupied(OccupiedEntry {
key,
leaf_handle,
index,
tree: &mut self.raw,
})
} else {
Entry::Vacant(VacantEntry {
key,
tree: &mut self.raw,
})
}
}
#[allow(clippy::return_self_not_must_use)]
pub fn split_off<Q: Ord>(&mut self, key: &Q) -> Self
where
K: Borrow<Q> + Clone + Ord,
{
let keys_to_move: alloc::vec::Vec<K> =
self.range::<Q, _>((Bound::Included(key), Bound::Unbounded)).map(|(k, _)| k.clone()).collect();
let mut other = OSBTreeMap::new();
for k in keys_to_move {
if let Some(v) = self.remove::<K>(&k) {
other.insert(k, v);
}
}
other
}
pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F>
where
K: Clone + Ord,
R: RangeBounds<K>,
F: FnMut(&K, &mut V) -> bool,
{
let keys: alloc::vec::Vec<K> = self
.range::<K, _>((range.start_bound().cloned(), range.end_bound().cloned()))
.map(|(k, _)| k.clone())
.collect();
ExtractIf {
tree: &mut self.raw,
keys,
index: 0,
pred,
_marker: PhantomData,
}
}
pub(crate) fn extract_if_inner<R>(&mut self, range: R) -> ExtractIfInner<'_, K, V, R>
where
K: Clone + Ord,
R: RangeBounds<K>,
{
let keys: alloc::vec::Vec<K> = self
.range::<K, _>((range.start_bound().cloned(), range.end_bound().cloned()))
.map(|(k, _)| k.clone())
.collect();
ExtractIfInner {
tree: &mut self.raw,
keys,
index: 0,
_marker: PhantomData,
}
}
pub fn into_keys(mut self) -> IntoKeys<K, V> {
IntoKeys {
inner: IntoIter {
inner: self.raw.drain_to_vec().into_iter(),
},
}
}
pub fn into_values(mut self) -> IntoValues<K, V> {
IntoValues {
inner: IntoIter {
inner: self.raw.drain_to_vec().into_iter(),
},
}
}
pub fn iter(&self) -> Iter<'_, K, V> {
let first_leaf = self.raw.first_leaf();
let last_leaf = self.raw.last_leaf();
let back_index = if let Some(h) = last_leaf {
let leaf = self.raw.node(h).as_leaf();
if leaf.key_count() > 0 {
leaf.key_count() - 1
} else {
0
}
} else {
0
};
Iter {
tree: &raw const self.raw,
front_leaf: first_leaf,
front_index: 0,
back_leaf: last_leaf,
back_index,
remaining: self.raw.len(),
_marker: PhantomData,
}
}
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
let first_leaf = self.raw.first_leaf();
let last_leaf = self.raw.last_leaf();
let back_index = if let Some(h) = last_leaf {
let leaf = self.raw.node(h).as_leaf();
if leaf.key_count() > 0 {
leaf.key_count() - 1
} else {
0
}
} else {
0
};
IterMut {
tree: &raw mut self.raw,
front_leaf: first_leaf,
front_index: 0,
back_leaf: last_leaf,
back_index,
remaining: self.raw.len(),
_marker: PhantomData,
}
}
pub fn keys(&self) -> Keys<'_, K, V> {
Keys {
inner: self.iter(),
}
}
pub fn values(&self) -> Values<'_, K, V> {
Values {
inner: self.iter(),
}
}
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
ValuesMut {
inner: self.iter_mut(),
}
}
#[must_use]
pub const fn len(&self) -> usize {
self.raw.len()
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.raw.is_empty()
}
}
impl<K: Clone + Ord, V: Clone> Clone for OSBTreeMap<K, V> {
fn clone(&self) -> Self {
OSBTreeMap {
raw: self.raw.clone(),
}
}
}
impl<K: Hash, V: Hash> Hash for OSBTreeMap<K, V> {
fn hash<H: Hasher>(&self, state: &mut H) {
self.len().hash(state);
for (k, v) in self {
k.hash(state);
v.hash(state);
}
}
}
impl<K: PartialEq, V: PartialEq> PartialEq for OSBTreeMap<K, V> {
fn eq(&self, other: &Self) -> bool {
self.len() == other.len() && self.iter().zip(other.iter()).all(|(a, b)| a == b)
}
}
impl<K: Eq, V: Eq> Eq for OSBTreeMap<K, V> {}
impl<K: PartialOrd, V: PartialOrd> PartialOrd for OSBTreeMap<K, V> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.iter().partial_cmp(other.iter())
}
}
impl<K: Ord, V: Ord> Ord for OSBTreeMap<K, V> {
fn cmp(&self, other: &Self) -> Ordering {
self.iter().cmp(other.iter())
}
}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for OSBTreeMap<K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_map().entries(self.iter()).finish()
}
}
impl<K, V> Default for OSBTreeMap<K, V> {
fn default() -> Self {
OSBTreeMap::new()
}
}
impl<K: Ord + Clone, V> FromIterator<(K, V)> for OSBTreeMap<K, V> {
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
let mut map = OSBTreeMap::new();
map.extend(iter);
map
}
}
impl<K: Ord + Clone, V> Extend<(K, V)> for OSBTreeMap<K, V> {
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
for (k, v) in iter {
self.insert(k, v);
}
}
}
impl<'a, K: Ord + Copy, V: Copy> Extend<(&'a K, &'a V)> for OSBTreeMap<K, V> {
fn extend<T: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: T) {
for (&k, &v) in iter {
self.insert(k, v);
}
}
}
impl<'a, K, V> IntoIterator for &'a OSBTreeMap<K, V> {
type Item = (&'a K, &'a V);
type IntoIter = Iter<'a, K, V>;
fn into_iter(self) -> Iter<'a, K, V> {
self.iter()
}
}
impl<'a, K, V> IntoIterator for &'a mut OSBTreeMap<K, V> {
type Item = (&'a K, &'a mut V);
type IntoIter = IterMut<'a, K, V>;
fn into_iter(self) -> IterMut<'a, K, V> {
self.iter_mut()
}
}
impl<K: Clone + Ord, V> IntoIterator for OSBTreeMap<K, V> {
type Item = (K, V);
type IntoIter = IntoIter<K, V>;
fn into_iter(mut self) -> IntoIter<K, V> {
let entries = self.raw.drain_to_vec();
IntoIter {
inner: entries.into_iter(),
}
}
}
impl<K, Q, V> Index<&Q> for OSBTreeMap<K, V>
where
K: Borrow<Q> + Ord + Clone,
Q: ?Sized + Ord,
{
type Output = V;
fn index(&self, key: &Q) -> &V {
self.get(key).expect("no entry found for key")
}
}
impl<K: Ord + Clone, V, const N: usize> From<[(K, V); N]> for OSBTreeMap<K, V> {
fn from(arr: [(K, V); N]) -> Self {
arr.into_iter().collect()
}
}
impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
return None;
}
let leaf_handle = self.front_leaf?;
let tree = unsafe { &*self.tree };
let leaf = tree.node(leaf_handle).as_leaf();
let key = leaf.key(self.front_index);
let value_handle = leaf.value(self.front_index);
let value = tree.value(value_handle);
self.remaining -= 1;
self.front_index += 1;
if self.front_index >= leaf.key_count() {
self.front_leaf = leaf.next();
self.front_index = 0;
}
Some((key, value))
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
return None;
}
let leaf_handle = self.back_leaf?;
let tree = unsafe { &*self.tree };
let leaf = tree.node(leaf_handle).as_leaf();
let key = leaf.key(self.back_index);
let value_handle = leaf.value(self.back_index);
let value = tree.value(value_handle);
self.remaining -= 1;
if self.back_index == 0 {
self.back_leaf = leaf.prev();
if let Some(prev_handle) = self.back_leaf {
let prev_leaf = tree.node(prev_handle).as_leaf();
self.back_index = prev_leaf.key_count().saturating_sub(1);
}
} else {
self.back_index -= 1;
}
Some((key, value))
}
}
impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
fn len(&self) -> usize {
self.remaining
}
}
impl<K, V> FusedIterator for Iter<'_, K, V> {}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Iter").field("remaining", &self.remaining).finish()
}
}
impl<'a, K: 'a, V: 'a> Default for Iter<'a, K, V> {
fn default() -> Self {
Iter {
tree: core::ptr::NonNull::dangling().as_ptr(),
front_leaf: None,
front_index: 0,
back_leaf: None,
back_index: 0,
remaining: 0,
_marker: PhantomData,
}
}
}
impl<K, V> Clone for Iter<'_, K, V> {
fn clone(&self) -> Self {
Iter {
tree: self.tree,
front_leaf: self.front_leaf,
front_index: self.front_index,
back_leaf: self.back_leaf,
back_index: self.back_index,
remaining: self.remaining,
_marker: PhantomData,
}
}
}
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
return None;
}
let leaf_handle = self.front_leaf?;
unsafe {
let leaf = RawOSBTreeMap::node_ptr(self.tree, leaf_handle).as_leaf();
let key = leaf.key(self.front_index);
let value_handle = leaf.value(self.front_index);
let value = RawOSBTreeMap::value_mut_ptr(self.tree, value_handle);
self.remaining -= 1;
self.front_index += 1;
if self.front_index >= leaf.key_count() {
self.front_leaf = leaf.next();
self.front_index = 0;
}
Some((key, value))
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.remaining == 0 {
return None;
}
let leaf_handle = self.back_leaf?;
unsafe {
let leaf = RawOSBTreeMap::node_ptr(self.tree, leaf_handle).as_leaf();
let key = leaf.key(self.back_index);
let value_handle = leaf.value(self.back_index);
let value = RawOSBTreeMap::value_mut_ptr(self.tree, value_handle);
self.remaining -= 1;
if self.back_index == 0 {
self.back_leaf = leaf.prev();
if let Some(prev_handle) = self.back_leaf {
let prev_leaf = RawOSBTreeMap::node_ptr(self.tree, prev_handle).as_leaf();
self.back_index = prev_leaf.key_count().saturating_sub(1);
}
} else {
self.back_index -= 1;
}
Some((key, value))
}
}
}
impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
fn len(&self) -> usize {
self.remaining
}
}
impl<K, V> FusedIterator for IterMut<'_, K, V> {}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("IterMut").field("remaining", &self.remaining).finish()
}
}
impl<'a, K: 'a, V: 'a> Default for IterMut<'a, K, V> {
fn default() -> Self {
IterMut {
tree: core::ptr::null_mut(),
front_leaf: None,
front_index: 0,
back_leaf: None,
back_index: 0,
remaining: 0,
_marker: PhantomData,
}
}
}
impl<K, V> Iterator for IntoIter<K, V> {
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back()
}
}
impl<K, V> ExactSizeIterator for IntoIter<K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K, V> FusedIterator for IntoIter<K, V> {}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("IntoIter").field("len", &self.inner.len()).finish()
}
}
impl<K, V> Default for IntoIter<K, V> {
fn default() -> Self {
IntoIter {
inner: alloc::vec::Vec::new().into_iter(),
}
}
}
impl<'a, K, V> Iterator for Keys<'a, K, V> {
type Item = &'a K;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, _)| k)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K, V> DoubleEndedIterator for Keys<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(k, _)| k)
}
}
impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K, V> FusedIterator for Keys<'_, K, V> {}
impl<K: fmt::Debug, V> fmt::Debug for Keys<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Keys").field("remaining", &self.inner.remaining).finish()
}
}
impl<K, V> Default for Keys<'_, K, V> {
fn default() -> Self {
Keys {
inner: Iter::default(),
}
}
}
impl<K, V> Clone for Keys<'_, K, V> {
fn clone(&self) -> Self {
Keys {
inner: self.inner.clone(),
}
}
}
impl<'a, K, V> Iterator for Values<'a, K, V> {
type Item = &'a V;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| v)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<K, V> DoubleEndedIterator for Values<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(_, v)| v)
}
}
impl<K, V> ExactSizeIterator for Values<'_, K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K, V> FusedIterator for Values<'_, K, V> {}
impl<K, V> Clone for Values<'_, K, V> {
fn clone(&self) -> Self {
Values {
inner: self.inner.clone(),
}
}
}
impl<K, V> Default for Values<'_, K, V> {
fn default() -> Self {
Values {
inner: Iter::default(),
}
}
}
impl<K, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Values").field("remaining", &self.inner.remaining).finish()
}
}
impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
type Item = &'a mut V;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| v)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(_, v)| v)
}
}
impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
impl<K, V: fmt::Debug> fmt::Debug for ValuesMut<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ValuesMut").field("remaining", &self.inner.remaining).finish()
}
}
impl<K, V> Default for ValuesMut<'_, K, V> {
fn default() -> Self {
ValuesMut {
inner: IterMut::default(),
}
}
}
impl<K: Clone + Ord, V> Iterator for IntoKeys<K, V> {
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, _)| k)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K: Clone + Ord, V> DoubleEndedIterator for IntoKeys<K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(k, _)| k)
}
}
impl<K: Clone + Ord, V> ExactSizeIterator for IntoKeys<K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K: Clone + Ord, V> FusedIterator for IntoKeys<K, V> {}
impl<K: fmt::Debug, V> fmt::Debug for IntoKeys<K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("IntoKeys").field("len", &self.inner.len()).finish()
}
}
impl<K, V> Default for IntoKeys<K, V> {
fn default() -> Self {
IntoKeys {
inner: IntoIter::default(),
}
}
}
impl<K: Clone + Ord, V> Iterator for IntoValues<K, V> {
type Item = V;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(_, v)| v)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
}
impl<K: Clone + Ord, V> DoubleEndedIterator for IntoValues<K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
self.inner.next_back().map(|(_, v)| v)
}
}
impl<K: Clone + Ord, V> ExactSizeIterator for IntoValues<K, V> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K: Clone + Ord, V> FusedIterator for IntoValues<K, V> {}
impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("IntoValues").field("len", &self.inner.len()).finish()
}
}
impl<K, V> Default for IntoValues<K, V> {
fn default() -> Self {
IntoValues {
inner: IntoIter::default(),
}
}
}
impl<'a, K, V> Iterator for Range<'a, K, V> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None;
}
let front_leaf = self.front_leaf?;
let back_leaf = self.back_leaf?;
if front_leaf == back_leaf && self.front_index > self.back_index {
self.finished = true;
return None;
}
let is_last = front_leaf == back_leaf && self.front_index == self.back_index;
let tree = unsafe { &*self.tree };
let leaf = tree.node(front_leaf).as_leaf();
let key = leaf.key(self.front_index);
let value_handle = leaf.value(self.front_index);
let value = tree.value(value_handle);
self.front_index += 1;
if self.front_index >= leaf.key_count() {
self.front_leaf = leaf.next();
self.front_index = 0;
}
if is_last {
self.finished = true;
}
if self.remaining > 0 {
self.remaining -= 1;
}
Some((key, value))
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<K, V> DoubleEndedIterator for Range<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.finished {
return None;
}
let front_leaf = self.front_leaf?;
let back_leaf = self.back_leaf?;
if front_leaf == back_leaf && self.back_index < self.front_index {
self.finished = true;
return None;
}
let is_last = front_leaf == back_leaf && self.front_index == self.back_index;
let tree = unsafe { &*self.tree };
let leaf = tree.node(back_leaf).as_leaf();
let key = leaf.key(self.back_index);
let value_handle = leaf.value(self.back_index);
let value = tree.value(value_handle);
if self.back_index == 0 {
self.back_leaf = leaf.prev();
if let Some(prev) = self.back_leaf {
let prev_leaf = tree.node(prev).as_leaf();
self.back_index = prev_leaf.key_count().saturating_sub(1);
}
} else {
self.back_index -= 1;
}
if is_last {
self.finished = true;
}
if self.remaining > 0 {
self.remaining -= 1;
}
Some((key, value))
}
}
impl<K, V> FusedIterator for Range<'_, K, V> {}
impl<K, V> ExactSizeIterator for Range<'_, K, V> {
fn len(&self) -> usize {
self.remaining
}
}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Range<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Range").field("remaining", &self.remaining).finish()
}
}
impl<K, V> Default for Range<'_, K, V> {
fn default() -> Self {
Range {
tree: core::ptr::NonNull::dangling().as_ptr(),
front_leaf: None,
front_index: 0,
back_leaf: None,
back_index: 0,
remaining: 0,
finished: true,
_marker: PhantomData,
}
}
}
impl<K, V> Clone for Range<'_, K, V> {
fn clone(&self) -> Self {
Range {
tree: self.tree,
front_leaf: self.front_leaf,
front_index: self.front_index,
back_leaf: self.back_leaf,
back_index: self.back_index,
remaining: self.remaining,
finished: self.finished,
_marker: PhantomData,
}
}
}
impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None;
}
let front_leaf = self.front_leaf?;
let back_leaf = self.back_leaf?;
if front_leaf == back_leaf && self.front_index > self.back_index {
self.finished = true;
return None;
}
let is_last = front_leaf == back_leaf && self.front_index == self.back_index;
unsafe {
let leaf = RawOSBTreeMap::node_ptr(self.tree, front_leaf).as_leaf();
let key = leaf.key(self.front_index);
let value_handle = leaf.value(self.front_index);
let value = RawOSBTreeMap::value_mut_ptr(self.tree, value_handle);
self.front_index += 1;
if self.front_index >= leaf.key_count() {
self.front_leaf = leaf.next();
self.front_index = 0;
}
if is_last {
self.finished = true;
}
if self.remaining > 0 {
self.remaining -= 1;
}
Some((key, value))
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.remaining, Some(self.remaining))
}
}
impl<K, V> DoubleEndedIterator for RangeMut<'_, K, V> {
fn next_back(&mut self) -> Option<Self::Item> {
if self.finished {
return None;
}
let front_leaf = self.front_leaf?;
let back_leaf = self.back_leaf?;
if front_leaf == back_leaf && self.back_index < self.front_index {
self.finished = true;
return None;
}
let is_last = front_leaf == back_leaf && self.front_index == self.back_index;
unsafe {
let leaf = RawOSBTreeMap::node_ptr(self.tree, back_leaf).as_leaf();
let key = leaf.key(self.back_index);
let value_handle = leaf.value(self.back_index);
let value = RawOSBTreeMap::value_mut_ptr(self.tree, value_handle);
if self.back_index == 0 {
self.back_leaf = leaf.prev();
if let Some(prev) = self.back_leaf {
let prev_leaf = RawOSBTreeMap::node_ptr(self.tree, prev).as_leaf();
self.back_index = prev_leaf.key_count().saturating_sub(1);
}
} else {
self.back_index -= 1;
}
if is_last {
self.finished = true;
}
if self.remaining > 0 {
self.remaining -= 1;
}
Some((key, value))
}
}
}
impl<K, V> FusedIterator for RangeMut<'_, K, V> {}
impl<K, V> ExactSizeIterator for RangeMut<'_, K, V> {
fn len(&self) -> usize {
self.remaining
}
}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for RangeMut<'_, K, V> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("RangeMut").field("remaining", &self.remaining).finish()
}
}
impl<K, V> Default for RangeMut<'_, K, V> {
fn default() -> Self {
RangeMut {
tree: core::ptr::null_mut(),
front_leaf: None,
front_index: 0,
back_leaf: None,
back_index: 0,
remaining: 0,
finished: true,
_marker: PhantomData,
}
}
}
impl<K, V, R, F> fmt::Debug for ExtractIf<'_, K, V, R, F> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ExtractIf")
.field("index", &self.index)
.field("remaining", &(self.keys.len() - self.index))
.finish()
}
}
impl<K, V, R, F> Iterator for ExtractIf<'_, K, V, R, F>
where
K: Clone + Ord,
R: RangeBounds<K>,
F: FnMut(&K, &mut V) -> bool,
{
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
while self.index < self.keys.len() {
let key = &self.keys[self.index];
self.index += 1;
let should_remove = self.tree.get_mut(key).is_some_and(|value| (self.pred)(key, value));
if should_remove {
if let Some((k, v)) = self.tree.remove_entry(key) {
return Some((k, v));
}
}
}
None
}
fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.keys.len() - self.index))
}
}
impl<K, V, R, F> FusedIterator for ExtractIf<'_, K, V, R, F>
where
K: Clone + Ord,
R: RangeBounds<K>,
F: FnMut(&K, &mut V) -> bool,
{
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
use core::marker::PhantomData;
#[test]
fn internal_guards_handle_empty_first_and_last_leaves() {
let mut map: OSBTreeMap<i32, i32> = (0..64).map(|i| (i * 2, i)).collect();
let first = map.raw.first_leaf().expect("non-empty map has a first leaf");
let last = map.raw.last_leaf().expect("non-empty map has a last leaf");
let _ = map.raw.node_mut(first).as_leaf_mut().take_all();
let _ = map.raw.node_mut(last).as_leaf_mut().take_all();
assert!(map.first_entry().is_none());
assert!(map.last_entry().is_none());
{
let iter = map.iter();
assert_eq!(iter.size_hint().1, Some(map.len()));
}
{
let iter_mut = map.iter_mut();
assert_eq!(iter_mut.size_hint().1, Some(map.len()));
}
assert_eq!(map.range(..).next(), None);
assert_eq!(map.range_mut(..).next(), None);
}
#[test]
fn range_iterators_handle_crossed_indices() {
let map = OSBTreeMap::from([(1, 10), (2, 20), (3, 30)]);
let leaf = map.raw.first_leaf().expect("non-empty map has a leaf");
{
let mut range = Range {
tree: &raw const map.raw,
front_leaf: Some(leaf),
front_index: 2,
back_leaf: Some(leaf),
back_index: 1,
remaining: 0,
finished: false,
_marker: PhantomData,
};
assert_eq!(range.next(), None);
}
{
let mut range = Range {
tree: &raw const map.raw,
front_leaf: Some(leaf),
front_index: 1,
back_leaf: Some(leaf),
back_index: 0,
remaining: 0,
finished: false,
_marker: PhantomData,
};
assert_eq!(range.next_back(), None);
}
}
#[test]
fn range_mut_iterators_handle_crossed_indices() {
let mut map = OSBTreeMap::from([(1, 10), (2, 20), (3, 30)]);
let leaf = map.raw.first_leaf().expect("non-empty map has a leaf");
{
let mut range_mut = RangeMut {
tree: &raw mut map.raw,
front_leaf: Some(leaf),
front_index: 2,
back_leaf: Some(leaf),
back_index: 1,
remaining: 0,
finished: false,
_marker: PhantomData,
};
assert_eq!(range_mut.next(), None);
}
{
let mut range_mut = RangeMut {
tree: &raw mut map.raw,
front_leaf: Some(leaf),
front_index: 1,
back_leaf: Some(leaf),
back_index: 0,
remaining: 0,
finished: false,
_marker: PhantomData,
};
assert_eq!(range_mut.next_back(), None);
}
}
}