#[cfg(feature = "multimap")]
use {
crate::core::multipair::MultiPair,
crate::core::pair::Pair,
};
#[derive(Copy, Clone, Debug, Default, Ord, PartialOrd, Eq, PartialEq)]
pub struct Id(u64);
impl Id {
pub fn inner(&self) -> u64 {
self.0
}
pub fn is_next_for(&self, other: Id) -> bool {
self.0 == other.0 + 1
}
}
impl From<u64> for Id {
fn from(value: u64) -> Self {
Self(value)
}
}
impl From<Id> for u64 {
fn from(id: Id) -> Self {
id.0
}
}
#[derive(Debug, Clone)]
pub enum ChangeEvent<T> {
InsertAt {
event_id: Id,
max_value: T,
value: T,
index: usize,
},
RemoveAt {
event_id: Id,
max_value: T,
value: T,
index: usize,
},
CreateNode {
event_id: Id,
max_value: T,
},
RemoveNode {
event_id: Id,
max_value: T,
},
SplitNode {
event_id: Id,
max_value: T,
split_index: usize,
},
}
impl<T> ChangeEvent<T> {
pub fn id(&self) -> Id {
match self {
ChangeEvent::InsertAt { event_id, .. } => *event_id,
ChangeEvent::RemoveAt { event_id, .. } => *event_id,
ChangeEvent::CreateNode { event_id, .. } => *event_id,
ChangeEvent::RemoveNode { event_id, .. } => *event_id,
ChangeEvent::SplitNode { event_id, .. } => *event_id,
}
}
}
#[derive(Debug, Clone)]
pub enum ChangeEventUnassigned<T> {
InsertAt {
max_value: T,
value: T,
index: usize,
},
RemoveAt {
max_value: T,
value: T,
index: usize,
},
CreateNode {
max_value: T,
},
RemoveNode {
max_value: T,
},
SplitNode {
max_value: T,
split_index: usize,
},
}
impl<T> ChangeEventUnassigned<T> {
pub fn assign_id(self, event_id: Id) -> ChangeEvent<T> {
match self {
Self::InsertAt { max_value, value, index } => ChangeEvent::InsertAt {
event_id,
max_value,
value,
index,
},
Self::RemoveAt { max_value, value, index } => ChangeEvent::RemoveAt {
event_id,
max_value,
value,
index,
},
Self::CreateNode { max_value } => ChangeEvent::CreateNode { event_id, max_value },
Self::RemoveNode { max_value } => ChangeEvent::RemoveNode { event_id, max_value },
Self::SplitNode { max_value, split_index } => {
ChangeEvent::SplitNode { event_id, max_value, split_index }
}
}
}
}
#[cfg(feature = "multimap")]
impl<K: Ord, V: PartialEq> From<ChangeEvent<MultiPair<K, V>>> for ChangeEvent<Pair<K, V>> {
fn from(ev: ChangeEvent<MultiPair<K, V>>) -> Self {
match ev {
ChangeEvent::InsertAt {
event_id,
max_value,
value,
index,
} => ChangeEvent::InsertAt {
event_id,
max_value: max_value.into(),
value: value.into(),
index,
},
ChangeEvent::RemoveAt {
event_id,
max_value,
value,
index,
} => ChangeEvent::RemoveAt {
event_id,
max_value: max_value.into(),
value: value.into(),
index,
},
ChangeEvent::CreateNode { event_id, max_value } => ChangeEvent::CreateNode {
event_id,
max_value: max_value.into(),
},
ChangeEvent::RemoveNode { event_id, max_value } => ChangeEvent::RemoveNode {
event_id,
max_value: max_value.into(),
},
ChangeEvent::SplitNode {
event_id,
max_value,
split_index,
} => ChangeEvent::SplitNode {
event_id,
max_value: max_value.into(),
split_index,
},
}
}
}