use std::ops::Index;
use serde::{Deserialize, Serialize};
use crate::arch::Arch;
use crate::encoding::EncodingWithFilters;
use crate::semantics::Computation;
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, bitcode::Encode, bitcode::Decode)]
pub struct EncodingId(usize);
impl EncodingId {
pub fn as_usize(&self) -> usize {
self.0
}
pub fn from_usize(n: usize) -> EncodingId {
Self(n)
}
}
#[derive(Serialize, Deserialize)]
#[serde(bound(serialize = "C: Serialize", deserialize = "C: Deserialize<'de>"))]
pub struct IndexedEncodings<A: Arch, C: Computation> {
encodings: Vec<EncodingWithFilters<A, C>>,
}
impl<A: Arch, C: Computation> Default for IndexedEncodings<A, C> {
fn default() -> Self {
Self {
encodings: Vec::new(),
}
}
}
impl<A: Arch, C: Computation> IndexedEncodings<A, C> {
pub fn new() -> Self {
Self::default()
}
pub fn add(&mut self, encoding: EncodingWithFilters<A, C>) -> EncodingId {
let id = EncodingId(self.encodings.len());
self.encodings.push(encoding);
id
}
#[must_use]
pub fn len(&self) -> usize {
self.encodings.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn all(&self) -> impl Iterator<Item = &EncodingWithFilters<A, C>> {
self.encodings.iter()
}
}
impl<A: Arch, C: Computation> Index<EncodingId> for IndexedEncodings<A, C> {
type Output = EncodingWithFilters<A, C>;
fn index(&self, index: EncodingId) -> &Self::Output {
&self.encodings[index.0]
}
}
impl<'a, A: Arch, C: Computation> Index<&'a EncodingId> for IndexedEncodings<A, C> {
type Output = EncodingWithFilters<A, C>;
fn index(&self, index: &'a EncodingId) -> &Self::Output {
&self[*index]
}
}