use std::ops::Index;
use crate::{
Const, ValidBranchingConstant,
vector::{IntoIter, Iter, IterMut},
};
use super::Vector;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Slice<T, const N: usize>
where
Const<N>: ValidBranchingConstant,
{
vec: Vector<T, N>,
start: usize,
end: usize,
}
impl<T, const N: usize> Default for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
fn default() -> Self {
Slice {
vec: Default::default(),
start: 0,
end: 0,
}
}
}
impl<T: Clone + serde::Serialize, const N: usize> serde::Serialize for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeSeq;
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for elt in self.iter() {
seq.serialize_element(elt)?;
}
seq.end()
}
}
impl<'de, T: Clone + serde::Deserialize<'de>, const N: usize> serde::Deserialize<'de>
for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let vec: Vec<T> = Vec::deserialize(deserializer)?;
Ok(vec.into_iter().collect())
}
}
impl<T: Clone, const N: usize> Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
pub fn len(&self) -> usize {
self.end - self.start
}
pub fn is_empty(&self) -> bool {
self.end == self.start
}
pub fn get(&self, idx: usize) -> Option<&T> {
self.start.checked_add(idx).and_then(|i| self.vec.get(i))
}
pub fn set(&mut self, idx: usize, elt: T) {
self.vec.set(self.start.checked_add(idx).unwrap(), elt);
}
pub fn push(&mut self, elt: T) {
self.vec.truncate(self.end);
self.vec.push(elt);
self.end += 1;
}
pub fn pop(&mut self) -> Option<T> {
if self.is_empty() {
None
} else {
self.vec.truncate(self.end);
self.end -= 1;
self.vec.pop()
}
}
pub fn iter(&self) -> impl Iterator<Item = &'_ T> {
self.into_iter()
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = &'_ mut T> {
self.into_iter()
}
pub fn slice(&mut self, from: usize, to: usize) {
assert!(from <= to);
assert!(to <= self.len());
self.end = self.start + to;
self.start += from;
}
}
impl<T: Clone, const N: usize> IntoIterator for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
type Item = T;
type IntoIter = std::iter::Take<IntoIter<T, N>>;
fn into_iter(self) -> Self::IntoIter {
let len = self.len();
self.vec.into_iter_starting_at(self.start).take(len)
}
}
impl<'a, T: Clone, const N: usize> IntoIterator for &'a Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
type Item = &'a T;
type IntoIter = std::iter::Take<Iter<'a, T, N>>;
fn into_iter(self) -> Self::IntoIter {
let len = self.len();
self.vec.iter_starting_at(self.start).take(len)
}
}
impl<'a, T: Clone, const N: usize> IntoIterator for &'a mut Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
type Item = &'a mut T;
type IntoIter = std::iter::Take<IterMut<'a, T, N>>;
fn into_iter(self) -> Self::IntoIter {
let len = self.len();
self.vec.iter_mut_starting_at(self.start).take(len)
}
}
impl<T: Clone, const N: usize> Extend<T> for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
self.vec.truncate(self.end);
self.vec.extend(iter);
self.end = self.vec.len();
}
}
impl<T: Clone, const N: usize> Index<usize> for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
self.get(index).expect("index out of bounds")
}
}
impl<T: Clone, const N: usize> FromIterator<T> for Slice<T, N>
where
Const<N>: ValidBranchingConstant,
{
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let vec: Vector<_, N> = iter.into_iter().collect();
Self {
start: 0,
end: vec.len(),
vec,
}
}
}