1#![allow(clippy::module_name_repetitions)]
5
6use core::{
7 any::{Any, TypeId},
8 marker::PhantomData,
9 mem,
10 ops::{Deref, DerefMut},
11 slice,
12};
13
14use alloc::vec::Vec;
15
16use super::{
17 AnyBound, DeferredValue, HasMetadata, Metadata, OpaqueValue, SliceAny,
18 SliceAnyMut,
19};
20
21pub(crate) unsafe fn drop<T>(ptr: *mut (), len: usize, cap: usize) {
25 Vec::<T>::from_raw_parts(ptr.cast(), len, cap);
26}
27
28#[derive(Debug)]
41pub struct VecAny<B: ?Sized = dyn Any + Send + Sync> {
42 ptr: *mut (),
43 meta: &'static Metadata,
44 len: usize,
45 cap: usize,
46 _marker: PhantomData<B>,
47}
48
49unsafe impl<B: ?Sized + Send> Send for VecAny<B> {}
50unsafe impl<B: ?Sized + Sync> Sync for VecAny<B> {}
51
52impl<B: ?Sized, T: AnyBound<B>> From<Vec<T>> for VecAny<B> {
53 fn from(vec: Vec<T>) -> Self {
54 let mut vec = mem::ManuallyDrop::new(vec);
55 let ptr = vec.as_mut_ptr().cast();
56 let meta = T::META;
57 let len = vec.len();
58 let cap = vec.capacity();
59 Self {
60 ptr,
61 meta,
62 len,
63 cap,
64 _marker: PhantomData,
65 }
66 }
67}
68
69impl<B: ?Sized> Drop for VecAny<B> {
70 fn drop(&mut self) {
71 unsafe {
72 (self.meta.drop)(self.ptr, self.len, self.cap);
73 }
74 }
75}
76
77impl VecAny {
78 #[must_use]
81 pub fn opaque() -> Self {
82 Self::new::<OpaqueValue>()
83 }
84
85 #[must_use]
97 pub fn deferred() -> Self {
98 Self::new::<DeferredValue>()
99 }
100}
101
102impl<B: ?Sized> VecAny<B> {
103 #[must_use]
105 pub fn new<T: AnyBound<B>>() -> Self {
106 Self::from(Vec::<T>::new())
107 }
108
109 #[must_use]
111 pub fn len(&self) -> usize {
112 self.len
113 }
114
115 #[must_use]
118 #[deprecated(
119 since = "0.2.1",
120 note = "method name was misspelled, use the correct spelling instead"
121 )]
122 pub fn capcaity(&self) -> usize {
123 self.cap
124 }
125
126 #[must_use]
129 pub fn capacity(&self) -> usize {
130 self.cap
131 }
132
133 #[must_use]
135 pub fn is_empty(&self) -> bool {
136 self.len == 0
137 }
138
139 #[must_use]
148 pub fn type_id_of_element(&self) -> TypeId {
149 (self.meta.type_id)()
150 }
151
152 #[must_use]
154 pub fn as_slice_any(&self) -> SliceAny<'_> {
155 SliceAny {
156 ptr: self.ptr,
157 meta: self.meta,
158 len: self.len,
159 _marker: PhantomData,
160 }
161 }
162
163 #[must_use]
165 pub fn as_slice_any_mut(&mut self) -> SliceAnyMut<'_> {
166 SliceAnyMut {
167 ptr: self.ptr,
168 meta: self.meta,
169 len: self.len,
170 _marker: PhantomData,
171 }
172 }
173
174 pub fn downcast<T: AnyBound<B>>(self) -> Result<Vec<T>, Self> {
181 if self.type_id_of_element() == TypeId::of::<T>() {
182 let this = mem::ManuallyDrop::new(self);
183 Ok(unsafe {
186 Vec::from_raw_parts(this.ptr.cast(), this.len, this.cap)
187 })
188 } else if self.meta.is_deferred() {
189 mem::forget(self);
191 Ok(Vec::new())
192 } else {
193 Err(self)
194 }
195 }
196
197 #[must_use]
204 pub fn downcast_mut<T: AnyBound<B>>(
205 &mut self,
206 ) -> Option<VecAnyGuard<'_, T, B>> {
207 if self.type_id_of_element() == TypeId::of::<T>() {
208 let vec = unsafe { self.swap_vec(Vec::new()) };
211 Some(VecAnyGuard { vec, origin: self })
212 } else if self.meta.is_deferred() {
213 mem::forget(mem::replace(self, Self::new::<T>()));
215 let vec = unsafe { self.swap_vec(Vec::new()) };
217 Some(VecAnyGuard { vec, origin: self })
218 } else {
219 None
220 }
221 }
222
223 #[must_use]
226 pub fn downcast_slice<T: AnyBound<B>>(&self) -> Option<&[T]> {
227 if self.type_id_of_element() == TypeId::of::<T>() {
228 Some(unsafe { slice::from_raw_parts(self.ptr.cast(), self.len) })
231 } else if self.meta.is_deferred() {
232 Some(&[])
233 } else {
234 None
235 }
236 }
237
238 #[must_use]
241 pub fn downcast_slice_mut<T: AnyBound<B>>(&mut self) -> Option<&mut [T]> {
242 if self.type_id_of_element() == TypeId::of::<T>() {
243 Some(unsafe {
246 slice::from_raw_parts_mut(self.ptr.cast(), self.len)
247 })
248 } else if self.meta.is_deferred() {
249 mem::forget(mem::replace(self, Self::new::<T>()));
251 Some(unsafe {
253 slice::from_raw_parts_mut(self.ptr.cast(), self.len)
254 })
255 } else {
256 None
257 }
258 }
259
260 unsafe fn swap_vec<T: AnyBound<B>>(&mut self, new: Vec<T>) -> Vec<T> {
263 let mut new = mem::ManuallyDrop::new(new);
264 let mut ptr = new.as_mut_ptr().cast();
265 let mut len = new.len();
266 let mut cap = new.capacity();
267 mem::swap(&mut self.ptr, &mut ptr);
268 mem::swap(&mut self.len, &mut len);
269 mem::swap(&mut self.cap, &mut cap);
270 Vec::from_raw_parts(ptr.cast(), len, cap)
273 }
274}
275
276#[derive(Debug)]
283pub struct VecAnyGuard<'a, T: AnyBound<B>, B: ?Sized = dyn Any + Send + Sync> {
284 vec: Vec<T>,
285 origin: &'a mut VecAny<B>,
286}
287
288impl<'a, T: AnyBound<B>, B: ?Sized> Deref for VecAnyGuard<'a, T, B> {
289 type Target = Vec<T>;
290
291 fn deref(&self) -> &Vec<T> {
292 &self.vec
293 }
294}
295
296impl<'a, T: AnyBound<B>, B: ?Sized> DerefMut for VecAnyGuard<'a, T, B> {
297 fn deref_mut(&mut self) -> &mut Vec<T> {
298 &mut self.vec
299 }
300}
301
302impl<'a, T: AnyBound<B>, B: ?Sized> Drop for VecAnyGuard<'a, T, B> {
303 fn drop(&mut self) {
304 unsafe {
307 self.origin.swap_vec(mem::take(&mut self.vec));
308 }
309 }
310}
311
312#[cfg(test)]
313mod tests {
314 use super::*;
315
316 #[test]
317 fn downcast_vec() {
318 use alloc::vec::Vec;
319
320 let data: Vec<u8> = b"hello".to_vec();
321 let mut vec_any: VecAny = VecAny::from(data);
322
323 assert_eq!(vec_any.type_id_of_element(), TypeId::of::<u8>());
324
325 assert!(vec_any.downcast_mut::<()>().is_none());
326 assert!(vec_any.downcast_mut::<u32>().is_none());
327 assert!(vec_any.downcast_mut::<u8>().is_some());
328
329 assert_eq!(vec_any.downcast_slice::<()>(), None);
330 assert_eq!(vec_any.downcast_slice::<u32>(), None);
331 assert_eq!(vec_any.downcast_slice::<u8>(), Some(&b"hello"[..]));
332
333 let vec_any = vec_any.downcast::<()>().unwrap_err();
334 let vec_any = vec_any.downcast::<u32>().unwrap_err();
335 let data = vec_any.downcast::<u8>().unwrap();
336 assert_eq!(data, b"hello".to_vec());
337 }
338
339 #[test]
340 fn deferred_vec() {
341 let mut v = VecAny::deferred();
342 assert_eq!(v.downcast_slice::<f64>(), Some(&[][..]));
343 assert_eq!(v.downcast_slice_mut::<u32>(), Some(&mut [][..]));
344 assert_eq!(v.downcast_slice::<f64>(), None);
345 }
346}