#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Deserialize, serde_derive::Serialize),
serde(default, rename_all = "snake_case")
)]
pub struct MemoryPosition<T = usize> {
pub(crate) feature_id: T,
pub(crate) pattern_id: T,
}
impl<T> MemoryPosition<T> {
pub fn new(feature_id: T, pattern_id: T) -> Self {
Self {
feature_id,
pattern_id,
}
}
pub fn default() -> Self
where
T: Default,
{
MemoryPosition {
feature_id: Default::default(),
pattern_id: Default::default(),
}
}
pub fn one() -> Self
where
T: num_traits::One,
{
MemoryPosition {
feature_id: T::one(),
pattern_id: T::one(),
}
}
pub fn zero() -> Self
where
T: num_traits::Zero,
{
MemoryPosition {
feature_id: T::zero(),
pattern_id: T::zero(),
}
}
pub fn from_feature_id(feature_id: T) -> Self
where
T: Default,
{
MemoryPosition {
feature_id,
pattern_id: T::default(),
}
}
pub fn from_pattern_id(pattern_id: T) -> Self
where
T: Default,
{
MemoryPosition {
feature_id: T::default(),
pattern_id,
}
}
pub const fn feature_id(&self) -> &T {
&self.feature_id
}
pub const fn feature_id_mut(&mut self) -> &mut T {
&mut self.feature_id
}
pub const fn pattern_id(&self) -> &T {
&self.pattern_id
}
pub const fn pattern_id_mut(&mut self) -> &mut T {
&mut self.pattern_id
}
pub const fn replace_feature_id(&mut self, id: T) -> T {
core::mem::replace(self.feature_id_mut(), id)
}
pub const fn replace_pattern_id(&mut self, id: T) -> T {
core::mem::replace(self.pattern_id_mut(), id)
}
pub fn next_feature_id(&mut self) -> T
where
T: num_traits::One,
for<'a> &'a T: core::ops::Add<T, Output = T>,
{
self.replace_feature_id(self.feature_id() + T::one())
}
pub fn next_pattern_id(&mut self) -> T
where
T: num_traits::One,
for<'a> &'a T: core::ops::Add<T, Output = T>,
{
self.replace_pattern_id(self.pattern_id() + T::one())
}
}
impl<T> core::fmt::Display for MemoryPosition<T>
where
T: core::fmt::Display,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
"{{ feature_id: {}, pattern_id: {} }}",
self.feature_id, self.pattern_id
)
}
}