1 #[cfg(feature = "read")]
3 #[cfg(feature = "read")]
6 use core
::mem
::MaybeUninit
;
12 // SAFETY: Implementer must not modify the content in storage.
13 pub unsafe trait Sealed
{
16 fn new_storage() -> Self::Storage
;
18 fn grow(_storage
: &mut Self::Storage
, _additional
: usize) -> Result
<(), CapacityFull
> {
23 #[derive(Clone, Copy, Debug)]
24 pub struct CapacityFull
;
29 /// Marker trait for types that can be used as backing storage when a growable array type is needed.
31 /// This trait is sealed and cannot be implemented for types outside this crate.
32 pub trait ArrayLike
: Sealed
{
33 /// Type of the elements being stored.
37 fn as_slice(storage
: &Self::Storage
) -> &[MaybeUninit
<Self::Item
>];
40 fn as_mut_slice(storage
: &mut Self::Storage
) -> &mut [MaybeUninit
<Self::Item
>];
43 // Use macro since const generics can't be used due to MSRV.
44 macro_rules
! impl_array
{
46 ($n
:literal $
($rest
:tt
)*) => {
47 // SAFETY: does not modify the content in storage.
48 unsafe impl<T
> Sealed
for [T
; $n
] {
49 type Storage
= [MaybeUninit
<T
>; $n
];
51 fn new_storage() -> Self::Storage
{
52 // SAFETY: An uninitialized `[MaybeUninit<_>; _]` is valid.
53 unsafe { MaybeUninit::uninit().assume_init() }
57 impl<T
> ArrayLike
for [T
; $n
] {
60 fn as_slice(storage
: &Self::Storage
) -> &[MaybeUninit
<T
>] {
64 fn as_mut_slice(storage
: &mut Self::Storage
) -> &mut [MaybeUninit
<T
>] {
69 impl_array
!($
($rest
)*);
73 impl_array
!(0 1 2 3 4 8 16 32 64 128 192);
75 #[cfg(feature = "read")]
76 unsafe impl<T
> Sealed
for Vec
<T
> {
77 type Storage
= Box
<[MaybeUninit
<T
>]>;
79 fn new_storage() -> Self::Storage
{
83 fn grow(storage
: &mut Self::Storage
, additional
: usize) -> Result
<(), CapacityFull
> {
84 let mut vec
: Vec
<_
> = core
::mem
::replace(storage
, Box
::new([])).into();
85 vec
.reserve(additional
);
86 // SAFETY: This is a `Vec` of `MaybeUninit`.
87 unsafe { vec.set_len(vec.capacity()) }
;
88 *storage
= vec
.into_boxed_slice();
93 #[cfg(feature = "read")]
94 impl<T
> ArrayLike
for Vec
<T
> {
97 fn as_slice(storage
: &Self::Storage
) -> &[MaybeUninit
<T
>] {
101 fn as_mut_slice(storage
: &mut Self::Storage
) -> &mut [MaybeUninit
<T
>] {
106 pub(crate) struct ArrayVec
<A
: ArrayLike
> {
111 impl<A
: ArrayLike
> ArrayVec
<A
> {
112 pub fn new() -> Self {
114 storage
: A
::new_storage(),
119 pub fn clear(&mut self) {
120 let ptr
: *mut [A
::Item
] = &mut **self;
121 // Set length first so the type invariant is upheld even if `drop_in_place` panicks.
123 // SAFETY: `ptr` contains valid elements only and we "forget" them by setting the length.
124 unsafe { ptr::drop_in_place(ptr) }
;
127 pub fn try_push(&mut self, value
: A
::Item
) -> Result
<(), CapacityFull
> {
128 let mut storage
= A
::as_mut_slice(&mut self.storage
);
129 if self.len
>= storage
.len() {
130 A
::grow(&mut self.storage
, 1)?
;
131 storage
= A
::as_mut_slice(&mut self.storage
);
134 storage
[self.len
] = MaybeUninit
::new(value
);
139 pub fn try_insert(&mut self, index
: usize, element
: A
::Item
) -> Result
<(), CapacityFull
> {
140 assert
!(index
<= self.len
);
142 let mut storage
= A
::as_mut_slice(&mut self.storage
);
143 if self.len
>= storage
.len() {
144 A
::grow(&mut self.storage
, 1)?
;
145 storage
= A
::as_mut_slice(&mut self.storage
);
148 // SAFETY: storage[index] is filled later.
150 let p
= storage
.as_mut_ptr().add(index
);
151 core
::ptr
::copy(p
as *const _
, p
.add(1), self.len
- index
);
153 storage
[index
] = MaybeUninit
::new(element
);
158 pub fn pop(&mut self) -> Option
<A
::Item
> {
163 // SAFETY: this element is valid and we "forget" it by setting the length.
164 Some(unsafe { A::as_slice(&mut self.storage)[self.len].as_ptr().read() }
)
168 pub fn swap_remove(&mut self, index
: usize) -> A
::Item
{
169 assert
!(self.len
> 0);
170 A
::as_mut_slice(&mut self.storage
).swap(index
, self.len
- 1);
175 #[cfg(feature = "read")]
176 impl<T
> ArrayVec
<Vec
<T
>> {
177 pub fn into_vec(mut self) -> Vec
<T
> {
178 let len
= core
::mem
::replace(&mut self.len
, 0);
179 let storage
= core
::mem
::replace(&mut self.storage
, Box
::new([]));
180 let slice
= Box
::leak(storage
);
181 debug_assert
!(len
<= slice
.len());
182 // SAFETY: valid elements.
183 unsafe { Vec::from_raw_parts(slice.as_mut_ptr() as *mut T, len, slice.len()) }
187 impl<A
: ArrayLike
> Drop
for ArrayVec
<A
> {
193 impl<A
: ArrayLike
> Default
for ArrayVec
<A
> {
194 fn default() -> Self {
199 impl<A
: ArrayLike
> ops
::Deref
for ArrayVec
<A
> {
200 type Target
= [A
::Item
];
202 fn deref(&self) -> &[A
::Item
] {
203 let slice
= &A
::as_slice(&self.storage
);
204 debug_assert
!(self.len
<= slice
.len());
205 // SAFETY: valid elements.
206 unsafe { slice::from_raw_parts(slice.as_ptr() as _, self.len) }
210 impl<A
: ArrayLike
> ops
::DerefMut
for ArrayVec
<A
> {
211 fn deref_mut(&mut self) -> &mut [A
::Item
] {
212 let slice
= &mut A
::as_mut_slice(&mut self.storage
);
213 debug_assert
!(self.len
<= slice
.len());
214 // SAFETY: valid elements.
215 unsafe { slice::from_raw_parts_mut(slice.as_mut_ptr() as _, self.len) }
219 impl<A
: ArrayLike
> Clone
for ArrayVec
<A
>
223 fn clone(&self) -> Self {
224 let mut new
= Self::default();
225 for value
in &**self {
226 new
.try_push(value
.clone()).unwrap();
232 impl<A
: ArrayLike
> PartialEq
for ArrayVec
<A
>
236 fn eq(&self, other
: &Self) -> bool
{
241 impl<A
: ArrayLike
> Eq
for ArrayVec
<A
> where A
::Item
: Eq {}
243 impl<A
: ArrayLike
> fmt
::Debug
for ArrayVec
<A
>
247 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
248 fmt
::Debug
::fmt(&**self, f
)