1use alloc::{boxed::Box, rc::Rc, sync::Arc, vec::Vec};
2use core::{
3 borrow::{Borrow, BorrowMut},
4 fmt::{self, Debug},
5 hash::{self, Hash},
6 ops::{Index, IndexMut},
7 ptr,
8 slice::SliceIndex,
9};
10use rc_vec_proc_macro::rc_impl_gen_arc_impl;
11use unique_rc::{UniqArc, UniqRc};
12
13use crate::{ArcVec, RcVec};
14
15mod into_iter;
16
17#[rc_impl_gen_arc_impl]
18impl<T> AsRef<Self> for RcVec<T> {
19 fn as_ref(&self) -> &Self {
20 self
21 }
22}
23
24#[rc_impl_gen_arc_impl]
25impl<T> AsMut<Self> for RcVec<T> {
26 fn as_mut(&mut self) -> &mut Self {
27 self
28 }
29}
30
31#[rc_impl_gen_arc_impl]
32impl<T> AsRef<[T]> for RcVec<T> {
33 fn as_ref(&self) -> &[T] {
34 self
35 }
36}
37
38#[rc_impl_gen_arc_impl]
39impl<T> AsMut<[T]> for RcVec<T> {
40 fn as_mut(&mut self) -> &mut [T] {
41 self
42 }
43}
44
45#[rc_impl_gen_arc_impl]
46impl<T> Borrow<[T]> for RcVec<T> {
47 fn borrow(&self) -> &[T] {
48 self
49 }
50}
51
52#[rc_impl_gen_arc_impl]
53impl<T> BorrowMut<[T]> for RcVec<T> {
54 fn borrow_mut(&mut self) -> &mut [T] {
55 self
56 }
57}
58
59#[rc_impl_gen_arc_impl]
60impl<T: Clone> From<&[T]> for RcVec<T> {
61 fn from(value: &[T]) -> Self {
62 let uniq_rc: UniqRc<[T]> = UniqRc::from(value);
63 Self::from(uniq_rc)
64 }
65}
66
67#[rc_impl_gen_arc_impl]
68impl<T: Clone> From<&mut [T]> for RcVec<T> {
69 fn from(value: &mut [T]) -> Self {
70 let uniq_rc: UniqRc<[T]> = UniqRc::from(value);
71 Self::from(uniq_rc)
72 }
73}
74
75#[rc_impl_gen_arc_impl]
76impl<T: Clone> From<Rc<[T]>> for RcVec<T> {
77 fn from(value: Rc<[T]>) -> Self {
78 let uniq_rc = UniqRc::from(value);
79 Self::from(uniq_rc)
80 }
81}
82
83#[rc_impl_gen_arc_impl]
84impl From<UniqRc<str>> for RcVec<u8> {
85 fn from(value: UniqRc<str>) -> Self {
86 let len = value.len();
87 let rc = UniqRc::into_raw(value).cast::<u8>();
88 let slice = ptr::slice_from_raw_parts_mut(rc, len);
89 let value = unsafe { UniqRc::from_raw_unchecked(slice) };
90 value.into()
91 }
92}
93
94#[rc_impl_gen_arc_impl]
95impl<T, const N: usize> From<[T; N]> for RcVec<T> {
96 fn from(value: [T; N]) -> Self {
97 Self::from_iter(value)
98 }
99}
100
101#[rc_impl_gen_arc_impl]
102impl<T> FromIterator<T> for RcVec<T> {
103 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
104 let iter = iter.into_iter();
105 let mut buf = Self::with_capacity(iter.size_hint().0);
106 buf.extend(iter);
107 buf
108 }
109}
110
111#[rc_impl_gen_arc_impl]
112impl<T> Extend<T> for RcVec<T> {
113 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
114 let iter = iter.into_iter();
115 self.reserve(iter.size_hint().0);
116 iter.for_each(|value| self.push(value));
117 }
118}
119
120#[rc_impl_gen_arc_impl]
121impl<'a, T: Copy> Extend<&'a T> for RcVec<T> {
122 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
123 self.extend(iter.into_iter().copied());
124 }
125}
126
127#[rc_impl_gen_arc_impl]
128impl<T> From<RcVec<T>> for Rc<[T]> {
129 fn from(value: RcVec<T>) -> Self {
130 value.into_rc_slice()
131 }
132}
133
134#[rc_impl_gen_arc_impl]
136impl<T> From<RcVec<T>> for Box<[T]> {
137 fn from(value: RcVec<T>) -> Self {
138 let len = value.len();
139 let raw = value.into_raw_vec();
140 Box::from_iter(raw.slice()[..len].iter().map(|value| {
141 unsafe { value.assume_init_read() }
142 }))
143 }
144}
145
146#[rc_impl_gen_arc_impl]
147impl From<&str> for RcVec<u8> {
148 fn from(value: &str) -> Self {
149 let uniq_rc: UniqRc<str> = UniqRc::from(value);
150 let len = uniq_rc.len();
151 let str_ptr = UniqRc::into_raw(uniq_rc);
152 let uniq_rc = unsafe {
153 let slice_ptr = ptr::slice_from_raw_parts_mut(
154 str_ptr.cast::<u8>(),
155 len,
156 );
157 UniqRc::from_raw_unchecked(slice_ptr)
158 };
159 Self::from(uniq_rc)
160 }
161}
162
163#[rc_impl_gen_arc_impl]
164impl<T: Eq> Eq for RcVec<T> {}
165
166#[rc_impl_gen_arc_impl]
167impl<T: PartialEq> PartialEq for RcVec<T> {
168 fn eq(&self, other: &Self) -> bool {
169 **self == **other
170 }
171}
172
173#[rc_impl_gen_arc_impl]
174impl<T: PartialEq> PartialEq<[T]> for RcVec<T> {
175 fn eq(&self, other: &[T]) -> bool {
176 **self == *other
177 }
178}
179
180#[rc_impl_gen_arc_impl]
181impl<T: PartialEq> PartialEq<RcVec<T>> for Vec<T> {
182 fn eq(&self, other: &RcVec<T>) -> bool {
183 **self == **other
184 }
185}
186
187#[rc_impl_gen_arc_impl]
188impl<T: PartialEq> PartialEq<Vec<T>> for RcVec<T> {
189 fn eq(&self, other: &Vec<T>) -> bool {
190 **self == **other
191 }
192}
193
194#[rc_impl_gen_arc_impl]
195impl<T: PartialEq, const N: usize> PartialEq<[T; N]> for RcVec<T> {
196 fn eq(&self, other: &[T; N]) -> bool {
197 **self == *other
198 }
199}
200
201#[rc_impl_gen_arc_impl]
202impl<T: PartialEq, const N: usize> PartialEq<&[T; N]> for RcVec<T> {
203 fn eq(&self, other: &&[T; N]) -> bool {
204 **self == **other
205 }
206}
207
208#[rc_impl_gen_arc_impl]
209impl<T: PartialEq, const N: usize> PartialEq<&mut [T; N]> for RcVec<T> {
210 fn eq(&self, other: &&mut [T; N]) -> bool {
211 **self == **other
212 }
213}
214
215#[rc_impl_gen_arc_impl]
216impl<T: PartialEq> PartialEq<&[T]> for RcVec<T> {
217 fn eq(&self, other: &&[T]) -> bool {
218 **self == **other
219 }
220}
221
222#[rc_impl_gen_arc_impl]
223impl<T: PartialEq> PartialEq<&mut [T]> for RcVec<T> {
224 fn eq(&self, other: &&mut [T]) -> bool {
225 **self == **other
226 }
227}
228
229#[rc_impl_gen_arc_impl]
230impl<T: PartialEq> PartialEq<RcVec<T>> for [T] {
231 fn eq(&self, other: &RcVec<T>) -> bool {
232 *self == **other
233 }
234}
235
236#[rc_impl_gen_arc_impl]
237impl<T: PartialEq> PartialEq<RcVec<T>> for &[T] {
238 fn eq(&self, other: &RcVec<T>) -> bool {
239 **self == **other
240 }
241}
242
243#[rc_impl_gen_arc_impl]
244impl<T: PartialEq> PartialEq<RcVec<T>> for &mut [T] {
245 fn eq(&self, other: &RcVec<T>) -> bool {
246 **self == **other
247 }
248}
249
250#[rc_impl_gen_arc_impl]
251impl<T: PartialEq> PartialEq<UniqRc<[T]>> for RcVec<T> {
252 fn eq(&self, other: &UniqRc<[T]>) -> bool {
253 **self == **other
254 }
255}
256
257#[rc_impl_gen_arc_impl]
258impl<T: Debug> Debug for RcVec<T> {
259 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
260 (**self).fmt(f)
261 }
262}
263
264#[rc_impl_gen_arc_impl]
265impl<T: Hash> Hash for RcVec<T> {
266 fn hash<H: hash::Hasher>(&self, state: &mut H) {
267 (**self).hash(state);
268 }
269}
270
271#[rc_impl_gen_arc_impl]
272impl<T: PartialOrd> PartialOrd for RcVec<T> {
273 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
274 (**self).partial_cmp(other)
275 }
276}
277
278#[rc_impl_gen_arc_impl]
279impl<T: Ord> Ord for RcVec<T> {
280 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
281 (**self).cmp(other)
282 }
283}
284
285#[rc_impl_gen_arc_impl]
286impl<T, I: SliceIndex<[T]>> Index<I> for RcVec<T> {
287 type Output = I::Output;
288
289 fn index(&self, index: I) -> &Self::Output {
290 &(**self)[index]
291 }
292}
293
294#[rc_impl_gen_arc_impl]
295impl<T, I: SliceIndex<[T]>> IndexMut<I> for RcVec<T> {
296 fn index_mut(&mut self, index: I) -> &mut Self::Output {
297 &mut (**self)[index]
298 }
299}
300
301#[rc_impl_gen_arc_impl]
302impl<'a, T> IntoIterator for &'a RcVec<T> {
303 type Item = &'a T;
304 type IntoIter = <&'a [T] as IntoIterator>::IntoIter;
305
306 fn into_iter(self) -> Self::IntoIter {
307 (**self).iter()
308 }
309}
310
311#[rc_impl_gen_arc_impl]
312impl<'a, T> IntoIterator for &'a mut RcVec<T> {
313 type Item = &'a mut T;
314 type IntoIter = <&'a mut [T] as IntoIterator>::IntoIter;
315
316 fn into_iter(self) -> Self::IntoIter {
317 (**self).iter_mut()
318 }
319}
320
321#[rc_impl_gen_arc_impl]
322impl<T> IntoIterator for RcVec<T> {
323 type Item = T;
324 type IntoIter = into_iter::RcVecIntoIter<T>;
325
326 fn into_iter(self) -> Self::IntoIter {
327 let len = self.len();
328 into_iter::RcVecIntoIter::new(self.into_raw_vec(), len)
329 }
330}
331
332#[rc_impl_gen_arc_impl]
333impl<T, const N: usize> TryFrom<RcVec<T>> for [T; N] {
334 type Error = RcVec<T>;
335
336 fn try_from(mut vec: RcVec<T>) -> Result<Self, Self::Error> {
337 if vec.len() != N {
338 return Err(vec);
339 }
340
341 unsafe { vec.set_len(0); }
342
343 let ptr = vec.as_ptr().cast::<[T; N]>();
344 let arr = unsafe { ptr.read() };
345 Ok(arr)
346 }
347}
348
349#[rc_impl_gen_arc_impl]
350impl<T, const N: usize> TryFrom<RcVec<T>> for Rc<[T; N]> {
351 type Error = RcVec<T>;
352
353 fn try_from(vec: RcVec<T>) -> Result<Self, Self::Error> {
354 if vec.len() != N {
355 return Err(vec);
356 }
357
358 let slice = Rc::<[T]>::from(vec);
359 Ok(slice.try_into().ok().unwrap())
360 }
361}
362
363#[cfg(feature = "std")]
364#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
365impl std::io::Write for RcVec<u8> {
366 #[inline]
367 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
368 self.extend_from_slice(buf);
369 Ok(buf.len())
370 }
371
372 #[inline]
373 fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result<usize> {
374 let len = bufs.iter().map(|b| b.len()).sum();
375 self.reserve(len);
376 for buf in bufs {
377 self.extend_from_slice(buf);
378 }
379 Ok(len)
380 }
381
382 #[inline]
383 fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> {
384 self.extend_from_slice(buf);
385 Ok(())
386 }
387
388 #[inline]
389 fn flush(&mut self) -> std::io::Result<()> {
390 Ok(())
391 }
392}