#![feature(box_into_raw_non_null)]
#![allow(dead_code)]
#![feature(map_get_key_value)]
use std::collections::HashMap;
use std::ptr::NonNull;
type Node<T> = NonNull<TrieNode<T>>;
#[derive(Debug)]
pub struct TrieNode<T> {
key: usize,
pub value: Option<T>,
level: usize,
right: Option<NonNull<TrieNode<T>>>,
left: Option<NonNull<TrieNode<T>>>,
is_desc_left: bool,
is_desc_right: bool,
}
impl<T> TrieNode<T> {
pub fn new(key: usize, value: T, level: usize) -> Box<Self> {
Box::new(TrieNode{
key: key,
value: Some(value),
level: level,
right: None,
left: None,
is_desc_right: true,
is_desc_left: true,
})
}
fn new_internal(level: usize) -> Box<Self> {
Box::new(TrieNode{
key: 0,
value: None,
level,
right: None,
left: None,
is_desc_left: true,
is_desc_right: true,
})
}
fn get_rightmost_node(max_level: usize, mut cur_node: *mut TrieNode<T>) -> Option<Node<T>> {
unsafe {
while (*cur_node).level != max_level {
match (*cur_node).right {
Some(right_node) => {
cur_node = right_node.as_ptr();
}
None => {
(*cur_node).left.map(|left_node| {
cur_node = left_node.as_ptr();
});
}
}
}
NonNull::new(cur_node as *mut TrieNode<T>)
}
}
fn get_leftmost_node(max_level: usize, mut cur_node: *mut TrieNode<T>) -> Option<Node<T>> {
unsafe {
while (*cur_node).level != max_level {
match (*cur_node).left {
Some(left_node) => {
cur_node = left_node.as_ptr();
}
None => {
(*cur_node).right.map(|right_node| {
cur_node = right_node.as_ptr();
});
}
}
}
NonNull::new(cur_node as *mut TrieNode<T>)
}
}
}
#[derive(Debug)]
pub struct Xfast<T=String> {
nr_levels: usize,
level_maps: Vec<HashMap<usize, NonNull<TrieNode<T>>>>,
}
impl<T> Xfast<T> {
pub fn new(range: usize) -> Self {
let nr_levels = Self::get_levels_count(range);
let level_maps = Self::create_map_list(nr_levels+1);
let mut new_trie = Xfast {
nr_levels,
level_maps,
};
let root_node = TrieNode::new_internal(0);
let root_node = Box::into_raw_non_null(root_node);
new_trie.level_maps[0].insert(0, root_node);
new_trie
}
fn get_levels_count(mut range: usize) -> usize {
let mut levels = 0;
while range > 0 {
range >>= 1;
levels += 1;
}
levels
}
fn create_map_list(nr_levels: usize) -> Vec<HashMap<usize, Node<T>>> {
(0..nr_levels).map(|_| HashMap::new()).collect()
}
pub fn len(&self) -> usize {
self.level_maps[self.nr_levels].len()
}
fn find_lowest_common_ancestor(&self, key: usize) -> Option<*mut TrieNode<T>> {
let mut low = 0;
let mut high = self.nr_levels;
let mut ancestor_node: Option<*mut TrieNode<T>> = None;
while high >= low {
let mid = (low + high)/2;
let prefix = key >> (self.nr_levels - mid);
match self.level_maps[mid].get(&prefix) {
Some(&value) => {
low = mid + 1;
ancestor_node = Some(value.as_ptr());
}
None => {
if mid == 0 {
break;
}
high = mid - 1;
}
}
}
ancestor_node
}
pub fn find_successor(&self, key: usize) -> Option<&TrieNode<T>> {
let successor_node: Option<*mut TrieNode<T>> = self.find_lowest_common_ancestor(key);
if let Some(node) = successor_node {
unsafe {
if (*node).level == (self.nr_levels) {
return Some(&(*node));
}
let mut updated_node = None;
if (key >> (self.nr_levels - (*node).level -1 ) & 1) != 0 {
(*node).right.map(|right_node| {
updated_node = Some(right_node.as_ptr());
});
}
else {
(*node).left.map(|left_node| {
updated_node = Some(left_node.as_ptr());
});
}
if !updated_node.is_none() && (*updated_node.unwrap()).key < key {
let mut temp_node = None;
(*updated_node.unwrap()).right.map(|right_node| {
temp_node = Some(&(*right_node.as_ptr()));
});
return temp_node;
}
if !updated_node.is_none() {
return Some(&(*updated_node.unwrap()));
}
return None;
}
}
None
}
pub fn find_predecessor(&self, key: usize) -> Option<&TrieNode<T>> {
let predecessor_node: Option<*mut TrieNode<T>> = self.find_lowest_common_ancestor(key);
if let Some(node) = predecessor_node {
unsafe {
if (*node).level == (self.nr_levels) {
return Some(&(*node));
}
let mut updated_node = None;
if (key >> (self.nr_levels - (*node).level -1) & 1) != 0 {
(*node).right.map(|right_node| {
updated_node = Some(right_node.as_ptr());
});
}
else {
(*node).left.map(|left_node| {
updated_node = Some(left_node.as_ptr());
});
}
if !updated_node.is_none() && (*updated_node.unwrap()).key > key {
let mut temp_node = None;
(*updated_node.unwrap()).left.map(|left_node| {
temp_node = Some(&(*left_node.as_ptr()));
});
return temp_node;
}
if !updated_node.is_none() {
return Some(&(*updated_node.unwrap()));
}
return None;
}
}
None
}
fn populate_internal_nodes(&mut self, key: usize) {
let mut level = 1;
let max_levels = self.nr_levels;
while level < max_levels {
let prefix = key >> (max_levels - level);
if let None = self.level_maps[level].get(&prefix) {
let temp_node = TrieNode::new_internal(level);
let temp_node = Box::into_raw_non_null(temp_node);
self.level_maps[level].insert(prefix, temp_node);
if (prefix & 1) != 0 {
let temp_prefix = prefix >> 1;
self.level_maps[level-1].get(&temp_prefix).map(|&value| unsafe{
(*value.as_ptr()).right = Some(temp_node);
(*value.as_ptr()).is_desc_right = false;
});
}
else {
let temp_prefix = prefix >> 1;
self.level_maps[level-1].get(&temp_prefix).map(|&value| unsafe{
(*value.as_ptr()).left = Some(temp_node);
(*value.as_ptr()).is_desc_left = false;
});
}
}
level += 1;
}
}
fn update_descendant_ptr(&mut self, key: usize) {
let mut prefix = key;
let mut level = self.nr_levels - 1;
while level > 0 {
prefix = prefix >> 1;
self.level_maps[level].get(&prefix).map(|&value| unsafe {
match (*value.as_ptr()).left {
None => {
(*value.as_ptr()).right.map(|right_node| {
(*value.as_ptr()).left = TrieNode::get_leftmost_node(self.nr_levels, right_node.as_ptr());
(*value.as_ptr()).is_desc_left = true;
});
},
Some(left_ptr) => {
match (*value.as_ptr()).right {
None => {
(*value.as_ptr()).right = TrieNode::get_rightmost_node(self.nr_levels, left_ptr.as_ptr());
(*value.as_ptr()).is_desc_right = true;
}
Some(right_ptr)=> {
if (*value.as_ptr()).is_desc_right {
(*value.as_ptr()).right = TrieNode::get_rightmost_node(self.nr_levels, left_ptr.as_ptr());
}
else if (*value.as_ptr()).is_desc_left {
(*value.as_ptr()).left = TrieNode::get_leftmost_node(self.nr_levels, right_ptr.as_ptr());
}
}
}
}
}
});
level -= 1;
}
self.level_maps[0].get(&0).map(|&value| unsafe {
let is_left_descendant = (*value.as_ptr()).is_desc_left;
let is_right_descendant = (*value.as_ptr()).is_desc_right;
if is_left_descendant {
(*value.as_ptr()).right.map(|right_node| {
(*value.as_ptr()).left = TrieNode::get_leftmost_node(self.nr_levels, right_node.as_ptr());
});
}
if is_right_descendant {
(*value.as_ptr()).left.map(|left_node| {
(*value.as_ptr()).right = TrieNode::get_rightmost_node(self.nr_levels, left_node.as_ptr());
});
}
});
}
pub fn insert_key(&mut self, key: usize, value: T) {
let new_node = TrieNode::new(key, value, self.nr_levels);
let new_node = Some(Box::into_raw_non_null(new_node));
let predecessor = self.find_predecessor(key);
let successor = self.find_successor(key);
predecessor.map(|pred_node| unsafe{
let pred_node = &(*pred_node) as *const TrieNode<T> as *mut TrieNode<T>;
new_node.map(|node| {
(*node.as_ptr()).right = (*pred_node).right;
(*node.as_ptr()).left = NonNull::new(pred_node);
});
(*pred_node).right = new_node;
});
successor.map(|suc_node| unsafe{
let suc_node = &(*suc_node) as *const TrieNode<T> as *mut TrieNode<T>;
new_node.map(|node| {
(*node.as_ptr()).left = (*suc_node).left;
(*node.as_ptr()).right = NonNull::new(suc_node);
});
(*suc_node).left = new_node;
});
self.populate_internal_nodes(key);
self.level_maps[self.nr_levels].insert(key, new_node.unwrap());
let temp_key = key >> 1;
self.level_maps[self.nr_levels-1].get(&temp_key).map(|&value| unsafe {
if (key & 1) != 0 {
(*value.as_ptr()).right= new_node;
(*value.as_ptr()).is_desc_right = false;
}
else {
(*value.as_ptr()).left = new_node;
(*value.as_ptr()).is_desc_left = false;
}
});
self.update_descendant_ptr(key);
}
fn delete_internal_node(&mut self, key: usize) {
let mut level = self.nr_levels-1;
let mut prefix = key;
let mut child_prefix = key;
while level > 0 {
prefix = prefix >> 1;
if let Some(internal_node) = self.level_maps[level].get(&prefix) {
unsafe {
if (child_prefix &1) == 1 {
if !(*internal_node.as_ptr()).is_desc_left {
break;
}
}
else if !(*internal_node.as_ptr()).is_desc_right {
break;
}
}
}
let parent_prefix = prefix >> 1;
self.level_maps[level-1].get(&parent_prefix).map(|parent_node| unsafe{
if (prefix & 1) != 0 {
(*parent_node.as_ptr()).right = None;
(*parent_node.as_ptr()).is_desc_right = true;
}
else {
(*parent_node.as_ptr()).left = None;
(*parent_node.as_ptr()).is_desc_left = true;
}
});
self.level_maps[level].remove(&prefix);
child_prefix = child_prefix>>1;
level -= 1;
}
}
pub fn delete_key(&mut self, key: usize) -> Option<Node<T>>{
let deleted_node = self.find_key_as_non_null(key);
if deleted_node.is_none() {
return None;
}
let deleted_node = deleted_node.unwrap();
self.level_maps[self.nr_levels-1].get(&(key>>1)).map(|internal_node| unsafe{
if (key &1) == 1 {
(*internal_node.as_ptr()).right = None;
(*internal_node.as_ptr()).is_desc_right = true;
}
else {
(*internal_node.as_ptr()).left = None;
(*internal_node.as_ptr()).is_desc_left = true;
}
});
self.delete_internal_node(key);
unsafe {
let predecessor_node = (*deleted_node.as_ptr()).left;
let successor_node = (*deleted_node.as_ptr()).right;
if !predecessor_node.is_none() {
(*predecessor_node.unwrap().as_ptr()).right = successor_node;
}
if !successor_node.is_none() {
(*successor_node.unwrap().as_ptr()).left = predecessor_node;
}
}
let deleted_node = self.level_maps[self.nr_levels].remove(&key);
self.update_descendant_ptr(key);
deleted_node
}
fn find_key_as_non_null(&self, key: usize) -> Option<Node<T>> {
self.level_maps[self.nr_levels].get(&key).map(|&value| {
value
})
}
pub fn find_key(&self, key: usize) -> Option<&TrieNode<T>> {
self.level_maps[self.nr_levels].get(&key).map(|&value| unsafe {
&(*value.as_ptr())
})
}
pub fn iter(&self) -> XfastIter<T> {
let leaf_map = &self.level_maps[self.nr_levels];
let mut keys: Vec<usize> = vec!();
for &cur_key in leaf_map.keys() {
keys.push(cur_key);
}
XfastIter {
leaf_map,
keys,
index: 0,
}
}
pub fn iter_mut(&mut self) -> XfastIterMut<T> {
let leaf_map = &self.level_maps[self.nr_levels];
let mut keys: Vec<usize> = vec!();
for &cur_key in leaf_map.keys() {
keys.push(cur_key);
}
XfastIterMut {
leaf_map,
keys,
index: 0,
}
}
}
pub struct XfastIter<'a, T> {
leaf_map: &'a HashMap<usize, Node<T>>,
keys: Vec<usize>,
index: usize,
}
impl<'a, T> Iterator for XfastIter<'a, T> {
type Item = (&'a usize, &'a TrieNode<T>);
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.leaf_map.len() {
let key = self.keys[self.index];
self.index += 1;
let kv_pair = self.leaf_map.get_key_value(&key);
kv_pair.map(|(key, value)| unsafe{
let value = value.as_ref();
(key, value)
})
}
else {
None
}
}
}
pub struct XfastIterMut<'a, T> {
leaf_map: &'a HashMap<usize, Node<T>>,
keys: Vec<usize>,
index: usize,
}
impl<'a, T> Iterator for XfastIterMut<'a, T> {
type Item = (&'a usize, &'a mut TrieNode<T>);
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.leaf_map.len() {
let key = self.keys[self.index];
self.index += 1;
let kv_pair = self.leaf_map.get_key_value(&key);
kv_pair.map(|(key, value)| unsafe{
let value = &mut (*value.as_ptr());
(key, value)
})
}
else {
None
}
}
}
impl<'a, T> IntoIterator for &'a Xfast<T> {
type Item = (&'a usize, &'a TrieNode<T>);
type IntoIter = XfastIter<'a, T>;
fn into_iter(self) -> XfastIter<'a, T> {
self.iter()
}
}
mod test{
use super::Xfast;
fn init() -> Xfast<String> {
let mut test_trie: Xfast<String> = Xfast::new(31);
test_trie.insert_key(11, String::from("eleven"));
test_trie.insert_key(1, String::from("one"));
test_trie.insert_key(18, String::from("eighteen"));
test_trie.insert_key(5, String::from("five"));
test_trie
}
#[test]
fn successor() -> Result<(), String> {
let test_trie = init();
if let Some(successor) = test_trie.find_successor(7) {
if successor.key == 11 {
return Ok(())
}
}
Err(String::from("Successor of 7 is wrong"))
}
#[test]
fn none_successor() -> Result<(), String> {
let test_trie = init();
if test_trie.find_successor(19).is_none() {
Ok(())
}
else {
Err(String::from("Successor of 19 is wrong"))
}
}
#[test]
fn predecessor() -> Result<(), String> {
let test_trie = init();
if let Some(predecessor) = test_trie.find_predecessor(8) {
if predecessor.key == 5 {
return Ok(())
}
}
Err(String::from("Predecessor of 8 is wrong"))
}
#[test]
fn none_predecessor() -> Result<(), String> {
let test_trie = init();
if test_trie.find_predecessor(0).is_none() {
Ok(())
}
else {
Err(String::from("Predecessor of 1 is wrong"))
}
}
#[test]
fn find_key_present() -> Result<(), String> {
let test_trie = init();
if let Some(value) = test_trie.find_key(11) {
if value.key == 11 {
return Ok(());
}
}
Err(String::from("Key should have been present"))
}
#[test]
fn find_key_not_present() -> Result<(), String> {
let test_trie = init();
if test_trie.find_key(7).is_none() {
return Ok(());
}
Err(String::from("Key should not have been present"))
}
#[test]
fn delete_node() -> Result<(), String> {
let mut test_trie = init();
test_trie.delete_key(18);
if test_trie.find_key(18).is_none() {
Ok(())
}
else {
Err(String::from("Key should have been deleted"))
}
}
#[test]
fn successor_after_del() -> Result<(), String> {
let mut test_trie = init();
test_trie.delete_key(18);
if test_trie.find_successor(18).is_none() {
Ok(())
}
else {
Err(String::from("Successor of 18 is wrong"))
}
}
#[test]
fn predecessor_after_del() -> Result<(), String> {
let mut test_trie = init();
test_trie.delete_key(18);
if let Some(predecessor) = test_trie.find_predecessor(18) {
if predecessor.key == 11 {
return Ok(());
}
}
Err(String::from("Successor of 18 is wrong"))
}
#[test]
fn deleting_non_existent() -> Result<(), String> {
let mut test_trie = init();
if test_trie.delete_key(19).is_none() {
Ok(())
}
else {
Err(String::from("The deleted node didn't exist!!"))
}
}
}