mod node;
#[cfg(feature = "map")]
pub mod rbmap;
#[cfg(feature = "set")]
pub mod rbtree;
#[macro_use]
#[cfg(feature = "queue")]
pub mod rbqueue;
mod helpers;
#[cfg(feature = "map")]
mod mapper;
#[cfg(test)]
mod rbtree_tests;
#[cfg(test)]
mod stress_test;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "map")]
use mapper::Mapper;
use node::Node;
#[cfg(feature = "map")]
#[allow(clippy::upper_case_acronyms)]
#[derive(Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RBMap<K: PartialOrd, V> {
map: RBTree<Mapper<K, V>>,
}
#[cfg(feature = "set")]
#[allow(clippy::upper_case_acronyms)]
#[derive(Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RBTree<T: PartialOrd> {
root: Node<T>,
contained: usize,
}
#[cfg(feature = "queue")]
#[allow(clippy::upper_case_acronyms)]
#[derive(Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
root: Node<T>,
contained: usize,
cmp: P,
}
#[cfg(feature = "set")]
#[macro_export]
macro_rules! new_set {
( $($v:expr),* ) => {{
let mut t = RBTree::new();
$(
t.insert($v);
)*
t
}};
}
#[cfg(feature = "queue")]
#[macro_export]
macro_rules! new_queue {
($comp:expr; $($v:expr),*) => {{
let mut q = RBQueue::new($comp);
$(q.insert($v);)*
q
}};
}
#[cfg(feature = "queue")]
#[macro_export]
macro_rules! new_c_queue {
($cmp:expr) => {
RBQueue::new(move |l, r| {
let comp = Box::new($cmp);
match comp(l, r) as i8 {
-128i8 ..= -1 => std::cmp::Ordering::Less,
0 => std::cmp::Ordering::Equal,
1 ..= 127i8 => std::cmp::Ordering::Greater
}
})
};
($cmp:expr; $($v:expr),*) => {{
let mut q = RBQueue::new(move |l, r| {
let comp = Box::new($cmp);
match comp(l, r) as i8 {
-128i8 ..= -1 => std::cmp::Ordering::Less,
0 => std::cmp::Ordering::Equal,
1 ..= 127i8 => std::cmp::Ordering::Greater
}
});
$(
q.insert($v);
)*
q
}};
}
#[cfg(feature = "map")]
#[macro_export]
macro_rules! new_map {
( $(($k:expr, $v:expr)),* ) => {{
let mut m = RBMap::new();
$(
m.insert($k, $v);
)*
m
}};
}