use std::any::{Any, type_name};
use std::fmt::Debug;
use downcast_rs::{Downcast, impl_downcast};
use fast_stm::TransactionClosureResult;
use crate::attributes::AttributeError;
use crate::cmap::{DartIdType, OrbitPolicy};
use crate::stm::{StmClosureResult, Transaction};
pub trait AttributeUpdate: Sized + Send + Sync + Clone + Copy {
fn merge(attr1: Self, attr2: Self) -> Result<Self, AttributeError>;
fn split(attr: Self) -> Result<(Self, Self), AttributeError>;
#[allow(clippy::missing_errors_doc)]
fn merge_incomplete(_: Self) -> Result<Self, AttributeError> {
Err(AttributeError::InsufficientData(
"merge",
type_name::<Self>(),
))
}
fn merge_from_none() -> Result<Self, AttributeError> {
Err(AttributeError::InsufficientData(
"merge",
type_name::<Self>(),
))
}
fn split_from_none() -> Result<(Self, Self), AttributeError> {
Err(AttributeError::InsufficientData(
"split",
type_name::<Self>(),
))
}
}
pub trait AttributeBind: Debug + Sized + Any {
type StorageType: AttributeStorage<Self>;
type IdentifierType: From<DartIdType> + num_traits::ToPrimitive + Clone;
const BIND_POLICY: OrbitPolicy;
}
pub trait UnknownAttributeStorage: Any + Debug + Downcast {
#[must_use = "unused return value"]
fn new(length: usize) -> Self
where
Self: Sized;
fn extend(&mut self, length: usize);
fn clear_slot(&self, t: &mut Transaction, id: DartIdType) -> StmClosureResult<()>;
#[must_use = "unused return value"]
fn n_attributes(&self) -> usize;
fn merge(
&self,
t: &mut Transaction,
out: DartIdType,
lhs_inp: DartIdType,
rhs_inp: DartIdType,
) -> TransactionClosureResult<(), AttributeError>;
fn split(
&self,
t: &mut Transaction,
lhs_out: DartIdType,
rhs_out: DartIdType,
inp: DartIdType,
) -> TransactionClosureResult<(), AttributeError>;
}
impl_downcast!(UnknownAttributeStorage);
pub trait AttributeStorage<A: AttributeBind>: UnknownAttributeStorage {
#[allow(clippy::missing_errors_doc)]
fn read(&self, t: &mut Transaction, id: A::IdentifierType) -> StmClosureResult<Option<A>>;
#[allow(clippy::missing_errors_doc)]
fn write(
&self,
t: &mut Transaction,
id: A::IdentifierType,
val: A,
) -> StmClosureResult<Option<A>>;
#[allow(clippy::missing_errors_doc)]
fn remove(&self, t: &mut Transaction, id: A::IdentifierType) -> StmClosureResult<Option<A>>;
}