use core::panic;
use core::{array, ascii::escape_default, fmt::Display, mem, ops::{Index, IndexMut}, slice::{Iter, IterMut}};
use core::ops::Range;
use inc_dec::*;
use core::fmt::Debug;
use core::mem::take;
#[cfg(feature = "serde")]
use serde::ser::SerializeSeq;
#[cfg(feature = "serde")]
use serde::{Serialize, Serializer};
pub struct CappedVec<T, const N: usize>
where T: Default {
array: [T; N],
len: usize
}
impl<T, const N: usize> CappedVec<T, N>
where T: Default {
pub fn new() -> Self
{
Self
{
array: array::from_fn(|_| T::default()), len: 0
}
}
pub fn push(&mut self, value: T) -> Option<T>
{
let next_last_index = self.len;
if next_last_index >= self.capacity()
{
return Some(value);
}
self.array[next_last_index] = value;
self.len.pp();
None
}
pub fn pop(&mut self) -> Option<T>
{
if self.len == 0
{
return None;
}
let last_index = self.len - 1;
let poped = take(&mut self.array[last_index]);
self.len = last_index;
Some(poped)
}
pub fn len(&self) -> usize
{
self.len
}
pub const fn capacity(&self) -> usize
{
self.array.len()
}
pub const fn has_capacity(&self) -> bool
{
self.capacity() > 0
}
pub fn last_index(&self) -> Option<usize>
{
let len = self.len;
if len == 0
{
None
}
else
{
Some(len - 1)
}
}
pub fn try_index(&mut self, index: usize) -> Option<&T>
{
if index < self.len()
{
Some(&self.array[index])
}
else
{
None
}
}
pub fn try_index_mut(&mut self, index: usize) -> Option<&mut T>
{
if index < self.len()
{
Some(&mut self.array[index])
}
else
{
None
}
}
pub fn is_full(&self) -> bool
{
if self.capacity() == 0
{
return false;
}
self.len() == self.capacity()
}
pub fn is_empty(&self) -> bool
{
self.len() == 0
}
pub fn iter<'a>(&'a self) -> Iter<'a, T>
{
return self.array[..self.len].iter();
}
pub fn iter_mut<'a>(&'a mut self) -> IterMut<'a, T>
{
self.array[..self.len].iter_mut()
}
pub fn insert(&mut self, index: usize, item: T) -> Option<T>
{
if self.len == 0
{
Some(item)
}
else if index <= self.len && !self.is_full()
{
let mut last_index = self.len - 1;
while last_index >= index
{
let current_item = mem::take(&mut self.array[last_index]);
self.array[last_index + 1] = current_item;
last_index.mm();
}
self.array[index] = item;
self.len.pp();
None
}
else
{
Some(item)
}
}
pub fn remove(&mut self, index: usize) -> Option<T>
{
if self.len == 0
{
None
}
else if index < self.len
{
let removed_item = mem::take(&mut self.array[index]);
let mut last_index = index + 1;
while last_index < self.len
{
let current_item = mem::take(&mut self.array[last_index]);
self.array[last_index - 1] = current_item;
last_index.pp();
}
self.len.mm();
Some(removed_item)
}
else
{
None
}
}
pub fn clear(&mut self)
{
if self.len > 0
{
let last_index = self.len - 1;
for item in self.array[..last_index].iter_mut()
{
*item = T::default();
}
self.len = 0;
}
}
pub fn reset(&mut self)
{
self.len = 0;
}
pub fn clear_completely(&mut self)
{
for item in self.array.iter_mut()
{
*item = T::default();
}
self.len = 0;
}
pub fn first(&self) -> Option<&T>
{
if self.len == 0
{
None
}
else
{
Some(&self.array[0])
}
}
pub fn first_mut(&mut self) -> Option<&mut T>
{
if self.len == 0
{
None
}
else
{
Some(&mut self.array[0])
}
}
pub fn last(&self) -> Option<&T>
{
if self.len == 0
{
None
}
else
{
Some(&self.array[self.len - 1])
}
}
pub fn last_mut(&mut self) -> Option<&mut T>
{
if self.len == 0
{
None
}
else
{
Some(&mut self.array[self.len - 1])
}
}
pub fn as_slice(&self) -> &[T]
{
&self.array[..self.len]
}
pub fn as_slice_mut(&mut self) -> &mut [T]
{
&mut self.array[..self.len]
}
pub fn contains(&self, val_ref: &T) -> bool
where T: PartialEq
{
let iter = self.iter();
for item in iter
{
if item == val_ref
{
return true;
}
}
false
}
}
impl<T, const N: usize> Index<usize> for CappedVec<T, N>
where T: Default {
type Output = T;
fn index(&self, index: usize) -> &Self::Output
{
if index >= self.len
{
panic!("Error: The provided index is out of bounds")
}
&self.array[index]
}
}
impl<T, const N: usize> IndexMut<usize> for CappedVec<T, N>
where T: Default {
fn index_mut(&mut self, index: usize) -> &mut Self::Output
{
if index >= self.len
{
panic!("Error: The provided index is out of bounds")
}
&mut self.array[index]
}
}
impl<T, const N: usize> Display for CappedVec<T, N>
where T: Display + Default {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
{
let last_index;
if self.capacity() == 0 || self.len() == 0
{
last_index = 0;
}
else
{
last_index = self.len() - 1;
}
let mut current_index = 0;
f.write_str("[")?;
for item in self.iter()
{
write!(f, "{}", item)?;
if current_index < last_index
{
f.write_str(", ")?;
}
else
{
break;
}
current_index.pp();
}
f.write_str("]")?;
Ok(())
}
}
impl<T, const N: usize> Debug for CappedVec<T, N>
where T: Debug + Default {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("CappedVec").field("array", &self.array).field("len", &self.len).finish()
}
}
impl<T, const N: usize> Clone for CappedVec<T, N>
where T: Clone + Default {
fn clone(&self) -> Self {
Self { array: self.array.clone(), len: self.len.clone() }
}
}
impl<T, const N: usize> Copy for CappedVec<T, N>
where T: Default + Copy
{
}
#[cfg(feature = "serde")]
impl<T, const N: usize> Serialize for CappedVec<T, N>
where T: Default + Serialize {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer
{
let mut seq = serializer.serialize_seq(Some(self.len))?;
let valid_range = self.as_slice();
for item in valid_range
{
seq.serialize_element(item)?;
}
seq.end()
}
}