use crate::{
Index, ShallowClone,
core::{Insert, Remove, Seal, Update},
};
#[derive(Clone)]
pub struct Boolean {
true_count: usize,
false_count: usize,
}
impl ShallowClone for Boolean {}
impl Default for Boolean {
fn default() -> Self {
Self::new()
}
}
impl Boolean {
pub fn new() -> Self {
Boolean {
true_count: 0,
false_count: 0,
}
}
#[inline]
pub fn all(&self) -> bool {
self.false_count == 0
}
#[inline]
pub fn any(&self) -> bool {
self.true_count > 0
}
#[inline]
pub fn true_count(&self) -> usize {
self.true_count
}
#[inline]
pub fn false_count(&self) -> usize {
self.false_count
}
#[inline]
pub fn total_count(&self) -> usize {
self.true_count + self.false_count
}
}
impl Index<bool> for Boolean {
#[inline]
fn insert(&mut self, _seal: Seal, op: &Insert<bool>) {
if *op.new {
self.true_count += 1;
} else {
self.false_count += 1;
}
}
#[inline]
fn remove(&mut self, _seal: Seal, op: &Remove<bool>) {
if *op.existing {
self.true_count -= 1;
} else {
self.false_count -= 1;
}
}
#[inline]
fn update(&mut self, _seal: Seal, op: &Update<bool>) {
match (op.existing, op.new) {
(false, true) => {
self.false_count -= 1;
self.true_count += 1;
}
(true, false) => {
self.true_count -= 1;
self.false_count += 1;
}
_ => {} }
}
}