#![deny(missing_docs)]
use std::borrow::Borrow;
use std::collections::{
btree_map::{
Entry, ExtractIf, IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, OccupiedEntry,
Range, RangeMut, Values, ValuesMut,
},
BTreeMap,
};
use std::default::Default;
use std::ops::{Index, RangeBounds};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
_inner: BTreeMap<K, V>,
_default: V,
}
impl<K, V> DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
#[must_use]
pub fn new() -> Self {
Self {
_inner: BTreeMap::new(),
_default: V::default(),
}
}
#[inline]
pub fn append(&mut self, other: &mut DefaultBTreeMap<K, V>)
where
K: Ord,
V: Clone,
{
self._inner.append(&mut other._inner);
}
#[inline]
pub fn clear(&mut self) {
self._inner.clear()
}
#[inline]
pub fn contains_key(&self, key: &K) -> bool {
self._inner.contains_key(key)
}
#[inline]
pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
self._inner.entry(key)
}
#[inline]
pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> ExtractIf<'_, K, V, R, F>
where
K: Ord,
R: RangeBounds<K>,
F: FnMut(&K, &mut V) -> bool,
{
self._inner.extract_if(range, pred)
}
#[inline]
pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
where
K: Ord,
{
self._inner.first_entry()
}
#[inline]
pub fn first_key_value(&self) -> Option<(&K, &V)>
where
K: Ord,
{
self._inner.first_key_value()
}
#[must_use]
pub fn get(&self, key: &K) -> &V {
self._inner.get(key).unwrap_or(&self._default)
}
#[inline]
pub fn get_key_value<'a>(&'a self, key: &'a K) -> (&'a K, &'a V) {
self._inner
.get_key_value(key)
.unwrap_or((key, &self._default))
}
#[must_use]
pub fn get_mut(&mut self, key: &K) -> &mut V
where
K: Eq + Clone + Ord,
{
let exists = self._inner.keys().any(|k| key == k);
if !exists {
self.insert(key.clone(), V::default());
}
self._inner.get_mut(key).unwrap()
}
#[inline]
pub fn insert(&mut self, key: K, value: V) {
let _ = &self._inner.insert(key, value);
}
#[inline]
pub fn into_keys(self) -> IntoKeys<K, V> {
self._inner.into_keys()
}
#[inline]
pub fn into_values(self) -> IntoValues<K, V> {
self._inner.into_values()
}
#[inline]
pub fn is_empty(&self) -> bool {
self._inner.is_empty()
}
#[inline]
pub fn keys(&self) -> Keys<'_, K, V> {
self._inner.keys()
}
#[inline]
pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
where
K: Ord,
{
self._inner.last_entry()
}
pub fn last_key_value(&self) -> Option<(&K, &V)>
where
K: Ord,
{
self._inner.last_key_value()
}
#[inline]
pub fn len(&self) -> usize {
self._inner.len()
}
pub fn pop_first(&mut self) -> Option<(K, V)>
where
K: Ord,
{
self._inner.pop_first()
}
pub fn pop_last(&mut self) -> Option<(K, V)>
where
K: Ord,
{
self._inner.pop_last()
}
#[inline]
pub fn range<T, R>(&self, range: R) -> Range<'_, K, V>
where
T: Ord + ?Sized,
K: Borrow<T> + Ord,
R: RangeBounds<T>,
{
self._inner.range(range)
}
#[inline]
pub fn range_mut<T, R>(&mut self, range: R) -> RangeMut<'_, K, V>
where
T: Ord + ?Sized,
K: Borrow<T> + Ord,
R: RangeBounds<T>,
{
self._inner.range_mut(range)
}
#[must_use]
pub fn remove(&mut self, key: &K) -> V {
self._inner.remove(key).unwrap_or_default()
}
#[must_use]
pub fn remove_entry(&mut self, key: &K) -> (K, V)
where
K: Clone,
V: Clone,
{
self._inner
.remove_entry(key)
.unwrap_or((key.clone(), self._default.to_owned()))
}
pub fn retain<F>(&mut self, func: F)
where
F: FnMut(&K, &mut V) -> bool,
{
self._inner.retain(func);
}
#[inline]
pub fn split_off<Q>(&mut self, key: &Q) -> DefaultBTreeMap<K, V>
where
Q: Ord + ?Sized,
K: Borrow<Q> + Ord + Clone,
{
self._inner.split_off(key).into()
}
#[inline]
pub fn values(&self) -> Values<'_, K, V> {
self._inner.values()
}
#[inline]
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
self._inner.values_mut()
}
}
impl<K, V> Default for DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
fn default() -> Self {
Self::new()
}
}
impl<K, V> IntoIterator for DefaultBTreeMap<K, V>
where
K: Eq + Ord + Clone,
V: Default,
{
type Item = (K, V);
type IntoIter = IntoIter<K, V>;
fn into_iter(self) -> Self::IntoIter {
self._inner.into_iter()
}
}
impl<'a, K, V> IntoIterator for &'a DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
type Item = (&'a K, &'a V);
type IntoIter = Iter<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
self._inner.iter()
}
}
impl<K, V> Index<&K> for DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
type Output = V;
fn index(&self, key: &K) -> &V {
self._inner.get(key).unwrap_or(&self._default)
}
}
impl<'a, K, V> IntoIterator for &'a mut DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
type Item = (&'a K, &'a mut V);
type IntoIter = IterMut<'a, K, V>;
fn into_iter(self) -> Self::IntoIter {
self._inner.iter_mut()
}
}
impl<K, V> From<BTreeMap<K, V>> for DefaultBTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
fn from(btree: BTreeMap<K, V>) -> Self {
Self {
_inner: btree,
_default: V::default(),
}
}
}
impl<K, V> From<DefaultBTreeMap<K, V>> for BTreeMap<K, V>
where
K: Eq + Ord,
V: Default,
{
fn from(btree: DefaultBTreeMap<K, V>) -> Self {
btree._inner
}
}
impl<K, V> FromIterator<(K, V)> for DefaultBTreeMap<K, V>
where
K: Ord,
V: Default,
{
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
let mut map = DefaultBTreeMap::default();
for (k, v) in iter {
map.insert(k, v);
}
map
}
}
#[macro_export]
macro_rules! defaultbtreemap {
( ) => {
{
DefaultBTreeMap::new()
}
};
( $( ($key:expr, $val:expr) ),* $(,)? ) => {
{
let mut map = DefaultBTreeMap::new();
$(
let _ = map.insert($key, $val);
)*
map
}
};
( $( $key:expr ),* $(,)? ) => {
{
let mut map = DefaultBTreeMap::new();
$(
let _ = map.get_mut(&$key);
)*
map
}
};
}