1use std::mem;
2use std::mem::ManuallyDrop;
3use std::ptr::NonNull;
4use alloc::slice;
5use alloc::borrow::ToOwned;
6use alloc::vec::Vec;
7use crate::extension::nonnull;
8
9#[derive(Debug)]
18#[repr(C)]
19pub struct OwnedRepr<A> {
20 ptr: NonNull<A>,
21 len: usize,
22 capacity: usize,
23}
24
25impl<A> OwnedRepr<A> {
26 pub(crate) fn from(v: Vec<A>) -> Self {
27 let mut v = ManuallyDrop::new(v);
28 let len = v.len();
29 let capacity = v.capacity();
30 let ptr = nonnull::nonnull_from_vec_data(&mut v);
31 Self {
32 ptr,
33 len,
34 capacity,
35 }
36 }
37
38 pub(crate) fn into_vec(self) -> Vec<A> {
39 ManuallyDrop::new(self).take_as_vec()
40 }
41
42 pub(crate) fn as_slice(&self) -> &[A] {
43 unsafe {
44 slice::from_raw_parts(self.ptr.as_ptr(), self.len)
45 }
46 }
47
48 pub(crate) fn len(&self) -> usize { self.len }
49
50 pub(crate) fn as_ptr(&self) -> *const A {
51 self.ptr.as_ptr()
52 }
53
54 pub(crate) fn as_nonnull_mut(&mut self) -> NonNull<A> {
55 self.ptr
56 }
57
58 pub(crate) unsafe fn data_subst<B>(self) -> OwnedRepr<B> {
65 assert_eq!(mem::size_of::<A>(), mem::size_of::<B>());
67 let self_ = ManuallyDrop::new(self);
68 OwnedRepr {
69 ptr: self_.ptr.cast::<B>(),
70 len: self_.len,
71 capacity: self_.capacity,
72 }
73 }
74
75 fn take_as_vec(&mut self) -> Vec<A> {
76 let capacity = self.capacity;
77 let len = self.len;
78 self.len = 0;
79 self.capacity = 0;
80 unsafe {
81 Vec::from_raw_parts(self.ptr.as_ptr(), len, capacity)
82 }
83 }
84}
85
86impl<A> Clone for OwnedRepr<A>
87 where A: Clone
88{
89 fn clone(&self) -> Self {
90 Self::from(self.as_slice().to_owned())
91 }
92
93 fn clone_from(&mut self, other: &Self) {
94 let mut v = self.take_as_vec();
95 let other = other.as_slice();
96
97 if v.len() > other.len() {
98 v.truncate(other.len());
99 }
100 let (front, back) = other.split_at(v.len());
101 v.clone_from_slice(front);
102 v.extend_from_slice(back);
103 *self = Self::from(v);
104 }
105}
106
107impl<A> Drop for OwnedRepr<A> {
108 fn drop(&mut self) {
109 if self.capacity > 0 {
110 if !mem::needs_drop::<A>() {
120 self.len = 0;
121 }
122 self.take_as_vec();
124 }
125 }
126}
127
128unsafe impl<A> Sync for OwnedRepr<A> where A: Sync { }
129unsafe impl<A> Send for OwnedRepr<A> where A: Send { }
130