use crate::iter;
use crate::tree_core;
use std::borrow::Borrow;
use std::mem;
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SplayMap<K, V> {
tree: tree_core::Tree<K, V>,
}
impl<K, V> SplayMap<K, V>
where
K: Ord,
{
pub fn new() -> Self {
SplayMap {
tree: tree_core::Tree::new(),
}
}
pub fn clear(&mut self) {
self.tree = tree_core::Tree::new();
}
pub fn contains_key<Q>(&mut self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.contains_key(key)
}
pub fn contains_key_immut<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.contains_key_immut(key)
}
pub fn get<Q>(&mut self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.get_mut(key).map(|v| &*v)
}
pub fn get_immut<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.get_immut(key).map(|(_, v)| v)
}
pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.get(key)
}
pub fn find_lower_bound_key<Q>(&mut self, key: &Q) -> Option<&K>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.find_lower_bound(key)
}
pub fn find_lower_bound_key_immut<Q>(&self, key: &Q) -> Option<&K>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.find_lower_bound_immut(key)
}
pub fn find_upper_bound_key<Q>(&mut self, key: &Q) -> Option<&K>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.find_upper_bound(key)
}
pub fn find_upper_bound_key_immut<Q>(&self, key: &Q) -> Option<&K>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.find_upper_bound_immut(key)
}
pub fn smallest(&mut self) -> Option<(&K, &V)> {
self.tree.get_lftmost()
}
pub fn smallest_immut(&self) -> Option<(&K, &V)> {
self.tree.get_lftmost_immut()
}
pub fn take_smallest(&mut self) -> Option<(K, V)> {
self.tree.take_lftmost()
}
pub fn largest(&mut self) -> Option<(&K, &V)> {
self.tree.get_rgtmost()
}
pub fn largest_immut(&self) -> Option<(&K, &V)> {
self.tree.get_rgtmost_immut()
}
pub fn take_largest(&mut self) -> Option<(K, V)> {
self.tree.take_rgtmost()
}
pub fn insert(&mut self, key: K, value: V) -> Option<V> {
self.tree.insert(key, value)
}
pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q>,
Q: ?Sized + Ord,
{
self.tree.remove(key)
}
pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
if self.contains_key(&key) {
Entry::Occupied(OccupiedEntry {
tree: &mut self.tree,
})
} else {
Entry::Vacant(VacantEntry {
key,
tree: &mut self.tree,
})
}
}
}
impl<K, V> SplayMap<K, V> {
pub fn len(&self) -> usize {
self.tree.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn iter(&self) -> Iter<'_, K, V> {
Iter::new(&self.tree)
}
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
IterMut::new(&mut self.tree)
}
pub fn keys(&self) -> Keys<'_, K, V> {
Keys::new(&self.tree)
}
pub fn values(&self) -> Values<'_, K, V> {
Values::new(&self.tree)
}
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
ValuesMut::new(&mut self.tree)
}
}
impl<K, V> Default for SplayMap<K, V>
where
K: Ord,
{
fn default() -> Self {
SplayMap::new()
}
}
impl<K, V> std::iter::FromIterator<(K, V)> for SplayMap<K, V>
where
K: Ord,
{
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = (K, V)>,
{
let mut map = SplayMap::new();
for (k, v) in iter {
map.insert(k, v);
}
map
}
}
impl<'a, K, V> IntoIterator for &'a SplayMap<K, V>
where
K: 'a,
V: 'a,
{
type Item = (&'a K, &'a V);
type IntoIter = Iter<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
Iter::new(&self.tree)
}
}
impl<'a, K, V> IntoIterator for &'a mut SplayMap<K, V>
where
K: 'a,
V: 'a,
{
type Item = (&'a K, &'a mut V);
type IntoIter = IterMut<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
IterMut::new(&mut self.tree)
}
}
impl<K, V> IntoIterator for SplayMap<K, V> {
type Item = (K, V);
type IntoIter = IntoIter<K, V>;
fn into_iter(self) -> Self::IntoIter {
IntoIter::new(self.tree)
}
}
impl<K, V> Extend<(K, V)> for SplayMap<K, V>
where
K: Ord,
{
fn extend<T>(&mut self, iter: T)
where
T: IntoIterator<Item = (K, V)>,
{
for (k, v) in iter {
self.insert(k, v);
}
}
}
impl<'a, K, V> Extend<(&'a K, &'a V)> for SplayMap<K, V>
where
K: 'a + Copy + Ord,
V: 'a + Copy,
{
fn extend<T>(&mut self, iter: T)
where
T: IntoIterator<Item = (&'a K, &'a V)>,
{
for (k, v) in iter {
self.insert(*k, *v);
}
}
}
pub struct Iter<'a, K: 'a, V: 'a>(iter::Iter<'a, K, V>);
impl<'a, K: 'a, V: 'a> Iter<'a, K, V> {
fn new(tree: &'a tree_core::Tree<K, V>) -> Self {
Iter(tree.iter())
}
}
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> {
self.0.next()
}
}
pub struct IterMut<'a, K: 'a, V: 'a>(iter::IterMut<'a, K, V>);
impl<'a, K: 'a, V: 'a> IterMut<'a, K, V> {
fn new(tree: &'a mut tree_core::Tree<K, V>) -> Self {
IterMut(tree.iter_mut())
}
}
impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
type Item = (&'a K, &'a mut V);
fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}
pub struct IntoIter<K, V>(iter::IntoIter<K, V>);
impl<K, V> IntoIter<K, V> {
fn new(tree: tree_core::Tree<K, V>) -> Self {
IntoIter(tree.into_iter())
}
}
impl<K, V> Iterator for IntoIter<K, V> {
type Item = (K, V);
fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}
pub struct Keys<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
impl<'a, K: 'a, V: 'a> Keys<'a, K, V> {
fn new(tree: &'a tree_core::Tree<K, V>) -> Self {
Keys(Iter::new(tree))
}
}
impl<'a, K: 'a, V: 'a> Iterator for Keys<'a, K, V> {
type Item = &'a K;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(k, _)| k)
}
}
pub struct Values<'a, K: 'a, V: 'a>(Iter<'a, K, V>);
impl<'a, K: 'a, V: 'a> Values<'a, K, V> {
fn new(tree: &'a tree_core::Tree<K, V>) -> Self {
Values(Iter::new(tree))
}
}
impl<'a, K: 'a, V: 'a> Iterator for Values<'a, K, V> {
type Item = &'a V;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, v)| v)
}
}
pub struct ValuesMut<'a, K: 'a, V: 'a>(IterMut<'a, K, V>);
impl<'a, K: 'a, V: 'a> ValuesMut<'a, K, V> {
fn new(tree: &'a mut tree_core::Tree<K, V>) -> Self {
ValuesMut(IterMut::new(tree))
}
}
impl<'a, K: 'a, V: 'a> Iterator for ValuesMut<'a, K, V> {
type Item = &'a mut V;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(_, v)| v)
}
}
pub enum Entry<'a, K: 'a, V: 'a> {
Occupied(OccupiedEntry<'a, K, V>),
Vacant(VacantEntry<'a, K, V>),
}
impl<'a, K: 'a, V: 'a> Entry<'a, K, V>
where
K: Ord,
{
pub fn key(&self) -> &K {
match *self {
Entry::Occupied(ref e) => e.key(),
Entry::Vacant(ref e) => e.key(),
}
}
pub fn or_insert(self, default: V) -> &'a mut V {
match self {
Entry::Occupied(e) => e.into_mut(),
Entry::Vacant(e) => e.insert(default),
}
}
pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
match self {
Entry::Occupied(e) => e.into_mut(),
Entry::Vacant(e) => e.insert(default()),
}
}
}
pub struct OccupiedEntry<'a, K: 'a, V: 'a> {
tree: &'a mut tree_core::Tree<K, V>,
}
impl<'a, K: 'a, V: 'a> OccupiedEntry<'a, K, V>
where
K: Ord,
{
pub fn key(&self) -> &K {
&self.tree.root_ref().key
}
pub fn get(&self) -> &V {
&self.tree.root_ref().val
}
pub fn get_mut(&mut self) -> &mut V {
&mut self.tree.root_mut().val
}
pub fn into_mut(self) -> &'a mut V {
&mut self.tree.root_mut().val
}
pub fn insert(&mut self, value: V) -> V {
mem::replace(self.get_mut(), value)
}
pub fn remove(self) -> V {
self.tree.pop_root().unwrap().1
}
}
pub struct VacantEntry<'a, K: 'a, V: 'a> {
key: K,
tree: &'a mut tree_core::Tree<K, V>,
}
impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V>
where
K: Ord,
{
pub fn key(&self) -> &K {
&self.key
}
pub fn insert(self, value: V) -> &'a mut V {
self.tree.insert(self.key, value);
&mut self.tree.root_mut().val
}
}