use core::borrow::Borrow;
use core::fmt::{self, Debug};
use core::iter::FromIterator;
use core::ops::{Index, RangeBounds};
use crate::map_types::{
Entry, IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, OccupiedEntry, OccupiedError,
Range, RangeMut, VacantEntry, Values, ValuesMut,
};
use crate::tree::{node::NodeGetHelper, Idx, SgError, SgTree};
#[derive(Default, Clone, Hash, PartialEq, Eq, Ord, PartialOrd)]
pub struct SgMap<K: Ord + Default, V: Default, const N: usize> {
pub(crate) bst: SgTree<K, V, N>,
}
impl<K: Ord + Default, V: Default, const N: usize> SgMap<K, V, N> {
pub fn new() -> Self {
SgMap { bst: SgTree::new() }
}
#[doc(alias = "rebalance")]
#[doc(alias = "alpha")]
pub fn set_rebal_param(&mut self, alpha_num: f32, alpha_denom: f32) -> Result<(), SgError> {
self.bst.set_rebal_param(alpha_num, alpha_denom)
}
#[doc(alias = "rebalance")]
#[doc(alias = "alpha")]
pub fn rebal_param(&self) -> (f32, f32) {
self.bst.rebal_param()
}
pub fn capacity(&self) -> usize {
self.bst.capacity()
}
pub fn keys(&self) -> Keys<'_, K, V, N> {
Keys { inner: self.iter() }
}
pub fn into_keys(self) -> IntoKeys<K, V, N> {
IntoKeys {
inner: self.into_iter(),
}
}
pub fn values(&self) -> Values<'_, K, V, N> {
Values { inner: self.iter() }
}
pub fn into_values(self) -> IntoValues<K, V, N> {
IntoValues {
inner: self.into_iter(),
}
}
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V, N> {
ValuesMut {
inner: self.iter_mut(),
}
}
pub fn append(&mut self, other: &mut SgMap<K, V, N>) {
self.bst.append(&mut other.bst);
}
pub fn try_append(&mut self, other: &mut SgMap<K, V, N>) -> Result<(), SgError> {
self.bst.try_append(&mut other.bst)
}
pub fn insert(&mut self, key: K, val: V) -> Option<V>
where
K: Ord,
{
self.bst.insert(key, val)
}
pub fn try_insert(&mut self, key: K, val: V) -> Result<Option<V>, SgError>
where
K: Ord,
{
self.bst.try_insert(key, val)
}
pub fn try_insert_std(&mut self, key: K, value: V) -> Result<&mut V, OccupiedError<'_, K, V, N>>
where
K: Ord,
{
match self.entry(key) {
Entry::Occupied(entry) => Err(OccupiedError { entry, value }),
Entry::Vacant(entry) => Ok(entry.insert(value)),
}
}
pub fn try_extend<I: ExactSizeIterator + IntoIterator<Item = (K, V)>>(
&mut self,
iter: I,
) -> Result<(), SgError> {
self.bst.try_extend(iter)
}
pub fn try_from_iter<I: ExactSizeIterator + IntoIterator<Item = (K, V)>>(
iter: I,
) -> Result<Self, SgError> {
match iter.len() <= SgTree::<K, V, N>::max_capacity() {
true => Ok(SgMap::from_iter(iter)),
false => Err(SgError::MaximumCapacityExceeded),
}
}
pub fn iter(&self) -> Iter<'_, K, V, N> {
Iter::new(self)
}
pub fn iter_mut(&mut self) -> IterMut<'_, K, V, N> {
IterMut::new(self)
}
pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.remove_entry(key)
}
pub fn retain<F>(&mut self, mut f: F)
where
K: Ord,
F: FnMut(&K, &mut V) -> bool,
{
self.bst.retain(|k, v| f(k, v));
}
pub fn split_off<Q>(&mut self, key: &Q) -> SgMap<K, V, N>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
SgMap {
bst: self.bst.split_off(key),
}
}
pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.remove(key)
}
pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.get_key_value(key)
}
pub fn get<Q>(&self, key: &Q) -> Option<&V>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.get(key)
}
pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.get_mut(key)
}
pub fn clear(&mut self) {
self.bst.clear()
}
pub fn contains_key<Q>(&self, key: &Q) -> bool
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
self.bst.contains_key(key)
}
pub fn is_empty(&self) -> bool {
self.bst.is_empty()
}
pub fn is_full(&self) -> bool {
self.bst.is_full()
}
pub fn first_key_value(&self) -> Option<(&K, &V)>
where
K: Ord,
{
self.bst.first_key_value()
}
pub fn first_key(&self) -> Option<&K>
where
K: Ord,
{
self.bst.first_key()
}
pub fn pop_first(&mut self) -> Option<(K, V)>
where
K: Ord,
{
self.bst.pop_first()
}
pub fn last_key_value(&self) -> Option<(&K, &V)>
where
K: Ord,
{
self.bst.last_key_value()
}
pub fn last_key(&self) -> Option<&K>
where
K: Ord,
{
self.bst.last_key()
}
pub fn pop_last(&mut self) -> Option<(K, V)>
where
K: Ord,
{
self.bst.pop_last()
}
pub fn len(&self) -> usize {
self.bst.len()
}
pub fn entry(&mut self, key: K) -> Entry<'_, K, V, N> {
let ngh: NodeGetHelper<Idx> = self.bst.internal_get(None, &key);
match ngh.node_idx() {
Some(node_idx) => Entry::Occupied(OccupiedEntry {
node_idx,
table: self,
}),
None => Entry::Vacant(VacantEntry { key, table: self }),
}
}
pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, N>> {
if self.is_empty() {
return None;
}
let node_idx = self.bst.min_idx;
Some(OccupiedEntry {
node_idx,
table: self,
})
}
pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V, N>> {
if self.is_empty() {
return None;
}
let node_idx = self.bst.max_idx;
Some(OccupiedEntry {
node_idx,
table: self,
})
}
pub fn range<T, R>(&self, range: R) -> Range<'_, K, V, N>
where
T: Ord + ?Sized,
K: Borrow<T> + Ord,
R: RangeBounds<T>,
{
SgTree::<K, V, N>::assert_valid_range(&range);
Range {
table: self,
node_idx_iter: self.bst.range_search(&range).into_iter(),
}
}
pub fn range_mut<T, R>(&mut self, range: R) -> RangeMut<'_, K, V, N>
where
T: Ord + ?Sized,
K: Borrow<T> + Ord,
R: RangeBounds<T>,
{
SgTree::<K, V, N>::assert_valid_range(&range);
RangeMut::new(self, &range)
}
}
impl<K: Default, V: Default, const N: usize> Debug for SgMap<K, V, N>
where
K: Ord + Debug,
V: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_map().entries(self.bst.iter()).finish()
}
}
impl<K: Default, V: Default, const N: usize> From<[(K, V); N]> for SgMap<K, V, N>
where
K: Ord,
{
#[doc(alias = "tryfrom")]
#[doc(alias = "try_from")]
#[doc(alias = "TryFrom")]
fn from(arr: [(K, V); N]) -> Self {
IntoIterator::into_iter(arr).collect()
}
}
impl<K: Default, V: Default, Q, const N: usize> Index<&Q> for SgMap<K, V, N>
where
K: Borrow<Q> + Ord,
Q: Ord + ?Sized,
{
type Output = V;
fn index(&self, key: &Q) -> &Self::Output {
&self.bst[key]
}
}
impl<K: Default, V: Default, const N: usize> FromIterator<(K, V)> for SgMap<K, V, N>
where
K: Ord,
{
fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
let mut sgm = SgMap::new();
sgm.bst = SgTree::from_iter(iter);
sgm
}
}
impl<K: Default, V: Default, const N: usize> Extend<(K, V)> for SgMap<K, V, N>
where
K: Ord,
{
fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
self.bst.extend(iter);
}
}
impl<'a, K: Default, V: Default, const N: usize> Extend<(&'a K, &'a V)> for SgMap<K, V, N>
where
K: Ord + Copy,
V: Copy,
{
fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: I) {
self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
}
}
impl<'a, K: Ord + Default, V: Default, const N: usize> IntoIterator for &'a SgMap<K, V, N> {
type Item = (&'a K, &'a V);
type IntoIter = Iter<'a, K, V, N>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<K: Ord + Default, V: Default, const N: usize> IntoIterator for SgMap<K, V, N> {
type Item = (K, V);
type IntoIter = IntoIter<K, V, N>;
fn into_iter(self) -> Self::IntoIter {
IntoIter::new(self)
}
}