use serde::{Serialize,Deserialize};
use super::{
Collection,
Artist,
Album,
Song,
};
#[cfg(not(target_pointer_width = "64"))]
compile_error!("Festival is only built for 64-bit systems.");
macro_rules! impl_common {
($type:ty) => {
impl $type {
#[inline(always)]
pub const fn new() -> Self {
Self(0)
}
#[inline(always)]
pub const fn inner(&self) -> usize {
self.0
}
}
impl From<u8> for $type {
#[inline(always)]
fn from(index: u8) -> Self {
Self(index as usize)
}
}
impl From<u16> for $type {
#[inline(always)]
fn from(index: u16) -> Self {
Self(index as usize)
}
}
impl From<u32> for $type {
#[inline(always)]
fn from(index: u32) -> Self {
Self(index as usize)
}
}
impl From<u64> for $type {
#[inline(always)]
fn from(index: u64) -> Self {
Self(index as usize)
}
}
impl From<usize> for $type {
#[inline(always)]
fn from(index: usize) -> Self {
Self(index)
}
}
impl std::default::Default for $type {
#[inline(always)]
fn default() -> Self {
Self::new()
}
}
impl std::fmt::Display for $type {
#[inline(always)]
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
}
}
#[derive(Copy,Clone,Debug,Default,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct Key(ArtistKey, AlbumKey, SongKey);
impl Key {
#[inline(always)]
pub const fn new() -> Self {
Self(ArtistKey::new(), AlbumKey::new(), SongKey::new())
}
#[inline(always)]
pub const fn artist(&self) -> ArtistKey {
self.0
}
#[inline(always)]
pub const fn album(&self) -> AlbumKey {
self.1
}
#[inline(always)]
pub const fn song(&self) -> SongKey {
self.2
}
#[inline(always)]
pub const fn inner(&self) -> (ArtistKey, AlbumKey, SongKey) {
(self.0, self.1, self.2)
}
#[inline(always)]
pub const fn inner_usize(&self) -> (usize, usize, usize) {
(self.0.inner(), self.1.inner(), self.2.inner())
}
}
impl<A, B, C> From<(A, B, C)> for Key
where
A: Into<u64>,
B: Into<u64>,
C: Into<u64>,
{
#[inline]
fn from(tuple: (A, B, C)) -> Self {
Self(ArtistKey(tuple.0.into() as usize), AlbumKey(tuple.1.into() as usize), SongKey(tuple.2.into() as usize))
}
}
#[derive(Clone,Debug,Default,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct Keychain {
pub artists: Vec<ArtistKey>,
pub albums: Vec<AlbumKey>,
pub songs: Vec<SongKey>,
}
impl Keychain {
#[inline(always)]
pub const fn new() -> Self {
Self {
artists: vec![],
albums: vec![],
songs: vec![]
}
}
#[inline(always)]
pub fn into_vecs(self) -> (Vec<ArtistKey>, Vec<AlbumKey>, Vec<SongKey>) {
(self.artists, self.albums, self.songs)
}
#[inline(always)]
pub const fn from_vecs(
artists: Vec<ArtistKey>,
albums: Vec<AlbumKey>,
songs: Vec<SongKey>,
) -> Self {
Self {
artists,
albums,
songs,
}
}
}
#[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct ArtistKey(usize);
impl_common!(ArtistKey);
#[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct AlbumKey(usize);
impl_common!(AlbumKey);
#[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct SongKey(usize);
impl_common!(SongKey);
#[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct QueueKey(usize);
impl_common!(QueueKey);
#[derive(Copy,Clone,Debug,Hash,PartialEq,Eq,PartialOrd,Ord,Serialize,Deserialize)]
pub struct PlaylistKey(usize);
impl_common!(PlaylistKey);