use std::fmt::Debug;
use std::marker::PhantomData;
use std::slice::Iter;
use serde::{Serialize, Deserialize};
use crate::node::RFRNode;
use crate::key::{TrieKey, KeyPrefix, ValueMerge};
use crate::matcher::PushdownStateMachine;
#[derive(Clone, Serialize, Deserialize)]
pub struct Trie<K, V> where
K: KeyPrefix + Clone, V: Clone
{
size: usize,
node: RFRNode<K, V>,
_phantom_k: PhantomData<K>,
_phantom_v: PhantomData<V>,
}
impl<K: KeyPrefix + Clone, V: Clone> Trie<K, V>
{
pub fn new() -> Self {
Self {
size: 0,
node: RFRNode::new(),
_phantom_k: Default::default(),
_phantom_v: Default::default()
}
}
#[inline]
pub fn insert(&mut self, key: K, value: V) -> Option<V> {
let result = self.node.insert(TrieKey::new(key), Some(value));
if result.is_none() {
self.size += 1;
}
result
}
#[inline]
pub fn get<M: PushdownStateMachine + Clone>(&self, key: &K) -> Option<V> {
self.node.get::<M>(key)
}
#[inline]
pub fn get_merge<M: PushdownStateMachine + Clone>(&self, key: &K) -> Option<V>
where V: ValueMerge + Debug
{
self.node.get_merge::<M>(key)
}
#[inline]
pub fn iter(&self) -> Iter<'_, Box<RFRNode<K, V>>> {
self.node.children.iter()
}
#[inline]
pub fn foreach<F>(&self, f: F) -> ()
where F: Fn((usize, &K, &Option<V>))
{
for item in self.iter() {
f( (1 as usize, &item.node_key.key, &item.value) );
item.foreach(2, &f);
}
}
}