use std::mem;
use std::ops;
use std::fmt::{self, Debug};
use std::default::Default;
use self::Entry::*;
use std::iter::{Map, FromIterator};
use super::node::{Node, NodeRef, NodeRefMut, BoxedNode};
use super::traverse::{self, Traverse, ValuesTraverse, IntoTraverse, WildCardTraverse, DropTraverse};
#[derive(Clone, PartialEq, Eq)]
pub struct TSTMap<Value> {
root: BoxedNode<Value>,
size: usize,
}
impl<Value> TSTMap<Value> {
pub fn new() -> Self {
Default::default()
}
pub fn len(&self) -> usize { self.size }
pub fn insert(&mut self, key: &str, value: Value) -> Option<Value> {
assert!(!key.is_empty(), "Empty key");
match self.entry(key) {
Occupied(mut entry) => Some(entry.insert(value)),
Vacant(entry) => {
entry.insert(value);
None
}
}
}
pub fn entry(&mut self, key: &str) -> Entry<Value> {
assert!(!key.is_empty(), "Empty key");
let l = &mut self.size;
let cur = traverse::insert(self.root.as_mut(), key);
Entry::<Value>::new(cur, l)
}
pub fn remove(&mut self, key: &str) -> Option<Value> {
let ret = traverse::remove(self.root.as_mut(), key);
if ret.is_some() {
self.size -= 1;
}
ret
}
pub fn get(&self, key: &str) -> Option<&Value> {
match traverse::search(self.root.as_ref(), key) {
None => None,
Some(ptr) => ptr.value.as_ref(),
}
}
pub fn get_mut(&mut self, key: &str) -> Option<&mut Value> {
match traverse::search_mut(self.root.as_ref_mut(), key) {
None => None,
Some(ptr) => ptr.value.as_mut(),
}
}
#[inline]
pub fn contains_key(&self, key: &str) -> bool {
self.get(key).is_some()
}
#[inline]
pub fn is_empty(&self) -> bool { self.size == 0 }
pub fn clear(&mut self) { *self = TSTMap::<Value>::new(); }
pub fn wildcard_iter(&self, pat: &str) -> WildCardIter<Value> {
WildCardIter::new(self.root.as_ref(), pat, self.len())
}
pub fn wildcard_iter_mut(&mut self, pat: &str) -> WildCardIterMut<Value> {
WildCardIterMut::new(self.root.as_ref_mut(), pat, self.len())
}
pub fn prefix_iter(&self, pref: &str) -> Iter<Value> {
let node = traverse::search(self.root.as_ref(), pref);
Iter::with_prefix(node, pref, self.len())
}
pub fn prefix_iter_mut(&mut self, pref: &str) -> IterMut<Value> {
let len = self.len();
let node = traverse::search(self.root.as_ref(), pref);
IterMut::with_prefix(node, pref, len)
}
pub fn iter(&self) -> Iter<Value> {
let len = self.len();
Iter::new(self.root.as_ref(), len, len)
}
pub fn iter_mut(&mut self) -> IterMut<Value> {
let len = self.len();
IterMut::new(self.root.as_ref_mut(), len, len)
}
pub fn keys(&self) -> KeysIter<Value> {
fn first<A, B>((k, _): (A, B)) -> A { k }
KeysIter { iter: self.iter().map(first) }
}
pub fn values(&self) -> ValuesIter<Value> {
ValuesIter { iter: ValuesTraverse::new(self.root.as_ref(), self.len(), self.len()) }
}
}
impl<'x, Value: 'x> TSTMap<Value> {
pub fn longest_prefix(&self, pref: &'x str) -> &'x str {
traverse::longest_prefix(self.root.as_ref(), pref)
}
}
impl<Value> IntoIterator for TSTMap<Value> {
type Item = (String, Value);
type IntoIter = IntoIter<Value>;
fn into_iter(self) -> IntoIter<Value> {
IntoIter::new(self)
}
}
impl<'x, Value> FromIterator<(&'x str, Value)> for TSTMap<Value> {
fn from_iter<I: IntoIterator<Item = (&'x str, Value)>>(iter: I) -> TSTMap<Value> {
let mut m = TSTMap::new();
for item in iter {
m.insert(item.0, item.1);
}
m
}
}
impl<'x, Value> Extend<(&'x str, Value)> for TSTMap<Value> {
#[inline]
fn extend<I: IntoIterator<Item=(&'x str, Value)>>(&mut self, iter: I) {
for (k, v) in iter {
self.insert(k, v);
}
}
}
impl<'x, Value> ops::Index<&'x str> for TSTMap<Value> {
type Output = Value;
#[inline]
fn index(&self, idx: &str) -> &Value {
self.get(idx).expect("no entry found for key")
}
}
impl<'x, Value> ops::IndexMut<&'x str> for TSTMap<Value> {
#[inline]
fn index_mut(&mut self, idx: &str) -> &mut Value {
self.get_mut(idx).expect("no entry found for key")
}
}
impl<Value> Drop for TSTMap<Value> {
fn drop(&mut self) {
let root = self.root.take();
let mut iter = DropTraverse::new(root);
while let Some(_) = iter.next() { }
}
}
impl<Value: Debug> Debug for TSTMap<Value> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_map().entries(self.iter()).finish()
}
}
impl<Value> Default for TSTMap<Value> {
fn default() -> Self {
TSTMap {
root: Default::default(),
size: 0,
}
}
}
#[derive(Clone, Default)]
pub struct Iter<'x, Value: 'x> {
iter: Traverse<'x, Value>,
}
impl<'x, Value> Iter<'x, Value> {
fn new(node: NodeRef<'x, Value>, min: usize, max: usize) -> Self {
Iter {
iter: Traverse::new(node, min, max),
}
}
fn with_prefix(node: Option<&'x Node<Value>>, prefix: &str, max: usize) -> Self {
Iter {
iter: Traverse::with_prefix(node, prefix, max),
}
}
}
impl<'x, Value> Iterator for Iter<'x, Value> {
type Item = (String, &'x Value);
fn next(&mut self) -> Option<(String, &'x Value)> {
self.iter.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
#[derive(Clone, Default)]
pub struct IterMut<'x, Value: 'x> {
iter: Traverse<'x, Value>,
}
impl<'x, Value> IterMut<'x, Value> {
fn new(node: NodeRefMut<'x, Value>, min: usize, max: usize) -> Self {
IterMut {
iter: Traverse::new(node.into_immut(), min, max),
}
}
fn with_prefix(ptr: Option<&'x Node<Value>>, prefix: &str, max: usize) -> Self {
IterMut {
iter: Traverse::with_prefix(ptr, prefix, max),
}
}
}
impl<'x, Value> Iterator for IterMut<'x, Value> {
type Item = (String, &'x mut Value);
fn next(&mut self) -> Option<(String, &'x mut Value)> {
unsafe { mem::transmute(self.iter.next()) }
}
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
#[derive(Clone)]
pub struct KeysIter<'x, Value: 'x> {
iter: Map<Iter<'x, Value>, fn((String, &'x Value)) -> String>,
}
impl<'x, Value:'x> Iterator for KeysIter<'x, Value> {
type Item = String;
fn next(&mut self) -> Option<String> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
#[derive(Clone)]
pub struct ValuesIter<'x, Value:'x> {
iter: ValuesTraverse<'x, Value>,
}
impl<'x, Value:'x> Iterator for ValuesIter<'x, Value> {
type Item = &'x Value;
fn next(&mut self) -> Option<&'x Value> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
#[derive(Clone)]
pub struct WildCardIter<'x, Value: 'x> {
iter: WildCardTraverse<'x, Value>,
}
impl<'x, Value> WildCardIter<'x, Value> {
fn new(node: NodeRef<'x, Value>, pat: &str, max: usize) -> Self {
WildCardIter {
iter: WildCardTraverse::new(node, pat, max),
}
}
}
impl<'x, Value> Iterator for WildCardIter<'x, Value> {
type Item = (String, &'x Value);
fn next(&mut self) -> Option<(String, &'x Value)> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
#[derive(Clone)]
pub struct WildCardIterMut<'x, Value: 'x> {
iter: WildCardTraverse<'x, Value>,
}
impl<'x, Value> WildCardIterMut<'x, Value> {
fn new(node: NodeRefMut<'x, Value>, pat: &str, max: usize) -> Self {
WildCardIterMut {
iter: WildCardTraverse::new(node.into_immut(), pat, max),
}
}
}
impl<'x, Value> Iterator for WildCardIterMut<'x, Value> {
type Item = (String, &'x mut Value);
fn next(&mut self) -> Option<(String, &'x mut Value)> { unsafe { mem::transmute(self.iter.next()) } }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
pub struct IntoIter<Value> {
iter: IntoTraverse<Value>,
}
impl<Value> IntoIter<Value> {
fn new(mut tst: TSTMap<Value>) -> Self {
let size = tst.len();
let root = tst.root.take();
IntoIter {
iter: IntoTraverse::new(root, size),
}
}
}
impl<Value> Iterator for IntoIter<Value> {
type Item = (String, Value);
fn next(&mut self) -> Option<(String, Value)> {
self.iter.next()
}
fn size_hint(&self) -> (usize, Option<usize>) { (self.iter.size, Some(self.iter.size)) }
}
impl<Value> ExactSizeIterator for IntoIter<Value> {
fn len(&self) -> usize { self.iter.size }
}
pub struct OccupiedEntry<'x, Value: 'x> {
node: &'x mut Node<Value>,
cont_size: &'x mut usize,
}
pub struct VacantEntry<'x, Value: 'x> {
node: &'x mut Node<Value>,
cont_size: &'x mut usize,
}
pub enum Entry<'x, Value: 'x> {
Occupied(OccupiedEntry<'x, Value>),
Vacant(VacantEntry<'x, Value>),
}
impl<'x, Value> Entry<'x, Value> {
fn new(node: &'x mut Node<Value>, size: &'x mut usize) -> Self {
match node.value {
None => Vacant(VacantEntry::new(node, size)),
Some(_) => Occupied(OccupiedEntry::new(node, size)),
}
}
pub fn get(self) -> Result<&'x mut Value, VacantEntry<'x, Value>> {
match self {
Occupied(entry) => Ok(entry.into_mut()),
Vacant(entry) => Err(entry),
}
}
pub fn or_insert(self, default: Value) -> &'x mut Value {
match self {
Occupied(entry) => entry.into_mut(),
Vacant(entry) => entry.insert(default),
}
}
pub fn or_insert_with<F: FnOnce() -> Value>(self, default: F) -> &'x mut Value {
match self {
Occupied(entry) => entry.into_mut(),
Vacant(entry) => entry.insert(default()),
}
}
}
impl<'x, Value> OccupiedEntry<'x, Value> {
fn new(node: &'x mut Node<Value>, size: &'x mut usize) -> Self {
OccupiedEntry {
node,
cont_size: size,
}
}
pub fn get(&self) -> &Value {
self.node.value.as_ref().unwrap()
}
pub fn get_mut(&mut self) -> &mut Value {
self.node.value.as_mut().unwrap()
}
pub fn into_mut(self) -> &'x mut Value {
self.node.value.as_mut().unwrap()
}
pub fn insert(&mut self, value: Value) -> Value {
self.node.replace(Some(value)).unwrap()
}
pub fn remove(self) -> Value {
*self.cont_size -= 1;
self.node.replace(None).unwrap()
}
}
impl<'x, Value> VacantEntry<'x, Value> {
fn new(node: &'x mut Node<Value>, size: &'x mut usize) -> Self {
VacantEntry {
node,
cont_size: size,
}
}
pub fn insert(self, value: Value) -> &'x mut Value {
self.node.value = Some(value);
*self.cont_size += 1;
self.node.value.as_mut().unwrap()
}
}
#[cfg(test)]
mod test {
#[test]
fn remove_drops_tails() {
let mut m = tstmap! {
"BY" => 1,
"BYGONE" => 3,
"BYE" => 2,
};
m.remove("BY");
m.remove("BYE");
m.remove("BYGONE");
assert_eq!(None, m.root.ptr);
}
}