1use core::ops::{Deref, DerefMut};
4use core::pin::Pin;
5use core::ptr::NonNull;
6use core::{fmt, mem, slice};
7
8pub use alloc::vec::Vec as UniqueVec;
9
10pub struct AliasableVec<T> {
13 ptr: NonNull<T>,
14 len: usize,
15 cap: usize,
16}
17
18impl<T> AliasableVec<T> {
19 pub fn from_unique(mut vec: UniqueVec<T>) -> Self {
21 let ptr = vec.as_mut_ptr();
22 let len = vec.len();
23 let cap = vec.capacity();
24
25 mem::forget(vec);
26
27 let ptr = unsafe { NonNull::new_unchecked(ptr) };
28
29 Self { ptr, len, cap }
30 }
31
32 #[inline]
35 pub fn into_unique(mut vec: AliasableVec<T>) -> UniqueVec<T> {
36 let unique = unsafe { vec.reclaim_as_unique_vec() };
40 mem::forget(vec);
43 unique
45 }
46
47 pub fn into_unique_pin(pin: Pin<AliasableVec<T>>) -> Pin<UniqueVec<T>> {
50 unsafe {
52 let aliasable = Pin::into_inner_unchecked(pin);
53 Pin::new_unchecked(AliasableVec::into_unique(aliasable))
54 }
55 }
56
57 pub fn from_unique_pin(pin: Pin<UniqueVec<T>>) -> Pin<AliasableVec<T>> {
60 unsafe {
61 let unique = Pin::into_inner_unchecked(pin);
62 Pin::new_unchecked(AliasableVec::from(unique))
63 }
64 }
65
66 #[inline]
67 unsafe fn reclaim_as_unique_vec(&mut self) -> UniqueVec<T> {
68 UniqueVec::from_raw_parts(self.ptr.as_mut(), self.len, self.cap)
69 }
70}
71
72impl<T> From<UniqueVec<T>> for AliasableVec<T> {
73 #[inline]
74 fn from(vec: UniqueVec<T>) -> Self {
75 Self::from_unique(vec)
76 }
77}
78
79impl<T> From<AliasableVec<T>> for UniqueVec<T> {
80 #[inline]
81 fn from(vec: AliasableVec<T>) -> Self {
82 AliasableVec::into_unique(vec)
83 }
84}
85
86impl<T> Drop for AliasableVec<T> {
87 fn drop(&mut self) {
88 let _ = unsafe { self.reclaim_as_unique_vec() };
92 }
93}
94
95impl<T> Deref for AliasableVec<T> {
96 type Target = [T];
97
98 #[inline]
99 fn deref(&self) -> &[T] {
100 unsafe { slice::from_raw_parts(self.ptr.as_ptr(), self.len) }
102 }
103}
104
105impl<T> DerefMut for AliasableVec<T> {
106 #[inline]
107 fn deref_mut(&mut self) -> &mut [T] {
108 unsafe { slice::from_raw_parts_mut(self.ptr.as_ptr(), self.len) }
110 }
111}
112
113impl<T> AsRef<[T]> for AliasableVec<T> {
114 fn as_ref(&self) -> &[T] {
115 &*self
116 }
117}
118
119impl<T> AsMut<[T]> for AliasableVec<T> {
120 fn as_mut(&mut self) -> &mut [T] {
121 &mut *self
122 }
123}
124
125impl<T> fmt::Debug for AliasableVec<T>
126where
127 T: fmt::Debug,
128{
129 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
130 fmt::Debug::fmt(self.as_ref(), f)
131 }
132}
133
134unsafe impl<T> Send for AliasableVec<T> where T: Send {}
135unsafe impl<T> Sync for AliasableVec<T> where T: Sync {}
136
137#[cfg(feature = "traits")]
138unsafe impl<T> crate::StableDeref for AliasableVec<T> {}
139
140#[cfg(feature = "traits")]
141unsafe impl<T> crate::AliasableDeref for AliasableVec<T> {}
142
143#[cfg(test)]
144mod tests {
145 use super::AliasableVec;
146 use alloc::{format, vec};
147 use core::pin::Pin;
148
149 #[test]
150 fn test_new() {
151 let aliasable = AliasableVec::from_unique(vec![10]);
152 assert_eq!(&*aliasable, &[10]);
153 let unique = AliasableVec::into_unique(aliasable);
154 assert_eq!(&*unique, &[10]);
155 }
156
157 #[test]
158 fn test_new_pin() {
159 let aliasable = AliasableVec::from_unique_pin(Pin::new(vec![10]));
160 assert_eq!(&*aliasable, &[10]);
161 let unique = AliasableVec::into_unique_pin(aliasable);
162 assert_eq!(&*unique, &[10]);
163 }
164
165 #[test]
166 fn test_refs() {
167 let mut aliasable = AliasableVec::from_unique(vec![10]);
168 let ptr: *const [u8] = &*aliasable;
169 let as_mut_ptr: *const [u8] = aliasable.as_mut();
170 let as_ref_ptr: *const [u8] = aliasable.as_ref();
171 assert_eq!(ptr, as_mut_ptr);
172 assert_eq!(ptr, as_ref_ptr);
173 }
174
175 #[test]
176 fn test_debug() {
177 let aliasable = AliasableVec::from_unique(vec![10]);
178 assert_eq!(format!("{:?}", aliasable), "[10]");
179 }
180}