generic_arrayvec/
plumbing.rs

1use crate::private::Sealed;
2use arrayvec::Array;
3use core::fmt::Debug;
4use core::marker::PhantomData;
5use generic_array::typenum::{False, IsLess, True, U0, U1, U2, U256, U4294967296, U65536};
6use generic_array::{ArrayLength, GenericArray};
7
8#[derive(Debug, Clone)]
9#[repr(transparent)]
10pub struct ArrayvecStorageRaw<T, N, I>(pub GenericArray<T, N>, PhantomData<I>)
11where
12    N: ArrayLength<T>;
13
14impl<T, N, I> ArrayvecStorageRaw<T, N, I>
15where
16    N: ArrayLength<T>,
17{
18    /// Wraps the given `GenericArray` into a new `Wrapper`.
19    pub fn new(arr: GenericArray<T, N>) -> Self {
20        ArrayvecStorageRaw::from(arr)
21    }
22
23    /// Returns the inner `GenericArray` inside this `Wrapper`
24    pub fn into_inner(self) -> GenericArray<T, N> {
25        self.0
26    }
27}
28
29impl<T, N, I> Copy for ArrayvecStorageRaw<T, N, I>
30where
31    T: Copy,
32    N: ArrayLength<T>,
33    N::ArrayType: Copy,
34    I: Copy,
35{
36}
37
38impl<T, N, I> From<GenericArray<T, N>> for ArrayvecStorageRaw<T, N, I>
39where
40    N: ArrayLength<T>,
41{
42    fn from(arr: GenericArray<T, N>) -> Self {
43        ArrayvecStorageRaw(arr, PhantomData)
44    }
45}
46
47impl<T, N, I> From<ArrayvecStorageRaw<T, N, I>> for GenericArray<T, N>
48where
49    N: ArrayLength<T>,
50{
51    fn from(wrapper: ArrayvecStorageRaw<T, N, I>) -> Self {
52        wrapper.0
53    }
54}
55
56unsafe impl<T> Array for ArrayvecStorageRaw<T, U0, ()> {
57    type Item = T;
58    type Index = ();
59    const CAPACITY: usize = 0;
60
61    fn as_slice(&self) -> &[Self::Item] {
62        self.0.as_slice()
63    }
64
65    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
66        self.0.as_mut_slice()
67    }
68}
69
70unsafe impl<T> Array for ArrayvecStorageRaw<T, U1, bool> {
71    type Item = T;
72    type Index = bool;
73    const CAPACITY: usize = 1;
74
75    fn as_slice(&self) -> &[Self::Item] {
76        self.0.as_slice()
77    }
78
79    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
80        self.0.as_mut_slice()
81    }
82}
83
84unsafe impl<T, N> Array for ArrayvecStorageRaw<T, N, u8>
85where
86    N: ArrayLength<T> + IsLess<U256>,
87    <N as IsLess<U256>>::Output: IsTrue,
88{
89    type Item = T;
90    type Index = u8;
91    const CAPACITY: usize = N::USIZE;
92
93    fn as_slice(&self) -> &[Self::Item] {
94        self.0.as_slice()
95    }
96
97    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
98        self.0.as_mut_slice()
99    }
100}
101
102unsafe impl<T, N> Array for ArrayvecStorageRaw<T, N, u16>
103where
104    N: ArrayLength<T> + IsLess<U65536>,
105    <N as IsLess<U65536>>::Output: IsTrue,
106{
107    type Item = T;
108    type Index = u16;
109    const CAPACITY: usize = N::USIZE;
110
111    fn as_slice(&self) -> &[Self::Item] {
112        self.0.as_slice()
113    }
114
115    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
116        self.0.as_mut_slice()
117    }
118}
119
120unsafe impl<T, N> Array for ArrayvecStorageRaw<T, N, u32>
121where
122    N: ArrayLength<T> + IsLess<U4294967296>,
123    <N as IsLess<U4294967296>>::Output: IsTrue,
124{
125    type Item = T;
126    type Index = u32;
127    const CAPACITY: usize = N::USIZE;
128
129    fn as_slice(&self) -> &[Self::Item] {
130        self.0.as_slice()
131    }
132
133    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
134        self.0.as_mut_slice()
135    }
136}
137
138unsafe impl<T, N> Array for ArrayvecStorageRaw<T, N, usize>
139where
140    N: ArrayLength<T>,
141{
142    type Item = T;
143    type Index = usize;
144    const CAPACITY: usize = N::USIZE;
145
146    fn as_slice(&self) -> &[Self::Item] {
147        self.0.as_slice()
148    }
149
150    fn as_mut_slice(&mut self) -> &mut [Self::Item] {
151        self.0.as_mut_slice()
152    }
153}
154
155pub trait IsTrue {
156    fn _sealed(_: Sealed);
157}
158
159impl IsTrue for True {
160    fn _sealed(_: Sealed) {}
161}
162
163pub trait PickIndex {
164    type Output: Copy;
165    fn _sealed(_: Sealed);
166}
167
168impl PickIndex for (True, True, True, True, True) {
169    type Output = ();
170    fn _sealed(_: Sealed) {}
171}
172
173impl PickIndex for (False, True, True, True, True) {
174    type Output = bool;
175    fn _sealed(_: Sealed) {}
176}
177
178impl PickIndex for (False, False, True, True, True) {
179    type Output = u8;
180    fn _sealed(_: Sealed) {}
181}
182
183impl PickIndex for (False, False, False, True, True) {
184    type Output = u16;
185    fn _sealed(_: Sealed) {}
186}
187
188impl PickIndex for (False, False, False, False, True) {
189    type Output = u32;
190    fn _sealed(_: Sealed) {}
191}
192
193impl PickIndex for (False, False, False, False, False) {
194    type Output = usize;
195    fn _sealed(_: Sealed) {}
196}
197
198pub type PickIndexBreakpoints<N> = (
199    <N as IsLess<U1>>::Output,
200    <N as IsLess<U2>>::Output,
201    <N as IsLess<U256>>::Output,
202    <N as IsLess<U65536>>::Output,
203    <N as IsLess<U4294967296>>::Output,
204);
205
206pub type IndexForCapacity<N> =
207    <<N as PickIndexBreakpointsForCapacity>::PickIndexBreakpoints as PickIndex>::Output;
208
209pub trait PickIndexBreakpointsForCapacity {
210    type PickIndexBreakpoints: PickIndex;
211    fn _sealed(_: Sealed);
212}
213
214impl<N> PickIndexBreakpointsForCapacity for N
215where
216    N: IsLess<U1> + IsLess<U2> + IsLess<U256> + IsLess<U65536> + IsLess<U4294967296>,
217    PickIndexBreakpoints<N>: PickIndex,
218{
219    type PickIndexBreakpoints = PickIndexBreakpoints<N>;
220    fn _sealed(_: Sealed) {}
221}