use crate::generic::node::{Address, Balance, Item, Node, WouldUnderflow};
use cc_traits::{SimpleCollectionMut, SimpleCollectionRef, Slab, SlabMut};
use std::{
borrow::Borrow,
cmp::Ordering,
hash::{Hash, Hasher},
iter::{DoubleEndedIterator, ExactSizeIterator, FromIterator, FusedIterator},
marker::PhantomData,
ops::{Bound, Index, RangeBounds},
};
mod entry;
mod ext;
pub use entry::*;
pub use ext::*;
pub const M: usize = 8;
#[derive(Clone)]
pub struct BTreeMap<K, V, C> {
nodes: C,
root: Option<usize>,
len: usize,
k: PhantomData<K>,
v: PhantomData<V>,
}
impl<K, V, C> BTreeMap<K, V, C> {
#[inline]
pub fn new() -> BTreeMap<K, V, C>
where
C: Default,
{
BTreeMap {
nodes: Default::default(),
root: None,
len: 0,
k: PhantomData,
v: PhantomData,
}
}
#[inline]
pub fn is_empty(&self) -> bool {
self.root.is_none()
}
#[inline]
pub fn len(&self) -> usize {
self.len
}
}
impl<K, V, C: Slab<Node<K, V>>> BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Ord,
{
match self.root {
Some(id) => self.get_in(key, id),
None => None,
}
}
#[inline]
pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
where
K: Borrow<Q>,
Q: Ord,
{
match self.address_of(k) {
Ok(addr) => {
let item = self.item(addr).unwrap();
Some((item.key(), item.value()))
}
Err(_) => None,
}
}
#[inline]
pub fn first_key_value(&self) -> Option<(&K, &V)> {
match self.first_item_address() {
Some(addr) => {
let item = self.item(addr).unwrap();
Some((item.key(), item.value()))
}
None => None,
}
}
#[inline]
pub fn last_key_value(&self) -> Option<(&K, &V)> {
match self.last_item_address() {
Some(addr) => {
let item = self.item(addr).unwrap();
Some((item.key(), item.value()))
}
None => None,
}
}
#[inline]
pub fn iter(&self) -> Iter<K, V, C> {
Iter::new(self)
}
#[inline]
pub fn keys(&self) -> Keys<K, V, C> {
Keys { inner: self.iter() }
}
#[inline]
pub fn values(&self) -> Values<K, V, C> {
Values { inner: self.iter() }
}
#[inline]
pub fn range<T: ?Sized, R>(&self, range: R) -> Range<K, V, C>
where
T: Ord,
K: Borrow<T>,
R: RangeBounds<T>,
{
Range::new(self, range)
}
#[inline]
pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: Ord,
{
self.get(key).is_some()
}
#[cfg(feature = "dot")]
#[inline]
pub fn dot_write<W: std::io::Write>(&self, f: &mut W) -> std::io::Result<()>
where
K: std::fmt::Display,
V: std::fmt::Display,
{
write!(f, "digraph tree {{\n\tnode [shape=record];\n")?;
if let Some(id) = self.root {
self.dot_write_node(f, id)?
}
write!(f, "}}")
}
#[cfg(feature = "dot")]
#[inline]
fn dot_write_node<W: std::io::Write>(&self, f: &mut W, id: usize) -> std::io::Result<()>
where
K: std::fmt::Display,
V: std::fmt::Display,
{
let name = format!("n{}", id);
let node = self.node(id);
write!(f, "\t{} [label=\"", name)?;
if let Some(parent) = node.parent() {
write!(f, "({})|", parent)?;
}
node.dot_write_label(f)?;
writeln!(f, "({})\"];", id)?;
for child_id in node.children() {
self.dot_write_node(f, child_id)?;
let child_name = format!("n{}", child_id);
writeln!(f, "\t{} -> {}", name, child_name)?;
}
Ok(())
}
}
impl<K, V, C: SlabMut<Node<K, V>>> BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
pub fn clear(&mut self)
where
C: cc_traits::Clear,
{
self.root = None;
self.len = 0;
self.nodes.clear()
}
#[inline]
pub fn get_mut(&mut self, key: &K) -> Option<&mut V>
where
K: Ord,
{
match self.root {
Some(id) => self.get_mut_in(key, id),
None => None,
}
}
#[inline]
pub fn entry(&mut self, key: K) -> Entry<K, V, C>
where
K: Ord,
{
match self.address_of(&key) {
Ok(addr) => Entry::Occupied(OccupiedEntry { map: self, addr }),
Err(addr) => Entry::Vacant(VacantEntry {
map: self,
key,
addr,
}),
}
}
#[inline]
pub fn first_entry(&mut self) -> Option<OccupiedEntry<K, V, C>> {
self.first_item_address()
.map(move |addr| OccupiedEntry { map: self, addr })
}
#[inline]
pub fn last_entry(&mut self) -> Option<OccupiedEntry<K, V, C>> {
self.last_item_address()
.map(move |addr| OccupiedEntry { map: self, addr })
}
#[inline]
pub fn insert(&mut self, key: K, value: V) -> Option<V>
where
K: Ord,
{
match self.address_of(&key) {
Ok(addr) => Some(self.replace_value_at(addr, value)),
Err(addr) => {
self.insert_exactly_at(addr, Item::new(key, value), None);
None
}
}
}
#[inline]
pub fn replace(&mut self, key: K, value: V) -> Option<(K, V)>
where
K: Ord,
{
match self.address_of(&key) {
Ok(addr) => Some(self.replace_at(addr, key, value)),
Err(addr) => {
self.insert_exactly_at(addr, Item::new(key, value), None);
None
}
}
}
#[inline]
pub fn pop_first(&mut self) -> Option<(K, V)> {
self.first_entry().map(|entry| entry.remove_entry())
}
#[inline]
pub fn pop_last(&mut self) -> Option<(K, V)> {
self.last_entry().map(|entry| entry.remove_entry())
}
#[inline]
pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q>,
Q: Ord,
{
match self.address_of(key) {
Ok(addr) => {
let (item, _) = self.remove_at(addr).unwrap();
Some(item.into_value())
}
Err(_) => None,
}
}
#[inline]
pub fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q>,
Q: Ord,
{
match self.address_of(key) {
Ok(addr) => {
let (item, _) = self.remove_at(addr).unwrap();
Some(item.into_pair())
}
Err(_) => None,
}
}
#[inline]
pub fn take<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q>,
Q: Ord,
{
match self.address_of(key) {
Ok(addr) => {
let (item, _) = self.remove_at(addr).unwrap();
Some(item.into_pair())
}
Err(_) => None,
}
}
#[inline]
pub fn update<T, F>(&mut self, key: K, action: F) -> T
where
K: Ord,
F: FnOnce(Option<V>) -> (Option<V>, T),
{
match self.root {
Some(id) => self.update_in(id, key, action),
None => {
let (to_insert, result) = action(None);
if let Some(value) = to_insert {
let new_root = Node::leaf(None, Item::new(key, value));
self.root = Some(self.allocate_node(new_root));
self.len += 1;
}
result
}
}
}
#[inline]
pub fn iter_mut(&mut self) -> IterMut<K, V, C> {
IterMut::new(self)
}
#[inline]
pub fn entries_mut(&mut self) -> EntriesMut<K, V, C> {
EntriesMut::new(self)
}
#[inline]
pub fn range_mut<T: ?Sized, R>(&mut self, range: R) -> RangeMut<K, V, C>
where
T: Ord,
K: Borrow<T>,
R: RangeBounds<T>,
{
RangeMut::new(self, range)
}
#[inline]
pub fn values_mut(&mut self) -> ValuesMut<K, V, C> {
ValuesMut {
inner: self.iter_mut(),
}
}
#[inline]
pub fn drain_filter<F>(&mut self, pred: F) -> DrainFilter<K, V, C, F>
where
F: FnMut(&K, &mut V) -> bool,
{
DrainFilter::new(self, pred)
}
#[inline]
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&K, &mut V) -> bool,
{
self.drain_filter(|k, v| !f(k, v));
}
#[inline]
pub fn append(&mut self, other: &mut Self)
where
K: Ord,
C: Default,
{
if other.is_empty() {
return;
}
if self.is_empty() {
std::mem::swap(self, other);
return;
}
let other = std::mem::take(other);
for (key, value) in other {
self.insert(key, value);
}
}
#[inline]
pub fn into_keys(self) -> IntoKeys<K, V, C> {
IntoKeys {
inner: self.into_iter(),
}
}
#[inline]
pub fn into_values(self) -> IntoValues<K, V, C> {
IntoValues {
inner: self.into_iter(),
}
}
#[inline]
fn try_rotate_left(
&mut self,
id: usize,
deficient_child_index: usize,
addr: &mut Address,
) -> bool {
let pivot_offset = deficient_child_index.into();
let right_sibling_index = deficient_child_index + 1;
let (right_sibling_id, deficient_child_id) = {
let node = self.node(id);
if right_sibling_index >= node.child_count() {
return false; }
(
node.child_id(right_sibling_index),
node.child_id(deficient_child_index),
)
};
match self.node_mut(right_sibling_id).pop_left() {
Ok((mut value, opt_child_id)) => {
std::mem::swap(
&mut value,
self.node_mut(id).item_mut(pivot_offset).unwrap(),
);
let left_offset = self
.node_mut(deficient_child_id)
.push_right(value, opt_child_id);
if let Some(child_id) = opt_child_id {
self.node_mut(child_id).set_parent(Some(deficient_child_id))
}
if addr.id == right_sibling_id {
if addr.offset == 0 {
addr.id = id;
addr.offset = pivot_offset;
} else {
addr.offset.decr();
}
} else if addr.id == id {
if addr.offset == pivot_offset {
addr.id = deficient_child_id;
addr.offset = left_offset;
}
}
true }
Err(WouldUnderflow) => false, }
}
#[inline]
fn try_rotate_right(
&mut self,
id: usize,
deficient_child_index: usize,
addr: &mut Address,
) -> bool {
if deficient_child_index > 0 {
let left_sibling_index = deficient_child_index - 1;
let pivot_offset = left_sibling_index.into();
let (left_sibling_id, deficient_child_id) = {
let node = self.node(id);
(
node.child_id(left_sibling_index),
node.child_id(deficient_child_index),
)
};
match self.node_mut(left_sibling_id).pop_right() {
Ok((left_offset, mut value, opt_child_id)) => {
std::mem::swap(
&mut value,
self.node_mut(id).item_mut(pivot_offset).unwrap(),
);
self.node_mut(deficient_child_id)
.push_left(value, opt_child_id);
if let Some(child_id) = opt_child_id {
self.node_mut(child_id).set_parent(Some(deficient_child_id))
}
if addr.id == deficient_child_id {
addr.offset.incr();
} else if addr.id == left_sibling_id {
if addr.offset == left_offset {
addr.id = id;
addr.offset = pivot_offset;
}
} else if addr.id == id {
if addr.offset == pivot_offset {
addr.id = deficient_child_id;
addr.offset = 0.into();
}
}
true }
Err(WouldUnderflow) => false, }
} else {
false }
}
#[inline]
fn merge(
&mut self,
id: usize,
deficient_child_index: usize,
mut addr: Address,
) -> (Balance, Address) {
let (offset, left_id, right_id, separator, balance) = if deficient_child_index > 0 {
self.node_mut(id)
.merge(deficient_child_index - 1, deficient_child_index)
} else {
self.node_mut(id)
.merge(deficient_child_index, deficient_child_index + 1)
};
let right_node = self.release_node(right_id);
for right_child_id in right_node.children() {
self.node_mut(right_child_id).set_parent(Some(left_id));
}
let left_offset = self.node_mut(left_id).append(separator, right_node);
if addr.id == id {
match addr.offset.partial_cmp(&offset) {
Some(Ordering::Equal) => {
addr.id = left_id;
addr.offset = left_offset
}
Some(Ordering::Greater) => addr.offset.decr(),
_ => (),
}
} else if addr.id == right_id {
addr.id = left_id;
addr.offset = (addr.offset.unwrap() + left_offset.unwrap() + 1).into();
}
(balance, addr)
}
}
impl<K: Ord, Q: ?Sized, V, C: Slab<Node<K, V>>> Index<&Q> for BTreeMap<K, V, C>
where
K: Borrow<Q>,
Q: Ord,
C: SimpleCollectionRef,
{
type Output = V;
#[inline]
fn index(&self, key: &Q) -> &V {
self.get(key).expect("no entry found for key")
}
}
impl<K, L: PartialEq<K>, V, W: PartialEq<V>, C: Slab<Node<K, V>>, D: Slab<Node<L, W>>>
PartialEq<BTreeMap<L, W, D>> for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
fn eq(&self, other: &BTreeMap<L, W, D>) -> bool {
if self.len() == other.len() {
let mut it1 = self.iter();
let mut it2 = other.iter();
loop {
match (it1.next(), it2.next()) {
(None, None) => break,
(Some((k, v)), Some((l, w))) => {
if l != k || w != v {
return false;
}
}
_ => return false,
}
}
true
} else {
false
}
}
}
impl<K, V, C: Default> Default for BTreeMap<K, V, C> {
#[inline]
fn default() -> Self {
BTreeMap::new()
}
}
impl<K: Ord, V, C: SlabMut<Node<K, V>> + Default> FromIterator<(K, V)> for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn from_iter<T>(iter: T) -> BTreeMap<K, V, C>
where
T: IntoIterator<Item = (K, V)>,
{
let mut map = BTreeMap::new();
for (key, value) in iter {
map.insert(key, value);
}
map
}
}
impl<K: Ord, V, C: SlabMut<Node<K, V>>> Extend<(K, V)> for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn extend<T>(&mut self, iter: T)
where
T: IntoIterator<Item = (K, V)>,
{
for (key, value) in iter {
self.insert(key, value);
}
}
}
impl<'a, K: Ord + Copy, V: Copy, C: SlabMut<Node<K, V>>> Extend<(&'a K, &'a V)>
for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn extend<T>(&mut self, iter: T)
where
T: IntoIterator<Item = (&'a K, &'a V)>,
{
self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
}
}
impl<K: Eq, V: Eq, C: Slab<Node<K, V>>> Eq for BTreeMap<K, V, C> where C: SimpleCollectionRef {}
impl<K, L: PartialOrd<K>, V, W: PartialOrd<V>, C: Slab<Node<K, V>>, D: Slab<Node<L, W>>>
PartialOrd<BTreeMap<L, W, D>> for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
fn partial_cmp(&self, other: &BTreeMap<L, W, D>) -> Option<Ordering> {
let mut it1 = self.iter();
let mut it2 = other.iter();
loop {
match (it1.next(), it2.next()) {
(None, None) => return Some(Ordering::Equal),
(_, None) => return Some(Ordering::Greater),
(None, _) => return Some(Ordering::Less),
(Some((k, v)), Some((l, w))) => match l.partial_cmp(k) {
Some(Ordering::Greater) => return Some(Ordering::Less),
Some(Ordering::Less) => return Some(Ordering::Greater),
Some(Ordering::Equal) => match w.partial_cmp(v) {
Some(Ordering::Greater) => return Some(Ordering::Less),
Some(Ordering::Less) => return Some(Ordering::Greater),
Some(Ordering::Equal) => (),
None => return None,
},
None => return None,
},
}
}
}
}
impl<K: Ord, V: Ord, C: Slab<Node<K, V>>> Ord for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
{
fn cmp(&self, other: &BTreeMap<K, V, C>) -> Ordering {
let mut it1 = self.iter();
let mut it2 = other.iter();
loop {
match (it1.next(), it2.next()) {
(None, None) => return Ordering::Equal,
(_, None) => return Ordering::Greater,
(None, _) => return Ordering::Less,
(Some((k, v)), Some((l, w))) => match l.cmp(k) {
Ordering::Greater => return Ordering::Less,
Ordering::Less => return Ordering::Greater,
Ordering::Equal => match w.cmp(v) {
Ordering::Greater => return Ordering::Less,
Ordering::Less => return Ordering::Greater,
Ordering::Equal => (),
},
},
}
}
}
}
impl<K: Hash, V: Hash, C: Slab<Node<K, V>>> Hash for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn hash<H: Hasher>(&self, h: &mut H) {
for (k, v) in self {
k.hash(h);
v.hash(h);
}
}
}
pub struct Iter<'a, K, V, C> {
btree: &'a BTreeMap<K, V, C>,
addr: Option<Address>,
end: Option<Address>,
len: usize,
}
impl<'a, K, V, C: Slab<Node<K, V>>> Iter<'a, K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn new(btree: &'a BTreeMap<K, V, C>) -> Self {
let addr = btree.first_item_address();
let len = btree.len();
Iter {
btree,
addr,
end: None,
len,
}
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> Iterator for Iter<'a, K, V, C>
where
C: SimpleCollectionRef,
{
type Item = (&'a K, &'a V);
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a V)> {
match self.addr {
Some(addr) => {
if self.len > 0 {
self.len -= 1;
let item = self.btree.item(addr).unwrap();
self.addr = self.btree.next_item_address(addr);
Some((item.key(), item.value()))
} else {
None
}
}
None => None,
}
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> FusedIterator for Iter<'a, K, V, C> where C: SimpleCollectionRef {}
impl<'a, K, V, C: Slab<Node<K, V>>> ExactSizeIterator for Iter<'a, K, V, C> where
C: SimpleCollectionRef
{
}
impl<'a, K, V, C: Slab<Node<K, V>>> DoubleEndedIterator for Iter<'a, K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
if self.len > 0 {
let addr = match self.end {
Some(addr) => self.btree.previous_item_address(addr).unwrap(),
None => self.btree.last_item_address().unwrap(),
};
self.len -= 1;
let item = self.btree.item(addr).unwrap();
self.end = Some(addr);
Some((item.key(), item.value()))
} else {
None
}
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> IntoIterator for &'a BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
{
type IntoIter = Iter<'a, K, V, C>;
type Item = (&'a K, &'a V);
#[inline]
fn into_iter(self) -> Iter<'a, K, V, C> {
self.iter()
}
}
pub struct IterMut<'a, K, V, C> {
btree: &'a mut BTreeMap<K, V, C>,
addr: Option<Address>,
end: Option<Address>,
len: usize,
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> IterMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn new(btree: &'a mut BTreeMap<K, V, C>) -> Self {
let addr = btree.first_item_address();
let len = btree.len();
IterMut {
btree,
addr,
end: None,
len,
}
}
#[inline]
fn next_item(&mut self) -> Option<&'a mut Item<K, V>> {
match self.addr {
Some(addr) => {
if self.len > 0 {
self.len -= 1;
self.addr = self.btree.next_item_address(addr);
let item = self.btree.item_mut(addr).unwrap();
Some(unsafe { std::mem::transmute(item) }) } else {
None
}
}
None => None,
}
}
#[inline]
fn next_back_item(&mut self) -> Option<&'a mut Item<K, V>> {
if self.len > 0 {
let addr = match self.end {
Some(addr) => self.btree.previous_item_address(addr).unwrap(),
None => self.btree.last_item_address().unwrap(),
};
self.len -= 1;
let item = self.btree.item_mut(addr).unwrap();
self.end = Some(addr);
Some(unsafe { std::mem::transmute(item) }) } else {
None
}
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> Iterator for IterMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = (&'a K, &'a mut V);
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
self.next_item().map(|item| {
let (key, value) = item.as_pair_mut();
(key as &'a K, value)
})
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> FusedIterator for IterMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> ExactSizeIterator for IterMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> DoubleEndedIterator for IterMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
self.next_back_item().map(|item| {
let (key, value) = item.as_pair_mut();
(key as &'a K, value)
})
}
}
pub struct EntriesMut<'a, K, V, C> {
btree: &'a mut BTreeMap<K, V, C>,
addr: Address,
len: usize,
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> EntriesMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn new(btree: &'a mut BTreeMap<K, V, C>) -> EntriesMut<'a, K, V, C> {
let addr = btree.first_back_address();
let len = btree.len();
EntriesMut { btree, addr, len }
}
#[inline]
pub fn peek(&'a self) -> Option<&'a Item<K, V>> {
self.btree.item(self.addr)
}
#[inline]
pub fn peek_mut(&'a mut self) -> Option<&'a mut Item<K, V>> {
self.btree.item_mut(self.addr)
}
#[inline]
pub fn next_item(&mut self) -> Option<&'a mut Item<K, V>> {
let after_addr = self.btree.next_item_or_back_address(self.addr);
match self.btree.item_mut(self.addr) {
Some(item) => unsafe {
self.len -= 1;
self.addr = after_addr.unwrap();
Some(&mut *(item as *mut _)) },
None => None,
}
}
#[inline]
pub fn insert(&mut self, key: K, value: V) {
let addr = self.btree.insert_at(self.addr, Item::new(key, value));
self.btree.next_item_or_back_address(addr);
self.len += 1;
}
#[inline]
pub fn remove(&mut self) -> Option<Item<K, V>> {
match self.btree.remove_at(self.addr) {
Some((item, addr)) => {
self.len -= 1;
self.addr = addr;
Some(item)
}
None => None,
}
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> Iterator for EntriesMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = (&'a K, &'a mut V);
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
match self.next_item() {
Some(item) => {
let (key, value) = item.as_pair_mut();
Some((key, value)) }
None => None,
}
}
}
pub struct IntoIter<K, V, C> {
btree: BTreeMap<K, V, C>,
addr: Option<Address>,
end: Option<Address>,
len: usize,
}
impl<K, V, C: SlabMut<Node<K, V>>> IntoIter<K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
pub fn new(btree: BTreeMap<K, V, C>) -> Self {
let addr = btree.first_item_address();
let len = btree.len();
IntoIter {
btree,
addr,
end: None,
len,
}
}
}
impl<K, V, C: SlabMut<Node<K, V>>> FusedIterator for IntoIter<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<K, V, C: SlabMut<Node<K, V>>> ExactSizeIterator for IntoIter<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<K, V, C: SlabMut<Node<K, V>>> Iterator for IntoIter<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = (K, V);
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
#[inline]
fn next(&mut self) -> Option<(K, V)> {
match self.addr {
Some(addr) => {
if self.len > 0 {
self.len -= 1;
let item = unsafe {
std::ptr::read(self.btree.item(addr).unwrap())
};
if self.len > 0 {
self.addr = self.btree.next_back_address(addr);
while let Some(addr) = self.addr {
if addr.offset < self.btree.node(addr.id).item_count() {
break; } else {
self.addr = self.btree.next_back_address(addr);
let node = self.btree.release_node(addr.id);
std::mem::forget(node); }
}
} else {
if self.end.is_some() {
while self.addr != self.end {
let addr = self.addr.unwrap();
self.addr = self.btree.next_back_address(addr);
if addr.offset >= self.btree.node(addr.id).item_count() {
let node = self.btree.release_node(addr.id);
std::mem::forget(node); }
}
}
if let Some(addr) = self.addr {
let mut id = Some(addr.id);
while let Some(node_id) = id {
let node = self.btree.release_node(node_id);
id = node.parent();
std::mem::forget(node); }
}
}
Some(item.into_pair())
} else {
None
}
}
None => None,
}
}
}
impl<K, V, C: SlabMut<Node<K, V>>> DoubleEndedIterator for IntoIter<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
fn next_back(&mut self) -> Option<(K, V)> {
if self.len > 0 {
let addr = match self.end {
Some(mut addr) => {
addr = self.btree.previous_front_address(addr).unwrap();
while addr.offset.is_before() {
let id = addr.id;
addr = self.btree.previous_front_address(addr).unwrap();
let node = self.btree.release_node(id);
std::mem::forget(node); }
addr
}
None => self.btree.last_item_address().unwrap(),
};
self.len -= 1;
let item = unsafe {
std::ptr::read(self.btree.item(addr).unwrap())
};
self.end = Some(addr);
if self.len == 0 {
while self.addr != self.end {
let addr = self.addr.unwrap();
self.addr = self.btree.next_back_address(addr);
if addr.offset >= self.btree.node(addr.id).item_count() {
let node = self.btree.release_node(addr.id);
std::mem::forget(node); }
}
if let Some(addr) = self.addr {
let mut id = Some(addr.id);
while let Some(node_id) = id {
let node = self.btree.release_node(node_id);
id = node.parent();
std::mem::forget(node); }
}
}
Some(item.into_pair())
} else {
None
}
}
}
impl<K, V, C: SlabMut<Node<K, V>>> IntoIterator for BTreeMap<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type IntoIter = IntoIter<K, V, C>;
type Item = (K, V);
#[inline]
fn into_iter(self) -> IntoIter<K, V, C> {
IntoIter::new(self)
}
}
pub(crate) struct DrainFilterInner<'a, K, V, C> {
btree: &'a mut BTreeMap<K, V, C>,
addr: Address,
len: usize,
}
impl<'a, K: 'a, V: 'a, C: SlabMut<Node<K, V>>> DrainFilterInner<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
pub fn new(btree: &'a mut BTreeMap<K, V, C>) -> Self {
let addr = btree.first_back_address();
let len = btree.len();
DrainFilterInner { btree, addr, len }
}
#[inline]
pub fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.len))
}
#[inline]
fn next_item<F>(&mut self, pred: &mut F) -> Option<Item<K, V>>
where
F: FnMut(&K, &mut V) -> bool,
{
if self.addr.id == usize::MAX {
return None;
}
loop {
match self.btree.item_mut(self.addr) {
Some(item) => {
let (key, value) = item.as_pair_mut();
self.len -= 1;
if (*pred)(key, value) {
let (item, next_addr) = self.btree.remove_at(self.addr).unwrap();
self.addr = next_addr;
return Some(item);
} else {
self.addr = self.btree.next_item_or_back_address(self.addr).unwrap();
}
}
None => return None,
}
}
}
#[inline]
pub fn next<F>(&mut self, pred: &mut F) -> Option<(K, V)>
where
F: FnMut(&K, &mut V) -> bool,
{
self.next_item(pred).map(Item::into_pair)
}
}
pub struct DrainFilter<'a, K, V, C: SlabMut<Node<K, V>>, F>
where
F: FnMut(&K, &mut V) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
pred: F,
inner: DrainFilterInner<'a, K, V, C>,
}
impl<'a, K: 'a, V: 'a, C: SlabMut<Node<K, V>>, F> DrainFilter<'a, K, V, C, F>
where
F: FnMut(&K, &mut V) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn new(btree: &'a mut BTreeMap<K, V, C>, pred: F) -> Self {
DrainFilter {
pred,
inner: DrainFilterInner::new(btree),
}
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>, F> FusedIterator for DrainFilter<'a, K, V, C, F>
where
F: FnMut(&K, &mut V) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>, F> Iterator for DrainFilter<'a, K, V, C, F>
where
F: FnMut(&K, &mut V) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = (K, V);
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<(K, V)> {
self.inner.next(&mut self.pred)
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>, F> Drop for DrainFilter<'a, K, V, C, F>
where
F: FnMut(&K, &mut V) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn drop(&mut self) {
loop {
if self.next().is_none() {
break;
}
}
}
}
pub struct Keys<'a, K, V, C> {
inner: Iter<'a, K, V, C>,
}
impl<'a, K, V, C: Slab<Node<K, V>>> FusedIterator for Keys<'a, K, V, C> where C: SimpleCollectionRef {}
impl<'a, K, V, C: Slab<Node<K, V>>> ExactSizeIterator for Keys<'a, K, V, C> where
C: SimpleCollectionRef
{
}
impl<'a, K, V, C: Slab<Node<K, V>>> Iterator for Keys<'a, K, V, C>
where
C: SimpleCollectionRef,
{
type Item = &'a K;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<&'a K> {
self.inner.next().map(|(k, _)| k)
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> DoubleEndedIterator for Keys<'a, K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<&'a K> {
self.inner.next_back().map(|(k, _)| k)
}
}
impl<K, V, C: SlabMut<Node<K, V>>> FusedIterator for IntoKeys<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<K, V, C: SlabMut<Node<K, V>>> ExactSizeIterator for IntoKeys<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
pub struct IntoKeys<K, V, C> {
inner: IntoIter<K, V, C>,
}
impl<K, V, C: SlabMut<Node<K, V>>> Iterator for IntoKeys<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = K;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<K> {
self.inner.next().map(|(k, _)| k)
}
}
impl<K, V, C: SlabMut<Node<K, V>>> DoubleEndedIterator for IntoKeys<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn next_back(&mut self) -> Option<K> {
self.inner.next_back().map(|(k, _)| k)
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> FusedIterator for Values<'a, K, V, C> where
C: SimpleCollectionRef
{
}
impl<'a, K, V, C: Slab<Node<K, V>>> ExactSizeIterator for Values<'a, K, V, C> where
C: SimpleCollectionRef
{
}
pub struct Values<'a, K, V, C> {
inner: Iter<'a, K, V, C>,
}
impl<'a, K, V, C: Slab<Node<K, V>>> Iterator for Values<'a, K, V, C>
where
C: SimpleCollectionRef,
{
type Item = &'a V;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<&'a V> {
self.inner.next().map(|(_, v)| v)
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> DoubleEndedIterator for Values<'a, K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<&'a V> {
self.inner.next_back().map(|(_, v)| v)
}
}
pub struct ValuesMut<'a, K, V, C> {
inner: IterMut<'a, K, V, C>,
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> FusedIterator for ValuesMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> ExactSizeIterator for ValuesMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> Iterator for ValuesMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = &'a mut V;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<&'a mut V> {
self.inner.next().map(|(_, v)| v)
}
}
pub struct IntoValues<K, V, C> {
inner: IntoIter<K, V, C>,
}
impl<K, V, C: SlabMut<Node<K, V>>> FusedIterator for IntoValues<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<K, V, C: SlabMut<Node<K, V>>> ExactSizeIterator for IntoValues<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<K, V, C: SlabMut<Node<K, V>>> Iterator for IntoValues<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = V;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<V> {
self.inner.next().map(|(_, v)| v)
}
}
impl<K, V, C: SlabMut<Node<K, V>>> DoubleEndedIterator for IntoValues<K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn next_back(&mut self) -> Option<V> {
self.inner.next_back().map(|(_, v)| v)
}
}
fn is_valid_range<T, R>(range: &R) -> bool
where
T: Ord + ?Sized,
R: RangeBounds<T>,
{
match (range.start_bound(), range.end_bound()) {
(Bound::Included(start), Bound::Included(end)) => start <= end,
(Bound::Included(start), Bound::Excluded(end)) => start <= end,
(Bound::Included(_), Bound::Unbounded) => true,
(Bound::Excluded(start), Bound::Included(end)) => start <= end,
(Bound::Excluded(start), Bound::Excluded(end)) => start < end,
(Bound::Excluded(_), Bound::Unbounded) => true,
(Bound::Unbounded, _) => true,
}
}
pub struct Range<'a, K, V, C> {
btree: &'a BTreeMap<K, V, C>,
addr: Address,
end: Address,
}
impl<'a, K, V, C: Slab<Node<K, V>>> Range<'a, K, V, C>
where
C: SimpleCollectionRef,
{
fn new<T, R>(btree: &'a BTreeMap<K, V, C>, range: R) -> Self
where
T: Ord + ?Sized,
R: RangeBounds<T>,
K: Borrow<T>,
{
if !is_valid_range(&range) {
panic!("Invalid range")
}
let addr = match range.start_bound() {
Bound::Included(start) => match btree.address_of(start) {
Ok(addr) => addr,
Err(addr) => addr,
},
Bound::Excluded(start) => match btree.address_of(start) {
Ok(addr) => btree.next_item_or_back_address(addr).unwrap(),
Err(addr) => addr,
},
Bound::Unbounded => btree.first_back_address(),
};
let end = match range.end_bound() {
Bound::Included(end) => match btree.address_of(end) {
Ok(addr) => btree.next_item_or_back_address(addr).unwrap(),
Err(addr) => addr,
},
Bound::Excluded(end) => match btree.address_of(end) {
Ok(addr) => addr,
Err(addr) => addr,
},
Bound::Unbounded => btree.first_back_address(),
};
Range { btree, addr, end }
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> Iterator for Range<'a, K, V, C>
where
C: SimpleCollectionRef,
{
type Item = (&'a K, &'a V);
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a V)> {
if self.addr != self.end {
let item = self.btree.item(self.addr).unwrap();
self.addr = self.btree.next_item_or_back_address(self.addr).unwrap();
Some((item.key(), item.value()))
} else {
None
}
}
}
impl<'a, K, V, C: Slab<Node<K, V>>> FusedIterator for Range<'a, K, V, C> where C: SimpleCollectionRef
{}
impl<'a, K, V, C: Slab<Node<K, V>>> DoubleEndedIterator for Range<'a, K, V, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
if self.addr != self.end {
let addr = self.btree.previous_item_address(self.addr).unwrap();
let item = self.btree.item(addr).unwrap();
self.end = addr;
Some((item.key(), item.value()))
} else {
None
}
}
}
pub struct RangeMut<'a, K, V, C> {
btree: &'a mut BTreeMap<K, V, C>,
addr: Address,
end: Address,
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> RangeMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
fn new<T, R>(btree: &'a mut BTreeMap<K, V, C>, range: R) -> Self
where
T: Ord + ?Sized,
R: RangeBounds<T>,
K: Borrow<T>,
{
if !is_valid_range(&range) {
panic!("Invalid range")
}
let addr = match range.start_bound() {
Bound::Included(start) => match btree.address_of(start) {
Ok(addr) => addr,
Err(addr) => addr,
},
Bound::Excluded(start) => match btree.address_of(start) {
Ok(addr) => btree.next_item_or_back_address(addr).unwrap(),
Err(addr) => addr,
},
Bound::Unbounded => btree.first_back_address(),
};
let end = match range.end_bound() {
Bound::Included(end) => match btree.address_of(end) {
Ok(addr) => btree.next_item_or_back_address(addr).unwrap(),
Err(addr) => addr,
},
Bound::Excluded(end) => match btree.address_of(end) {
Ok(addr) => addr,
Err(addr) => addr,
},
Bound::Unbounded => btree.first_back_address(),
};
RangeMut { btree, addr, end }
}
#[inline]
fn next_item(&mut self) -> Option<&'a mut Item<K, V>> {
if self.addr != self.end {
let addr = self.addr;
self.addr = self.btree.next_item_or_back_address(addr).unwrap();
let item = self.btree.item_mut(addr).unwrap();
Some(unsafe { std::mem::transmute(item) }) } else {
None
}
}
#[inline]
fn next_back_item(&mut self) -> Option<&'a mut Item<K, V>> {
if self.addr != self.end {
let addr = self.btree.previous_item_address(self.addr).unwrap();
let item = self.btree.item_mut(addr).unwrap();
self.end = addr;
Some(unsafe { std::mem::transmute(item) }) } else {
None
}
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> Iterator for RangeMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = (&'a K, &'a mut V);
#[inline]
fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
self.next_item().map(|item| {
let (key, value) = item.as_pair_mut();
(key as &'a K, value)
})
}
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> FusedIterator for RangeMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, K, V, C: SlabMut<Node<K, V>>> DoubleEndedIterator for RangeMut<'a, K, V, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
self.next_back_item().map(|item| {
let (key, value) = item.as_pair_mut();
(key as &'a K, value)
})
}
}