use size_of::SizeOf;
use std::{
fmt::Debug,
hash::{Hash, Hasher},
ops::DerefMut,
};
use crate::{
DBData, NumEntries, declare_trait_object, declare_typed_trait_object,
dynamic::{
ArchiveTrait, AsAny, Clonable, ClonableTrait, Comparable, DeserializableDyn, DowncastTrait,
rkyv::SerializeDyn,
},
hash::default_hash,
};
pub trait Data:
Comparable + Clonable + SerializeDyn + DeserializableDyn + Send + Sync + Debug + AsAny + SizeOf
{
fn default_hash(&self) -> u64;
fn dyn_hash(&self, hasher: &mut dyn Hasher);
fn as_data(&self) -> &dyn Data;
fn as_data_mut(&mut self) -> &mut dyn Data;
}
pub trait DataTrait: Data + Hash + DowncastTrait + ClonableTrait + ArchiveTrait + Eq + Ord {}
impl<Trait: ?Sized> DataTrait for Trait where
Trait: Data + Hash + DowncastTrait + ClonableTrait + ArchiveTrait + Eq + Ord
{
}
declare_trait_object!(DynData<> = dyn Data<>
where
);
impl NumEntries for DynData {
const CONST_NUM_ENTRIES: Option<usize> = Some(1);
#[inline]
fn num_entries_shallow(&self) -> usize {
1
}
#[inline]
fn num_entries_deep(&self) -> usize {
1
}
}
impl<T: DBData> Data for T {
fn default_hash(&self) -> u64 {
default_hash(self)
}
fn dyn_hash(&self, mut hasher: &mut dyn Hasher) {
self.hash(&mut hasher)
}
fn as_data(&self) -> &DynData {
self
}
fn as_data_mut(&mut self) -> &mut DynData {
self
}
}
#[cfg(all(test, target_endian = "little"))]
#[test]
fn test_default_hash() {
assert_eq!(1.default_hash(), 15781232456890734344);
}
pub trait DataTyped: Data {
type Type: DBData;
}
pub trait DataTraitTyped: DataTyped + DataTrait + DerefMut<Target = Self::Type> {}
impl<Trait: ?Sized> DataTraitTyped for Trait where
Trait: DataTyped + DataTrait + DerefMut<Target = Self::Type>
{
}
impl<T: DBData> DataTyped for T {
type Type = T;
}
declare_typed_trait_object!(DynDataTyped<T> = dyn DataTyped<Type = T>
[T]
where
T: DBData,
);
impl<T: DBData> NumEntries for DynDataTyped<T> {
const CONST_NUM_ENTRIES: Option<usize> = Some(1);
#[inline]
fn num_entries_shallow(&self) -> usize {
1
}
#[inline]
fn num_entries_deep(&self) -> usize {
1
}
}
pub type DynUnit = DynDataTyped<()>;
pub type DynBool = DynDataTyped<bool>;