pub mod methods;
pub mod shared;
pub mod stc;
#[cfg(feature = "fast-hash")]
pub mod fast_hash;
pub const KEY_ARRAY: usize = 31;
pub const POINTER_ARRAY: usize = KEY_ARRAY + 1;
use std::fmt::Debug;
use methods::iter::{IndexTreeIterator, IndexTreeKeys, IndexTreeSetIterator, IndexTreeValues};
pub use methods::bulk::SortedBuildError;
pub use shared::{SharedIndexTreeMap, UnionConflict};
use stc::{
Node,
Output::{KeyExists, NewKeyPointer},
};
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IndexTreeSet<K> {
pub map: IndexTreeMap<K, ()>,
}
impl<K> IndexTreeSet<K> {
pub fn new() -> IndexTreeSet<K> {
IndexTreeSet {
map: IndexTreeMap::new(),
}
}
}
impl<K> IndexTreeSet<K> {
pub fn clear(&mut self) {
self.map.clear()
}
}
impl<K> IndexTreeSet<K> {
pub fn len(&self) -> usize {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn contains_key(&self, key: &K) -> bool {
self.map.contains_key(key)
}
}
impl<K> IndexTreeSet<K> {
pub fn contains_index(&self, index: usize) -> bool {
self.map.contains_index(index)
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn get(&self, key: &K) -> Option<&K> {
self.map.get_key_value(key).map(|(k, _)| k)
}
pub fn get_from_index(&self, index: usize) -> Option<&K> {
self.map.get_key_from_index(index)
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn get_index_from_key(&self, key: &K) -> Option<usize> {
self.map.get_index_from_key(key)
}
pub fn get_key_from_index(&self, id: usize) -> Option<&K> {
self.map.get_key_from_index(id)
}
pub fn get_first(&self) -> Option<&K> {
self.map.get_first_key()
}
pub fn get_last(&self) -> Option<&K> {
self.map.get_last_key()
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn insert(&mut self, key: K) {
self.map.insert(key, ())
}
}
impl<K> IndexTreeSet<K> {
pub fn iter(&self) -> IndexTreeSetIterator<'_, K> {
IndexTreeSetIterator::new(self)
}
pub fn iter_ref(&self) -> IndexTreeSetIterator<'_, K> {
self.iter()
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn remove(&mut self, key: &K) -> Option<K> {
self.map.remove(key).map(|(k, _)| k)
}
}
impl<K: Ord + Clone> IndexTreeSet<K> {
pub fn remove_from_index(&mut self, index: usize) -> Option<K> {
self.map.remove_from_index(index).map(|(k, _)| k)
}
}
impl<K: Ord> IndexTreeSet<K> {
pub fn split_off(&mut self, key: &K) -> IndexTreeSet<K> {
IndexTreeSet {
map: self.map.split_off(key),
}
}
pub fn split_off_from_index(&mut self, index: usize) -> IndexTreeSet<K> {
IndexTreeSet {
map: self.map.split_off_from_index(index),
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct IndexTreeMap<K, V> {
pub root: Box<Node<K, V>>,
pub size: usize,
}
impl<K, V> IndexTreeMap<K, V> {
pub fn new() -> IndexTreeMap<K, V> {
IndexTreeMap::default()
}
}
impl<K, V> Default for IndexTreeMap<K, V> {
fn default() -> Self {
IndexTreeMap {
root: Node::new(),
size: 0,
}
}
}
impl<K, V> IndexTreeMap<K, V> {
pub fn clear(&mut self) {
self.root = Node::new();
self.size = 0
}
}
impl<K, V> IndexTreeMap<K, V> {
pub fn len(&self) -> usize {
self.size
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn contains_key(&self, key: &K) -> bool {
self.root.get(key).is_some()
}
}
impl<K, V> IndexTreeMap<K, V> {
pub fn contains_index(&self, index: usize) -> bool {
index < self.size
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn get(&self, key: &K) -> Option<&V> {
self.root.get(key).map(|item| item.1)
}
pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
self.root.get_mut(key).map(|item| item.1)
}
pub fn get_key_value(&self, key: &K) -> Option<(&K, &V)> {
self.root.get(key)
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn get_from_index(&self, index: usize) -> Option<&V> {
if index < self.size {
match self.root.get_from_index(index) {
None => None,
Some(item) => Some(item.1),
}
} else {
None
}
}
pub fn get_mut_from_index(&mut self, id: usize) -> Option<&mut V> {
self.root.get_mut_from_index(id).map(|item| item.1)
}
pub fn get_index_from_key(&self, key: &K) -> Option<usize> {
let usize = 0;
self.root.get_index_from_key(key, usize)
}
pub fn get_key_from_index(&self, id: usize) -> Option<&K> {
if self.contains_index(id) {
self.root.get_from_index(id).map(|item| item.0)
} else {
None
}
}
pub fn get_key_value_from_index(&self, id: usize) -> Option<(&K, &V)> {
if self.contains_index(id) {
self.root.get_from_index(id)
} else {
None
}
}
pub fn get_first_key(&self) -> Option<&K> {
self.root.get_from_index(0).map(|item| item.0)
}
pub fn get_first_value(&self) -> Option<&V> {
self.root.get_from_index(0).map(|item| item.1)
}
pub fn get_first_key_value(&self) -> Option<(&K, &V)> {
self.root.get_from_index(0)
}
pub fn get_last_key(&self) -> Option<&K> {
self.root.get_from_index(self.size - 1).map(|item| item.0)
}
pub fn get_last_value(&self) -> Option<&V> {
self.root.get_from_index(self.size - 1).map(|item| item.1)
}
pub fn get_last_key_value(&self) -> Option<(&K, &V)> {
self.root.get_from_index(self.size - 1)
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn insert(&mut self, key: K, value: V) {
match self.root.insert(key, value) {
KeyExists => {}
NewKeyPointer(new_key, new_pointer) => {
self.root.update_root(new_key, new_pointer);
self.size += 1
}
_ => self.size += 1,
}
}
}
impl<K, V> IndexTreeMap<K, V> {
pub fn iter(&self) -> IndexTreeIterator<'_, K, V> {
IndexTreeIterator::new(self)
}
pub fn iter_ref(&self) -> IndexTreeIterator<'_, K, V> {
self.iter()
}
}
impl<K, V> IndexTreeMap<K, V> {
pub fn keys(&self) -> IndexTreeKeys<'_, K, V> {
IndexTreeKeys::new(self)
}
pub fn keys_ref(&self) -> IndexTreeKeys<'_, K, V> {
self.keys()
}
pub fn values(&self) -> IndexTreeValues<'_, K, V> {
IndexTreeValues::new(self)
}
pub fn values_ref(&self) -> IndexTreeValues<'_, K, V> {
self.values()
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn remove(&mut self, key: &K) -> Option<(K, V)> {
match self.root.remove(key) {
None => None,
Some(item) => {
self.size -= 1;
Some((item.0, item.1))
}
}
}
}
impl<K: Ord + Clone, V> IndexTreeMap<K, V> {
pub fn remove_from_index(&mut self, index: usize) -> Option<(K, V)> {
let key = self.get_key_from_index(index)?.clone();
self.remove(&key)
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn replace(&mut self, key: &K, value: V) -> Option<V> {
self.root.replace(key, value)
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn replace_index(&mut self, index: usize, value: V) {
if let Some(slot) = self.get_mut_from_index(index) {
*slot = value;
}
}
}
impl<K: Ord, V> IndexTreeMap<K, V> {
pub fn split_off(&mut self, key: &K) -> IndexTreeMap<K, V> {
if self.is_empty() {
return IndexTreeMap::new();
}
if let Some(pointer) = self.root.split_off(key) {
let size = pointer.counter;
self.root.n = self.root.keys.iter().filter(|item| item.is_some()).count();
let mut new_tree = IndexTreeMap {
root: pointer.child,
size,
};
self.root.fill_pointers();
new_tree.root.fill_pointers();
if self.root.is_empty() {
self.root.fill_empty_root();
}
if new_tree.root.is_empty() {
self.root.fill_empty_root()
}
self.size -= new_tree.size;
new_tree
} else {
IndexTreeMap::new()
}
}
pub fn split_off_from_index(&mut self, index: usize) -> IndexTreeMap<K, V> {
if self.is_empty() {
return IndexTreeMap::new();
}
if let Some(pointer) = self.root.split_off_at_index(index) {
let size = pointer.counter;
self.root.n = self.root.keys.iter().filter(|item| item.is_some()).count();
let mut new_tree = IndexTreeMap {
root: pointer.child,
size,
};
self.root.fill_pointers();
new_tree.root.fill_pointers();
if self.root.is_empty() {
self.root.fill_empty_root();
}
if new_tree.root.is_empty() {
self.root.fill_empty_root()
}
self.size -= new_tree.size;
new_tree
} else {
IndexTreeMap::new()
}
}
}