use crate::bits::bitfield::Bitfield;
use crate::traits::query::Query;
use crate::traits::record::Record;
use crate::traits::valid_key::BorrowedKey;
use crate::traits::valid_key::ValidKey;
use crate::types::chunk_storage::ChunkStorage;
use crate::types::storage::Storage;
use std::borrow::Borrow;
use std::borrow::Cow;
pub const ID: Id<(), ()> = Id((), ());
#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct Id<C, I>(pub C, pub I);
impl<C, I> Id<C, I> {
pub fn new(chunk_key: C, item_key: I) -> Self {
Id(chunk_key, item_key)
}
#[must_use = "This method returns a new Id with the given chunk key."]
pub fn chunk<CC>(self, new_chunk_key: CC) -> Id<CC, I> {
Id::new(new_chunk_key, self.1)
}
#[must_use = "This method returns a new Id with the given item key."]
pub fn item<II>(self, new_item_key: II) -> Id<C, II> {
Id::new(self.0, new_item_key)
}
}
impl<'a, ChunkKey, ItemKey> Id<Cow<'a, ChunkKey>, Cow<'a, ItemKey>>
where
ChunkKey: BorrowedKey + ?Sized,
ChunkKey::Owned: ValidKey,
ItemKey: BorrowedKey + ?Sized,
ItemKey::Owned: ValidKey,
{
#[must_use = "This method returns a new Id and otherwise has no effect."]
pub fn of<R>(record: &'a R) -> Self
where
R: Record<ChunkKey, ItemKey>,
{
Id::new(record.chunk_key(), record.item_key())
}
}
impl<C, I> Id<C, I> {
#[must_use = "This method returns a new Id and otherwise has no effect."]
pub fn cloned<ChunkKey, ItemKey, R>(record: &R) -> Self
where
ChunkKey: ToOwned<Owned = C> + ?Sized,
ItemKey: ToOwned<Owned = I> + ?Sized,
C: Borrow<ChunkKey> + Clone,
I: Borrow<ItemKey> + Clone,
R: Record<ChunkKey, ItemKey>,
{
Self::new(
record.chunk_key().into_owned(),
record.item_key().into_owned(),
)
}
}
impl<ChunkKey, ItemKey, C, I> Record<ChunkKey, ItemKey> for Id<C, I>
where
ChunkKey: BorrowedKey + ?Sized,
ItemKey: BorrowedKey + ?Sized,
ChunkKey::Owned: ValidKey + Borrow<ChunkKey>,
ItemKey::Owned: ValidKey + Borrow<ItemKey>,
C: ValidKey + Borrow<ChunkKey>,
I: ValidKey + Borrow<ItemKey>,
{
fn chunk_key(&self) -> Cow<ChunkKey> {
Cow::Borrowed(self.0.borrow())
}
fn item_key(&self) -> Cow<ItemKey> {
Cow::Borrowed(self.1.borrow())
}
}
impl<'a, ChunkKey, ItemKey, Element, C, I> Query<ChunkKey, ItemKey, Element> for Id<C, I>
where
Id<C, I>: Record<ChunkKey, ItemKey>,
Element: Record<ChunkKey, ItemKey>,
ChunkKey: BorrowedKey + ?Sized,
ItemKey: BorrowedKey + ?Sized,
ChunkKey::Owned: ValidKey + Borrow<ChunkKey>,
ItemKey::Owned: ValidKey + Borrow<ItemKey>,
C: ValidKey + Borrow<ChunkKey>,
I: ValidKey + Borrow<ItemKey>,
{
type ChunkIdxSet = Bitfield;
type ItemIdxSet = Bitfield;
fn chunk_idxs(&self, storage: &Storage<ChunkKey, ItemKey, Element>) -> Self::ChunkIdxSet {
Bitfield::from(storage.internal_idx_of(&self.chunk_key()))
}
fn item_idxs(
&self,
_chunk_key: &ChunkKey,
chunk_storage: &ChunkStorage<ChunkKey, ItemKey, Element>,
) -> Self::ItemIdxSet {
Bitfield::from(chunk_storage.internal_idx_of(&self.item_key()))
}
fn test(&self, element: &Element) -> bool {
assert_eq!(self.chunk_key(), element.chunk_key());
assert_eq!(self.item_key(), element.item_key());
true
}
}