use bitstring::BitString;
use std::boxed::Box;
use std::option::Option;
use std::fmt;
pub use self::iter::*;
pub use self::iter_full::*;
mod iter;
mod iter_full;
#[derive(Clone)]
pub struct RadixSet<S: BitString> {
node: Option<Node<S>>,
}
impl<S: BitString+fmt::Debug> fmt::Debug for RadixSet<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.node {
None => {
write!(f, "RadixSet {{ }}")
},
Some(ref node) => {
write!(f, "RadixSet {{ {:?} }}", node)
},
}
}
}
impl<S: BitString> Default for RadixSet<S> {
fn default() -> RadixSet<S> {
return RadixSet::<S>{
node: None,
}
}
}
#[derive(Clone)]
pub enum Node<S: BitString> {
InnerNode(InnerNode<S>),
Leaf(Leaf<S>),
}
#[derive(Clone,Debug)]
pub struct Leaf<S: BitString> {
key: S,
}
#[derive(Clone,Debug)]
pub struct InnerNode<S: BitString> {
key: S,
children: Box<Children<S>>,
}
#[derive(Clone,Debug)]
struct Children<S: BitString> {
left: Node<S>,
right: Node<S>,
}
impl<S: BitString> Leaf<S> {
pub fn key(&self) -> &S {
&self.key
}
}
impl<S: BitString> InnerNode<S> {
fn pick_side<'a>(&'a mut self, subkey: &S) -> &'a mut Node<S> {
if subkey.get(self.key.len()) {
&mut self.children.right
} else {
&mut self.children.left
}
}
pub fn key(&self) -> &S {
&self.key
}
pub fn left(&self) -> &Node<S> {
&self.children.left
}
pub fn right(&self) -> &Node<S> {
&self.children.right
}
}
impl<S: BitString+fmt::Debug> fmt::Debug for Node<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Node::Leaf(ref leaf) => write!(f, "Leaf {{ key: {:?} }}", leaf.key),
Node::InnerNode(ref inner) => write!(f, "InnerNode {{ key: {:?}, left: {:?}, right: {:?} }}", inner.key, inner.children.left, inner.children.right),
}
}
}
impl<S: BitString+Clone> Node<S> {
fn new_leaf(key: S) -> Node<S> {
Node::Leaf(Leaf{
key: key,
})
}
fn new_children_unknown_order(shared_prefix_len: usize, a: Node<S>, b: Node<S>) -> Box<Children<S>> {
let a_right = a.key().get(shared_prefix_len);
assert_eq!(!a_right, b.key().get(shared_prefix_len));
if a_right {
Box::new(Children{
left: b,
right: a,
})
} else {
Box::new(Children{
left: a,
right: b,
})
}
}
fn new_inner_unknown_order(shared_prefix_len: usize, a: Node<S>, b: Node<S>) -> Node<S> {
let mut key = a.key().clone();
key.clip(shared_prefix_len);
Node::InnerNode(InnerNode{
key: key,
children: Self::new_children_unknown_order(shared_prefix_len, a, b),
})
}
pub fn key(&self) -> &S {
match *self {
Node::Leaf(ref leaf) => &leaf.key,
Node::InnerNode(ref inner) => &inner.key,
}
}
fn replace<F: FnOnce(Self) -> Self>(&mut self, with: F) {
super::replace_at_and_fallback(self, with, || {
Self::new_leaf(S::null())
})
}
fn convert_leaf(&mut self, key_len: usize) {
self.replace(|this| match this {
Node::Leaf(mut leaf) => {
leaf.key.clip(key_len);
Node::Leaf(leaf)
},
Node::InnerNode(inner) => {
let mut key = inner.key;
key.clip(key_len);
Self::new_leaf(key)
},
})
}
fn insert(&mut self, key: S) {
let (mut self_key_len, shared_prefix_len) = {
let key_ref = self.key();
(key_ref.len(), key_ref.shared_prefix_len(&key))
};
if shared_prefix_len == key.len() {
self.convert_leaf(shared_prefix_len);
return; } else if shared_prefix_len < self_key_len {
debug_assert!(shared_prefix_len < key.len());
self.replace(|this| {
Self::new_inner_unknown_order(
shared_prefix_len,
this,
Self::new_leaf(key)
)
});
self_key_len = shared_prefix_len;
} else if shared_prefix_len == self_key_len {
debug_assert!(shared_prefix_len == self_key_len);
debug_assert!(shared_prefix_len < key.len());
match *self {
Node::Leaf(_) => {
return
},
Node::InnerNode(ref mut inner) => {
inner.pick_side(&key).insert(key)
},
}
}
let compress = match *self {
Node::InnerNode(ref inner) => {
let compress_left = match inner.children.left {
Node::Leaf(ref left_leaf) => left_leaf.key.len() == self_key_len + 1,
Node::InnerNode(_) => return, };
let compress_right = match inner.children.right {
Node::Leaf(ref right_leaf) => right_leaf.key.len() == self_key_len + 1,
Node::InnerNode(_) => return, };
compress_left && compress_right
},
Node::Leaf(_) => return, };
if compress {
self.convert_leaf(self_key_len);
}
}
}
impl<S: BitString+Clone> RadixSet<S> {
pub fn new() -> Self {
Default::default()
}
pub fn insert(&mut self, key: S) {
match self.node {
None => {
self.node = Some(Node::new_leaf(key));
},
Some(ref mut node) => {
node.insert(key);
},
}
}
pub fn root(&self) -> Option<&Node<S>> {
match self.node {
None => None,
Some(ref node) => Some(&node),
}
}
pub fn iter(&self) -> Iter<S> {
Iter::new(self)
}
pub fn iter_full(&self) -> IterFull<S> {
IterFull::new(self)
}
}