fawkes_crypto/core/
sizedvec.rs1use std::{
2 iter::*,
3 ops::{Index, IndexMut},
4 slice::SliceIndex,
5 slice::{Iter, IterMut},
6 mem::MaybeUninit,
7 self
8};
9
10
11
12#[cfg(feature = "borsh_support")]
13use crate::borsh::{BorshSerialize, BorshDeserialize};
14
15#[cfg(feature = "serde_support")]
16use crate::serde::{Deserialize, Deserializer, Serialize, Serializer};
17
18#[derive(Debug, Clone)]
19pub struct SizedVec<T: Sized, const L: usize>([T; L]);
20
21impl<T, const L: usize> SizedVec<T, L> {
22 pub fn as_slice(&self) -> &[T] {
23 &self.0
24 }
25
26 pub fn as_mut_slice(&mut self) -> &mut [T] {
27 &mut self.0
28 }
29
30 pub fn iter(&self) -> Iter<'_, T> {
31 self.0.iter()
32 }
33
34 pub fn iter_mut(&mut self) -> IterMut<'_, T> {
35 self.0.iter_mut()
36 }
37}
38
39#[cfg(feature = "serde_support")]
40impl<T: Serialize, const L: usize> Serialize for SizedVec<T, L> {
41 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
42 self.0.serialize(serializer)
43 }
44}
45
46#[cfg(feature = "serde_support")]
47impl<'de, T: Deserialize<'de>, const L: usize> Deserialize<'de> for SizedVec<T, L> {
48 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<SizedVec<T, L>, D::Error> {
49 Vec::<T>::deserialize(deserializer).map(|v| SizedVec::<T, L>::from_iter(v))
50 }
51}
52
53
54#[cfg(feature = "borsh_support")]
55impl<T: BorshSerialize, const L: usize> BorshSerialize for SizedVec<T, L> {
56 fn serialize<W: std::io::Write>(&self, writer: &mut W) -> Result<(), std::io::Error> {
57 for i in 0..L {
58 self.0[i].serialize(writer)?;
59 }
60 Ok(())
61 }
62}
63
64#[cfg(feature = "borsh_support")]
65impl<T: BorshDeserialize, const L: usize> BorshDeserialize for SizedVec<T, L> {
66 fn deserialize(buf: &mut &[u8]) -> Result<Self, std::io::Error> {
67 (0..L).map(|_| T::deserialize(buf)).collect()
68 }
69}
70
71
72impl<T, const L: usize> FromIterator<T> for SizedVec<T, L> {
73 #[inline]
74 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
75 let mut iter = iter.into_iter();
76 let mut data: [MaybeUninit<T>; L] = unsafe { MaybeUninit::uninit().assume_init()};
77
78 for i in 0..L {
79 data[i] = MaybeUninit::new(iter.next().expect("iterator is shorter than expected"));
80 }
81
82 assert!(iter.next().is_none(), "iterator is longer than expected");
83
84 SizedVec(unsafe { (&*(&MaybeUninit::new(data) as *const _ as *const MaybeUninit<_>)).assume_init_read() })
85 }
86}
87
88impl<T, I: SliceIndex<[T]>, const L: usize> Index<I> for SizedVec<T, L> {
89 type Output = I::Output;
90
91 #[inline]
92 fn index(&self, index: I) -> &Self::Output {
93 Index::index(&self.0, index)
94 }
95}
96
97impl<T, I: SliceIndex<[T]>, const L: usize> IndexMut<I> for SizedVec<T, L> {
98 #[inline]
99 fn index_mut(&mut self, index: I) -> &mut Self::Output {
100 IndexMut::index_mut(&mut self.0, index)
101 }
102}