use core::borrow::Borrow;
use core::fmt;
use core::iter::{FusedIterator, Peekable};
use core::ops::RangeBounds;
use tinyvec::ArrayVec;
use crate::map::SgMap;
use crate::tree::{
Idx, IntoIter as TreeIntoIter, Iter as TreeIter, IterMut as TreeIterMut, SmallNode,
};
pub struct Iter<'a, T: Ord + Default, V: Default, const N: usize> {
ref_iter: TreeIter<'a, T, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iter<'a, K, V, N> {
pub(crate) fn new(map: &'a SgMap<K, V, N>) -> Self {
Iter {
ref_iter: TreeIter::new(&map.bst),
}
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for Iter<'a, K, V, N> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
self.ref_iter.next()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for Iter<'a, K, V, N> {
fn len(&self) -> usize {
self.ref_iter.len()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for Iter<'a, K, V, N> {}
pub struct IntoIter<K: Ord + Default, V: Default, const N: usize> {
cons_iter: TreeIntoIter<K, V, N>,
}
impl<K: Ord + Default, V: Default, const N: usize> IntoIter<K, V, N> {
pub(crate) fn new(map: SgMap<K, V, N>) -> Self {
IntoIter {
cons_iter: TreeIntoIter::new(map.bst),
}
}
}
impl<K: Ord + Default, V: Default, const N: usize> Iterator for IntoIter<K, V, N> {
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
self.cons_iter.next()
}
}
impl<K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for IntoIter<K, V, N> {
fn len(&self) -> usize {
self.cons_iter.len()
}
}
impl<K: Ord + Default, V: Default, const N: usize> FusedIterator for IntoIter<K, V, N> {}
pub struct IterMut<'a, K: Ord + Default, V: Default, const N: usize> {
mut_iter: TreeIterMut<'a, K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> IterMut<'a, K, V, N> {
pub(crate) fn new(map: &'a mut SgMap<K, V, N>) -> Self {
IterMut {
mut_iter: TreeIterMut::new(&mut map.bst),
}
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for IterMut<'a, K, V, N> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
self.mut_iter.next()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for IterMut<'a, K, V, N> {
fn len(&self) -> usize {
self.mut_iter.len()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for IterMut<'a, K, V, N> {}
pub struct Keys<'a, K: Ord + Default, V: Default, const N: usize> {
pub(crate) inner: Iter<'a, K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for Keys<'a, K, V, N> {
type Item = &'a K;
fn next(&mut self) -> Option<&'a K> {
self.inner.next().map(|(k, _)| k)
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for Keys<'a, K, V, N> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for Keys<'a, K, V, N> {}
pub struct IntoKeys<K: Ord + Default, V: Default, const N: usize> {
pub(crate) inner: IntoIter<K, V, N>,
}
impl<K: Ord + Default, V: Default, const N: usize> Iterator for IntoKeys<K, V, N> {
type Item = K;
fn next(&mut self) -> Option<K> {
self.inner.next().map(|(k, _)| k)
}
}
impl<K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for IntoKeys<K, V, N> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K: Ord + Default, V: Default, const N: usize> FusedIterator for IntoKeys<K, V, N> {}
pub struct Values<'a, K: Ord + Default, V: Default, const N: usize> {
pub(crate) inner: Iter<'a, K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for Values<'a, K, V, N> {
type Item = &'a V;
fn next(&mut self) -> Option<&'a V> {
self.inner.next().map(|(_, v)| v)
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for Values<'a, K, V, N> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for Values<'a, K, V, N> {}
pub struct IntoValues<K: Ord + Default, V: Default, const N: usize> {
pub(crate) inner: IntoIter<K, V, N>,
}
impl<K: Ord + Default, V: Default, const N: usize> Iterator for IntoValues<K, V, N> {
type Item = V;
fn next(&mut self) -> Option<V> {
self.inner.next().map(|(_, v)| v)
}
}
impl<K: Ord + Default, V: Default, const N: usize> ExactSizeIterator for IntoValues<K, V, N> {
fn len(&self) -> usize {
self.inner.len()
}
}
impl<K: Ord + Default, V: Default, const N: usize> FusedIterator for IntoValues<K, V, N> {}
pub struct ValuesMut<'a, K: Ord + Default, V: Default, const N: usize> {
pub(crate) inner: IterMut<'a, K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for ValuesMut<'a, K, V, N> {
type Item = &'a mut V;
fn next(&mut self) -> Option<&'a mut V> {
self.inner.next().map(|(_, v)| v)
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> ExactSizeIterator
for ValuesMut<'a, K, V, N>
{
fn len(&self) -> usize {
self.inner.len()
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for ValuesMut<'a, K, V, N> {}
pub enum Entry<'a, K: Ord + Default, V: Default, const N: usize> {
Vacant(VacantEntry<'a, K, V, N>),
Occupied(OccupiedEntry<'a, K, V, N>),
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Entry<'a, K, V, N> {
pub fn or_insert(self, default: V) -> &'a mut V {
match self {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => entry.insert(default),
}
}
pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
match self {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => entry.insert(default()),
}
}
pub fn or_insert_with_key<F: FnOnce(&K) -> V>(self, default: F) -> &'a mut V {
match self {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => {
let value = default(entry.key());
entry.insert(value)
}
}
}
pub fn key(&self) -> &K {
match self {
Entry::Occupied(entry) => entry.key(),
Entry::Vacant(entry) => entry.key(),
}
}
pub fn and_modify<F: FnOnce(&mut V)>(self, f: F) -> Entry<'a, K, V, N> {
match self {
Entry::Occupied(mut entry) => {
f(entry.get_mut());
Entry::Occupied(entry)
}
Entry::Vacant(entry) => Entry::Vacant(entry),
}
}
pub fn or_default(self) -> &'a mut V {
match self {
Entry::Occupied(entry) => entry.into_mut(),
Entry::Vacant(entry) => entry.insert(Default::default()),
}
}
}
pub struct VacantEntry<'a, K: Ord + Default, V: Default, const N: usize> {
pub(super) key: K,
pub(super) table: &'a mut SgMap<K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> VacantEntry<'a, K, V, N> {
pub fn key(&self) -> &K {
&self.key
}
pub fn into_key(self) -> K {
self.key
}
pub fn insert(self, value: V) -> &'a mut V {
let (_, new_node_idx) = self
.table
.bst
.internal_balancing_insert::<Idx>(self.key, value);
self.table.bst.arena[new_node_idx].get_mut().1
}
}
pub struct OccupiedEntry<'a, K: Ord + Default, V: Default, const N: usize> {
pub(super) node_idx: usize,
pub(super) table: &'a mut SgMap<K, V, N>,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> OccupiedEntry<'a, K, V, N> {
pub fn key(&self) -> &K {
self.table.bst.arena[self.node_idx].key()
}
pub fn get(&self) -> &V {
self.table.bst.arena[self.node_idx].val()
}
pub fn get_mut(&mut self) -> &mut V {
self.table.bst.arena[self.node_idx].get_mut().1
}
pub fn into_mut(self) -> &'a mut V {
self.table.bst.arena[self.node_idx].get_mut().1
}
pub fn insert(&mut self, value: V) -> V {
core::mem::replace(self.get_mut(), value)
}
pub fn remove_entry(self) -> (K, V) {
self.table
.bst
.priv_remove_by_idx(self.node_idx)
.expect("Must be occupied")
}
pub fn remove(self) -> V {
self.remove_entry().1
}
}
pub struct OccupiedError<'a, K: 'a + Ord + Default, V: 'a + Default, const N: usize> {
pub entry: OccupiedEntry<'a, K, V, N>,
pub value: V,
}
impl<K: fmt::Debug + Ord + Default, V: fmt::Debug + Default, const N: usize> fmt::Debug
for OccupiedError<'_, K, V, N>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("OccupiedError")
.field("key", self.entry.key())
.field("old_value", self.entry.get())
.field("new_value", &self.value)
.finish()
}
}
impl<'a, K: fmt::Debug + Ord + Default, V: fmt::Debug + Default, const N: usize> fmt::Display
for OccupiedError<'a, K, V, N>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"failed to insert {:?}, key {:?} already exists with value {:?}",
self.value,
self.entry.key(),
self.entry.get(),
)
}
}
pub struct Range<'a, K: Ord + Default, V: Default, const N: usize> {
pub(crate) table: &'a SgMap<K, V, N>,
pub(crate) node_idx_iter: <ArrayVec<[usize; N]> as IntoIterator>::IntoIter,
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Range<'a, K, V, N> {
fn to_node_ref(&self, idx: usize) -> (&'a K, &'a V) {
let node = &self.table.bst.arena[idx];
(node.key(), node.val())
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> Iterator for Range<'a, K, V, N> {
type Item = (&'a K, &'a V);
fn next(&mut self) -> Option<Self::Item> {
let node_idx = self.node_idx_iter.next()?;
Some(self.to_node_ref(node_idx))
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> DoubleEndedIterator for Range<'a, K, V, N> {
fn next_back(&mut self) -> Option<Self::Item> {
let node_idx = self.node_idx_iter.next_back()?;
Some(self.to_node_ref(node_idx))
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for Range<'a, K, V, N> {}
pub struct RangeMut<'a, K: Ord + Default, V: Default, const N: usize> {
inner: RangeMutPeekable<'a, K, V, N>,
last: Option<RangeMutLast<'a, K, V, N>>,
total_cnt: usize,
spent_cnt: usize,
}
type RangeMutLast<'a, K, V, const N: usize> =
<Peekable<TreeIterMut<'a, K, V, N>> as Iterator>::Item;
type RangeMutPeekable<'a, K, V, const N: usize> = Peekable<TreeIterMut<'a, K, V, N>>;
impl<'a, K, V, const N: usize> RangeMut<'a, K, V, N>
where
K: Ord + Default,
V: Default,
{
pub(crate) fn new<T, R>(map: &'a mut SgMap<K, V, N>, range: &R) -> Self
where
T: Ord + ?Sized,
K: Borrow<T> + Ord + Default,
R: RangeBounds<T>,
{
let len = RangeMut::compute_len(map, range);
let (iter, last) = RangeMut::init_iter_mut(map, range);
Self {
inner: iter,
last,
total_cnt: len,
spent_cnt: 0,
}
}
fn compute_len<T, R>(map: &SgMap<K, V, N>, range: &R) -> usize
where
T: Ord + ?Sized,
K: Borrow<T> + Ord + Default,
R: RangeBounds<T>,
{
let mut peekable = map.bst.iter().peekable();
let mut len = 0;
while let Some(node) = peekable.peek() {
if range.contains(node.0.borrow()) {
break;
}
peekable.next();
}
for node in peekable {
if range.contains(node.0.borrow()) {
len += 1;
} else {
break;
}
}
len
}
fn init_iter_mut<T, R>(
map: &'a mut SgMap<K, V, N>,
range: &R,
) -> (
RangeMutPeekable<'a, K, V, N>,
Option<RangeMutLast<'a, K, V, N>>,
)
where
T: Ord + ?Sized,
K: Borrow<T> + Ord + Default,
R: RangeBounds<T>,
{
let mut peekable = map.bst.iter_mut().peekable();
let mut last = None;
while let Some(node) = peekable.peek() {
if range.contains(node.0.borrow()) {
break;
}
peekable.next();
}
while let Some(node) = peekable.next_back() {
if range.contains(node.0.borrow()) {
last = Some(node);
break;
}
}
(peekable, last)
}
}
impl<'a, K, V, const N: usize> Iterator for RangeMut<'a, K, V, N>
where
K: Ord + Default,
V: Default,
{
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
if self.spent_cnt < self.total_cnt {
self.spent_cnt += 1;
match self.inner.next() {
Some(node) => Some(node),
None => self.last.take(),
}
} else {
None
}
}
}
impl<'a, K, V, const N: usize> DoubleEndedIterator for RangeMut<'a, K, V, N>
where
K: Ord + Default,
V: Default,
{
fn next_back(&mut self) -> Option<Self::Item> {
if self.spent_cnt < self.total_cnt {
self.spent_cnt += 1;
match self.last.take() {
Some(node) => Some(node),
None => self.inner.next_back(),
}
} else {
None
}
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> FusedIterator for RangeMut<'a, K, V, N> {}