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 pub fn new(arr: GenericArray<T, N>) -> Self {
20 ArrayvecStorageRaw::from(arr)
21 }
22
23 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}