use core::fmt::{self, Debug};
use Entry::*;
use crate::collections::btree_map as map;
use crate::collections::btree_map::{DefaultTuning, Tuning};
pub enum Entry<'a, T, A: Tuning = DefaultTuning> {
Occupied(OccupiedEntry<'a, T, A>),
Vacant(VacantEntry<'a, T, A>),
}
impl<T: Debug + Ord, A: Tuning> Debug for Entry<'_, T, A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(),
Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(),
}
}
}
pub struct OccupiedEntry<'a, T, A: Tuning = DefaultTuning> {
pub(super) inner: map::OccupiedEntry<'a, T, (), A>,
}
impl<T: Debug + Ord, A: Tuning> Debug for OccupiedEntry<'_, T, A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("OccupiedEntry")
.field("value", self.get())
.finish()
}
}
pub struct VacantEntry<'a, T, A: Tuning = DefaultTuning> {
pub(super) inner: map::VacantEntry<'a, T, (), A>,
}
impl<T: Debug + Ord, A: Tuning> Debug for VacantEntry<'_, T, A> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("VacantEntry").field(self.get()).finish()
}
}
impl<'a, T: Ord, A: Tuning> Entry<'a, T, A> {
#[inline]
pub fn insert(self) -> OccupiedEntry<'a, T, A> {
match self {
Occupied(entry) => entry,
Vacant(entry) => entry.insert_entry(),
}
}
#[inline]
pub fn or_insert(self) {
if let Vacant(entry) = self {
entry.insert();
}
}
#[inline]
pub fn get(&self) -> &T {
match *self {
Occupied(ref entry) => entry.get(),
Vacant(ref entry) => entry.get(),
}
}
}
impl<'a, T: Ord, A: Tuning> OccupiedEntry<'a, T, A> {
#[inline]
pub fn get(&self) -> &T {
self.inner.key()
}
#[inline]
pub fn remove(self) -> T {
self.inner.remove_entry().0
}
}
impl<'a, T: Ord, A: Tuning> VacantEntry<'a, T, A> {
#[inline]
pub fn get(&self) -> &T {
self.inner.key()
}
#[inline]
pub fn into_value(self) -> T {
self.inner.into_key()
}
#[inline]
pub fn insert(self) {
self.inner.insert(());
}
#[inline]
fn insert_entry(self) -> OccupiedEntry<'a, T, A> {
OccupiedEntry {
inner: self.inner.insert_entry(()),
}
}
}