1#![no_std]
101#![cfg_attr(docsrs, feature(doc_cfg))]
102#![cfg_attr(feature = "specialization", allow(incomplete_features))]
103#![cfg_attr(feature = "specialization", feature(specialization))]
104#![cfg_attr(feature = "may_dangle", feature(dropck_eyepatch))]
105#![deny(missing_docs)]
106
107#[doc(hidden)]
108pub extern crate alloc;
109
110#[cfg(any(test, feature = "write"))]
111extern crate std;
112
113#[cfg(test)]
114mod tests;
115
116#[cfg(feature = "drain_keep_rest")]
117use core::mem::ManuallyDrop;
118#[cfg(feature = "malloc_size_of")]
119use malloc_size_of::{MallocShallowSizeOf, MallocSizeOf, MallocSizeOfOps};
120#[cfg(feature = "serde")]
121use serde::{
122 de::{Deserialize, Deserializer, SeqAccess, Visitor},
123 ser::{Serialize, SerializeSeq, Serializer},
124};
125#[cfg(feature = "write")]
126use std::io;
127#[allow(deprecated)]
128use {
129 alloc::{
130 alloc::{Layout, LayoutErr},
131 boxed::Box,
132 vec,
133 vec::Vec,
134 },
135 core::{
136 borrow::{Borrow, BorrowMut},
137 cmp, fmt,
138 hash::{Hash, Hasher},
139 hint::unreachable_unchecked,
140 iter::{repeat, FromIterator, FusedIterator, IntoIterator},
141 marker::PhantomData,
142 mem::{self, MaybeUninit},
143 ops::{self, Range, RangeBounds},
144 ptr::{self, NonNull},
145 slice::{self, SliceIndex},
146 },
147};
148
149#[macro_export]
186macro_rules! smallvec {
187 (@one $x:expr) => (1usize);
189 () => (
190 $crate::SmallVec::new()
191 );
192 ($elem:expr; $n:expr) => ({
193 $crate::SmallVec::from_elem($elem, $n)
194 });
195 ($($x:expr),+$(,)?) => ({
196 let count = 0usize $(+ $crate::smallvec!(@one $x))+;
197 let mut vec = $crate::SmallVec::new();
198 if count <= vec.inline_size() {
199 $(vec.push($x);)*
200 vec
201 } else {
202 $crate::SmallVec::from_vec($crate::alloc::vec![$($x,)+])
203 }
204 });
205}
206
207#[cfg(feature = "const_new")]
240#[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
241#[macro_export]
242macro_rules! smallvec_inline {
243 (@one $x:expr) => (1usize);
245 ($elem:expr; $n:expr) => ({
246 $crate::SmallVec::<[_; $n]>::from_const([$elem; $n])
247 });
248 ($($x:expr),+ $(,)?) => ({
249 const N: usize = 0usize $(+ $crate::smallvec_inline!(@one $x))*;
250 $crate::SmallVec::<[_; N]>::from_const([$($x,)*])
251 });
252}
253
254#[cfg(not(feature = "union"))]
256macro_rules! debug_unreachable {
257 () => {
258 debug_unreachable!("entered unreachable code")
259 };
260 ($e:expr) => {
261 if cfg!(debug_assertions) {
262 panic!($e);
263 } else {
264 unreachable_unchecked();
265 }
266 };
267}
268
269#[doc(hidden)]
289#[deprecated]
290pub trait ExtendFromSlice<T> {
291 fn extend_from_slice(&mut self, other: &[T]);
293}
294
295#[allow(deprecated)]
296impl<T: Clone> ExtendFromSlice<T> for Vec<T> {
297 fn extend_from_slice(&mut self, other: &[T]) {
298 Vec::extend_from_slice(self, other)
299 }
300}
301
302#[derive(#[automatically_derived]
impl ::core::fmt::Debug for CollectionAllocErr {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::CapacityOverflow =>
::core::fmt::Formatter::write_str(f, "CapacityOverflow"),
Self::AllocErr { layout: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AllocErr", "layout", &__self_0),
}
}
}Debug)]
304pub enum CollectionAllocErr {
305 CapacityOverflow,
307 AllocErr {
309 layout: Layout,
311 },
312}
313
314impl fmt::Display for CollectionAllocErr {
315 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
316 f.write_fmt(format_args!("Allocation error: {0:?}", self))write!(f, "Allocation error: {:?}", self)
317 }
318}
319
320#[allow(deprecated)]
321impl From<LayoutErr> for CollectionAllocErr {
322 fn from(_: LayoutErr) -> Self {
323 CollectionAllocErr::CapacityOverflow
324 }
325}
326
327fn infallible<T>(result: Result<T, CollectionAllocErr>) -> T {
328 match result {
329 Ok(x) => x,
330 Err(CollectionAllocErr::CapacityOverflow) => ::core::panicking::panic("capacity overflow")panic!("capacity overflow"),
331 Err(CollectionAllocErr::AllocErr { layout }) => alloc::alloc::handle_alloc_error(layout),
332 }
333}
334
335fn layout_array<T>(n: usize) -> Result<Layout, CollectionAllocErr> {
338 let size = mem::size_of::<T>()
339 .checked_mul(n)
340 .ok_or(CollectionAllocErr::CapacityOverflow)?;
341 let align = mem::align_of::<T>();
342 Layout::from_size_align(size, align).map_err(|_| CollectionAllocErr::CapacityOverflow)
343}
344
345unsafe fn deallocate<T>(ptr: NonNull<T>, capacity: usize) {
346 let layout = layout_array::<T>(capacity).unwrap();
348 alloc::alloc::dealloc(ptr.as_ptr() as *mut u8, layout)
349}
350
351pub struct Drain<'a, T: 'a + Array> {
358 tail_start: usize,
359 tail_len: usize,
360 iter: slice::Iter<'a, T::Item>,
361 vec: NonNull<SmallVec<T>>,
362}
363
364impl<'a, T: 'a + Array> fmt::Debug for Drain<'a, T>
365where
366 T::Item: fmt::Debug,
367{
368 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
369 f.debug_tuple("Drain").field(&self.iter.as_slice()).finish()
370 }
371}
372
373unsafe impl<'a, T: Sync + Array> Sync for Drain<'a, T> {}
374unsafe impl<'a, T: Send + Array> Send for Drain<'a, T> {}
375
376impl<'a, T: 'a + Array> Iterator for Drain<'a, T> {
377 type Item = T::Item;
378
379 #[inline]
380 fn next(&mut self) -> Option<T::Item> {
381 self.iter
382 .next()
383 .map(|reference| unsafe { ptr::read(reference) })
384 }
385
386 #[inline]
387 fn size_hint(&self) -> (usize, Option<usize>) {
388 self.iter.size_hint()
389 }
390}
391
392impl<'a, T: 'a + Array> DoubleEndedIterator for Drain<'a, T> {
393 #[inline]
394 fn next_back(&mut self) -> Option<T::Item> {
395 self.iter
396 .next_back()
397 .map(|reference| unsafe { ptr::read(reference) })
398 }
399}
400
401impl<'a, T: Array> ExactSizeIterator for Drain<'a, T> {
402 #[inline]
403 fn len(&self) -> usize {
404 self.iter.len()
405 }
406}
407
408impl<'a, T: Array> FusedIterator for Drain<'a, T> {}
409
410impl<'a, T: 'a + Array> Drop for Drain<'a, T> {
411 fn drop(&mut self) {
412 self.for_each(drop);
413
414 if self.tail_len > 0 {
415 unsafe {
416 let source_vec = self.vec.as_mut();
417
418 let start = source_vec.len();
420 let tail = self.tail_start;
421 if tail != start {
422 let ptr = source_vec.as_mut_ptr();
426 let src = ptr.add(tail);
427 let dst = ptr.add(start);
428 ptr::copy(src, dst, self.tail_len);
429 }
430 source_vec.set_len(start + self.tail_len);
431 }
432 }
433 }
434}
435
436#[cfg(feature = "drain_filter")]
437pub struct DrainFilter<'a, T, F>
444where
445 F: FnMut(&mut T::Item) -> bool,
446 T: Array,
447{
448 vec: &'a mut SmallVec<T>,
449 idx: usize,
451 del: usize,
453 old_len: usize,
455 pred: F,
457 panic_flag: bool,
463}
464
465#[cfg(feature = "drain_filter")]
466impl<T, F> fmt::Debug for DrainFilter<'_, T, F>
467where
468 F: FnMut(&mut T::Item) -> bool,
469 T: Array,
470 T::Item: fmt::Debug,
471{
472 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
473 f.debug_tuple("DrainFilter")
474 .field(&self.vec.as_slice())
475 .finish()
476 }
477}
478
479#[cfg(feature = "drain_filter")]
480impl<T, F> Iterator for DrainFilter<'_, T, F>
481where
482 F: FnMut(&mut T::Item) -> bool,
483 T: Array,
484{
485 type Item = T::Item;
486
487 fn next(&mut self) -> Option<T::Item> {
488 unsafe {
489 while self.idx < self.old_len {
490 let i = self.idx;
491 let v = slice::from_raw_parts_mut(self.vec.as_mut_ptr(), self.old_len);
492 self.panic_flag = true;
493 let drained = (self.pred)(&mut v[i]);
494 self.panic_flag = false;
495 self.idx += 1;
500 if drained {
501 self.del += 1;
502 return Some(ptr::read(&v[i]));
503 } else if self.del > 0 {
504 let del = self.del;
505 let src: *const Self::Item = &v[i];
506 let dst: *mut Self::Item = &mut v[i - del];
507 ptr::copy_nonoverlapping(src, dst, 1);
508 }
509 }
510 None
511 }
512 }
513
514 fn size_hint(&self) -> (usize, Option<usize>) {
515 (0, Some(self.old_len - self.idx))
516 }
517}
518
519#[cfg(feature = "drain_filter")]
520impl<T, F> Drop for DrainFilter<'_, T, F>
521where
522 F: FnMut(&mut T::Item) -> bool,
523 T: Array,
524{
525 fn drop(&mut self) {
526 struct BackshiftOnDrop<'a, 'b, T, F>
527 where
528 F: FnMut(&mut T::Item) -> bool,
529 T: Array,
530 {
531 drain: &'b mut DrainFilter<'a, T, F>,
532 }
533
534 impl<'a, 'b, T, F> Drop for BackshiftOnDrop<'a, 'b, T, F>
535 where
536 F: FnMut(&mut T::Item) -> bool,
537 T: Array,
538 {
539 fn drop(&mut self) {
540 unsafe {
541 if self.drain.idx < self.drain.old_len && self.drain.del > 0 {
542 let ptr = self.drain.vec.as_mut_ptr();
552 let src = ptr.add(self.drain.idx);
553 let dst = src.sub(self.drain.del);
554 let tail_len = self.drain.old_len - self.drain.idx;
555 src.copy_to(dst, tail_len);
556 }
557 self.drain.vec.set_len(self.drain.old_len - self.drain.del);
558 }
559 }
560 }
561
562 let backshift = BackshiftOnDrop { drain: self };
563
564 if !backshift.drain.panic_flag {
568 backshift.drain.for_each(drop);
569 }
570 }
571}
572
573#[cfg(feature = "drain_keep_rest")]
574impl<T, F> DrainFilter<'_, T, F>
575where
576 F: FnMut(&mut T::Item) -> bool,
577 T: Array,
578{
579 pub fn keep_rest(self) {
599 let mut this = ManuallyDrop::new(self);
616
617 unsafe {
618 let needs_move = mem::size_of::<T::Item>() != 0;
620
621 if needs_move && this.idx < this.old_len && this.del > 0 {
622 let ptr = this.vec.as_mut_ptr();
623 let src = ptr.add(this.idx);
624 let dst = src.sub(this.del);
625 let tail_len = this.old_len - this.idx;
626 src.copy_to(dst, tail_len);
627 }
628
629 let new_len = this.old_len - this.del;
630 this.vec.set_len(new_len);
631 }
632 }
633}
634
635#[cfg(feature = "union")]
636union SmallVecData<A: Array> {
637 inline: core::mem::ManuallyDrop<MaybeUninit<A>>,
638 heap: (NonNull<A::Item>, usize),
639}
640
641#[cfg(all(feature = "union", feature = "const_new"))]
642impl<T, const N: usize> SmallVecData<[T; N]> {
643 #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
644 #[inline]
645 const fn from_const(inline: MaybeUninit<[T; N]>) -> Self {
646 SmallVecData {
647 inline: core::mem::ManuallyDrop::new(inline),
648 }
649 }
650}
651
652#[cfg(feature = "union")]
653impl<A: Array> SmallVecData<A> {
654 #[inline]
655 unsafe fn inline(&self) -> ConstNonNull<A::Item> {
656 ConstNonNull::new(self.inline.as_ptr() as *const A::Item).unwrap()
657 }
658 #[inline]
659 unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
660 NonNull::new(self.inline.as_mut_ptr() as *mut A::Item).unwrap()
661 }
662 #[inline]
663 fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
664 SmallVecData {
665 inline: core::mem::ManuallyDrop::new(inline),
666 }
667 }
668 #[inline]
678 fn empty() -> SmallVecData<A> {
679 SmallVecData {
683 inline: unsafe { MaybeUninit::uninit().assume_init() },
684 }
685 }
686 #[inline]
687 unsafe fn into_inline(self) -> MaybeUninit<A> {
688 core::mem::ManuallyDrop::into_inner(self.inline)
689 }
690 #[inline]
691 unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
692 (ConstNonNull(self.heap.0), self.heap.1)
693 }
694 #[inline]
695 unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
696 let h = &mut self.heap;
697 (h.0, &mut h.1)
698 }
699 #[inline]
700 fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
701 SmallVecData { heap: (ptr, len) }
702 }
703}
704
705#[cfg(not(feature = "union"))]
706enum SmallVecData<A: Array> {
707 Inline(MaybeUninit<A>),
708 Heap {
710 ptr: NonNull<A::Item>,
715 len: usize,
716 },
717}
718
719#[cfg(all(not(feature = "union"), feature = "const_new"))]
720impl<T, const N: usize> SmallVecData<[T; N]> {
721 #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
722 #[inline]
723 const fn from_const(inline: MaybeUninit<[T; N]>) -> Self {
724 SmallVecData::Inline(inline)
725 }
726}
727
728#[cfg(not(feature = "union"))]
729impl<A: Array> SmallVecData<A> {
730 #[inline]
731 unsafe fn inline(&self) -> ConstNonNull<A::Item> {
732 match self {
733 SmallVecData::Inline(a) => ConstNonNull::new(a.as_ptr() as *const A::Item).unwrap(),
734 _ => if true {
::core::panicking::panic("entered unreachable code");
} else { unreachable_unchecked(); }debug_unreachable!(),
735 }
736 }
737 #[inline]
738 unsafe fn inline_mut(&mut self) -> NonNull<A::Item> {
739 match self {
740 SmallVecData::Inline(a) => NonNull::new(a.as_mut_ptr() as *mut A::Item).unwrap(),
741 _ => if true {
::core::panicking::panic("entered unreachable code");
} else { unreachable_unchecked(); }debug_unreachable!(),
742 }
743 }
744 #[inline]
745 fn from_inline(inline: MaybeUninit<A>) -> SmallVecData<A> {
746 SmallVecData::Inline(inline)
747 }
748 #[inline]
750 fn empty() -> SmallVecData<A> {
751 SmallVecData::Inline(unsafe { MaybeUninit::uninit().assume_init() })
755 }
756 #[inline]
757 unsafe fn into_inline(self) -> MaybeUninit<A> {
758 match self {
759 SmallVecData::Inline(a) => a,
760 _ => if true {
::core::panicking::panic("entered unreachable code");
} else { unreachable_unchecked(); }debug_unreachable!(),
761 }
762 }
763 #[inline]
764 unsafe fn heap(&self) -> (ConstNonNull<A::Item>, usize) {
765 match self {
766 SmallVecData::Heap { ptr, len } => (ConstNonNull(*ptr), *len),
767 _ => if true {
::core::panicking::panic("entered unreachable code");
} else { unreachable_unchecked(); }debug_unreachable!(),
768 }
769 }
770 #[inline]
771 unsafe fn heap_mut(&mut self) -> (NonNull<A::Item>, &mut usize) {
772 match self {
773 SmallVecData::Heap { ptr, len } => (*ptr, len),
774 _ => if true {
::core::panicking::panic("entered unreachable code");
} else { unreachable_unchecked(); }debug_unreachable!(),
775 }
776 }
777 #[inline]
778 fn from_heap(ptr: NonNull<A::Item>, len: usize) -> SmallVecData<A> {
779 SmallVecData::Heap { ptr, len }
780 }
781}
782
783unsafe impl<A: Array + Send> Send for SmallVecData<A> {}
784unsafe impl<A: Array + Sync> Sync for SmallVecData<A> {}
785
786pub struct SmallVec<A: Array> {
834 capacity: usize,
840 data: SmallVecData<A>,
841 _marker: PhantomData<A::Item>,
844}
845
846impl<A: Array> SmallVec<A> {
847 #[inline]
849 pub fn new() -> SmallVec<A> {
850 if !(mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>() &&
mem::align_of::<A>() >= mem::align_of::<A::Item>()) {
::core::panicking::panic("assertion failed: mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>() &&\n mem::align_of::<A>() >= mem::align_of::<A::Item>()")
};assert!(
853 mem::size_of::<A>() == A::size() * mem::size_of::<A::Item>()
854 && mem::align_of::<A>() >= mem::align_of::<A::Item>()
855 );
856 SmallVec {
857 capacity: 0,
858 data: SmallVecData::empty(),
859 _marker: PhantomData,
860 }
861 }
862
863 #[inline]
878 pub fn with_capacity(n: usize) -> Self {
879 let mut v = SmallVec::new();
880 v.reserve_exact(n);
881 v
882 }
883
884 #[inline]
898 pub fn from_vec(mut vec: Vec<A::Item>) -> SmallVec<A> {
899 if vec.capacity() <= Self::inline_capacity() {
900 unsafe {
903 let mut data = SmallVecData::<A>::empty();
904 let len = vec.len();
905 vec.set_len(0);
906 ptr::copy_nonoverlapping(vec.as_ptr(), data.inline_mut().as_ptr(), len);
907
908 SmallVec {
909 capacity: len,
910 data,
911 _marker: PhantomData,
912 }
913 }
914 } else {
915 let (ptr, cap, len) = (vec.as_mut_ptr(), vec.capacity(), vec.len());
916 mem::forget(vec);
917 let ptr = NonNull::new(ptr)
918 .expect("Cannot be null by `Vec` invariant");
920
921 SmallVec {
922 capacity: cap,
923 data: SmallVecData::from_heap(ptr, len),
924 _marker: PhantomData,
925 }
926 }
927 }
928
929 #[inline]
941 pub fn from_buf(buf: A) -> SmallVec<A> {
942 SmallVec {
943 capacity: A::size(),
944 data: SmallVecData::from_inline(MaybeUninit::new(buf)),
945 _marker: PhantomData,
946 }
947 }
948
949 #[inline]
962 pub fn from_buf_and_len(buf: A, len: usize) -> SmallVec<A> {
963 if !(len <= A::size()) {
::core::panicking::panic("assertion failed: len <= A::size()")
};assert!(len <= A::size());
964 unsafe { SmallVec::from_buf_and_len_unchecked(MaybeUninit::new(buf), len) }
965 }
966
967 #[inline]
981 pub unsafe fn from_buf_and_len_unchecked(buf: MaybeUninit<A>, len: usize) -> SmallVec<A> {
982 SmallVec {
983 capacity: len,
984 data: SmallVecData::from_inline(buf),
985 _marker: PhantomData,
986 }
987 }
988
989 pub unsafe fn set_len(&mut self, new_len: usize) {
995 let (_, len_ptr, _) = self.triple_mut();
996 *len_ptr = new_len;
997 }
998
999 #[inline]
1001 fn inline_capacity() -> usize {
1002 if mem::size_of::<A::Item>() > 0 {
1003 A::size()
1004 } else {
1005 #[allow(deprecated)]
1018 core::usize::MAX
1019 }
1020 }
1021
1022 #[inline]
1024 pub fn inline_size(&self) -> usize {
1025 Self::inline_capacity()
1026 }
1027
1028 #[inline]
1030 pub fn len(&self) -> usize {
1031 self.triple().1
1032 }
1033
1034 #[inline]
1036 pub fn is_empty(&self) -> bool {
1037 self.len() == 0
1038 }
1039
1040 #[inline]
1042 pub fn capacity(&self) -> usize {
1043 self.triple().2
1044 }
1045
1046 #[inline]
1050 fn triple(&self) -> (ConstNonNull<A::Item>, usize, usize) {
1051 unsafe {
1052 if self.spilled() {
1053 let (ptr, len) = self.data.heap();
1054 (ptr, len, self.capacity)
1055 } else {
1056 (self.data.inline(), self.capacity, Self::inline_capacity())
1057 }
1058 }
1059 }
1060
1061 #[inline]
1063 fn triple_mut(&mut self) -> (NonNull<A::Item>, &mut usize, usize) {
1064 unsafe {
1065 if self.spilled() {
1066 let (ptr, len_ptr) = self.data.heap_mut();
1067 (ptr, len_ptr, self.capacity)
1068 } else {
1069 (
1070 self.data.inline_mut(),
1071 &mut self.capacity,
1072 Self::inline_capacity(),
1073 )
1074 }
1075 }
1076 }
1077
1078 #[inline]
1081 pub fn spilled(&self) -> bool {
1082 self.capacity > Self::inline_capacity()
1083 }
1084
1085 pub fn drain<R>(&mut self, range: R) -> Drain<'_, A>
1099 where
1100 R: RangeBounds<usize>,
1101 {
1102 use core::ops::Bound::*;
1103
1104 let len = self.len();
1105 let start = match range.start_bound() {
1106 Included(&n) => n,
1107 Excluded(&n) => n.checked_add(1).expect("Range start out of bounds"),
1108 Unbounded => 0,
1109 };
1110 let end = match range.end_bound() {
1111 Included(&n) => n.checked_add(1).expect("Range end out of bounds"),
1112 Excluded(&n) => n,
1113 Unbounded => len,
1114 };
1115
1116 if !(start <= end) {
::core::panicking::panic("assertion failed: start <= end")
};assert!(start <= end);
1117 if !(end <= len) { ::core::panicking::panic("assertion failed: end <= len") };assert!(end <= len);
1118
1119 unsafe {
1120 self.set_len(start);
1121
1122 let range_slice = slice::from_raw_parts(self.as_ptr().add(start), end - start);
1123
1124 Drain {
1125 tail_start: end,
1126 tail_len: len - end,
1127 iter: range_slice.iter(),
1128 vec: NonNull::new_unchecked(self as *mut _),
1131 }
1132 }
1133 }
1134
1135 #[cfg(feature = "drain_filter")]
1136 pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, A, F>
1193 where
1194 F: FnMut(&mut A::Item) -> bool,
1195 {
1196 let old_len = self.len();
1197
1198 unsafe {
1200 self.set_len(0);
1201 }
1202
1203 DrainFilter {
1204 vec: self,
1205 idx: 0,
1206 del: 0,
1207 old_len,
1208 pred: filter,
1209 panic_flag: false,
1210 }
1211 }
1212
1213 #[inline]
1215 pub fn push(&mut self, value: A::Item) {
1216 unsafe {
1217 if self.spilled() {
1218 let (mut ptr, mut len_ptr) = self.data.heap_mut();
1219 if *len_ptr == self.capacity {
1220 self.reserve_one_unchecked();
1221 let (heap_ptr, heap_len) = self.data.heap_mut();
1222 ptr = heap_ptr;
1223 len_ptr = heap_len;
1224 }
1225 ptr::write(ptr.as_ptr().add(*len_ptr), value);
1226 *len_ptr += 1;
1227 } else {
1228 let mut ptr = self.data.inline_mut();
1229 let mut len_ptr = &mut self.capacity;
1230 if *len_ptr == Self::inline_capacity() {
1231 self.reserve_one_unchecked();
1232 let (heap_ptr, heap_len) = self.data.heap_mut();
1233 ptr = heap_ptr;
1234 len_ptr = heap_len;
1235 }
1236 ptr::write(ptr.as_ptr().add(*len_ptr), value);
1237 *len_ptr += 1;
1238 };
1239 }
1240 }
1241
1242 #[inline]
1245 pub fn pop(&mut self) -> Option<A::Item> {
1246 unsafe {
1247 let (ptr, len_ptr, _) = self.triple_mut();
1248 let ptr: *const _ = ptr.as_ptr();
1249 if *len_ptr == 0 {
1250 return None;
1251 }
1252 let last_index = *len_ptr - 1;
1253 *len_ptr = last_index;
1254 Some(ptr::read(ptr.add(last_index)))
1255 }
1256 }
1257
1258 pub fn append<B>(&mut self, other: &mut SmallVec<B>)
1271 where
1272 B: Array<Item = A::Item>,
1273 {
1274 self.extend(other.drain(..))
1275 }
1276
1277 pub fn grow(&mut self, new_cap: usize) {
1282 infallible(self.try_grow(new_cap))
1283 }
1284
1285 pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr> {
1289 unsafe {
1290 let unspilled = !self.spilled();
1291 let (ptr, &mut len, cap) = self.triple_mut();
1292 if new_cap < len {
1293 return Ok(());
1294 }
1295 if new_cap <= Self::inline_capacity() {
1296 if unspilled {
1297 return Ok(());
1298 }
1299 self.data = SmallVecData::empty();
1300 ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1301 self.capacity = len;
1302 deallocate(ptr, cap);
1303 } else if new_cap != cap {
1304 let layout = layout_array::<A::Item>(new_cap)?;
1305 if true {
if !(layout.size() > 0) {
::core::panicking::panic("assertion failed: layout.size() > 0")
};
};debug_assert!(layout.size() > 0);
1306 let new_alloc;
1307 if unspilled {
1308 new_alloc = NonNull::new(alloc::alloc::alloc(layout))
1309 .ok_or(CollectionAllocErr::AllocErr { layout })?
1310 .cast();
1311 ptr::copy_nonoverlapping(ptr.as_ptr(), new_alloc.as_ptr(), len);
1312 } else {
1313 let old_layout = layout_array::<A::Item>(cap)?;
1316
1317 let new_ptr =
1318 alloc::alloc::realloc(ptr.as_ptr() as *mut u8, old_layout, layout.size());
1319 new_alloc = NonNull::new(new_ptr)
1320 .ok_or(CollectionAllocErr::AllocErr { layout })?
1321 .cast();
1322 }
1323 self.data = SmallVecData::from_heap(new_alloc, len);
1324 self.capacity = new_cap;
1325 }
1326 Ok(())
1327 }
1328 }
1329
1330 #[inline]
1336 pub fn reserve(&mut self, additional: usize) {
1337 infallible(self.try_reserve(additional))
1338 }
1339
1340 #[cold]
1343 fn reserve_one_unchecked(&mut self) {
1344 if true {
{
match (&self.len(), &self.capacity()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.len(), self.capacity());
1345 let new_cap = self
1346 .len()
1347 .checked_add(1)
1348 .and_then(usize::checked_next_power_of_two)
1349 .expect("capacity overflow");
1350 infallible(self.try_grow(new_cap))
1351 }
1352
1353 pub fn try_reserve(&mut self, additional: usize) -> Result<(), CollectionAllocErr> {
1357 let (_, &mut len, cap) = self.triple_mut();
1360 if cap - len >= additional {
1361 return Ok(());
1362 }
1363 let new_cap = len
1364 .checked_add(additional)
1365 .and_then(usize::checked_next_power_of_two)
1366 .ok_or(CollectionAllocErr::CapacityOverflow)?;
1367 self.try_grow(new_cap)
1368 }
1369
1370 pub fn reserve_exact(&mut self, additional: usize) {
1375 infallible(self.try_reserve_exact(additional))
1376 }
1377
1378 pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), CollectionAllocErr> {
1381 let (_, &mut len, cap) = self.triple_mut();
1382 if cap - len >= additional {
1383 return Ok(());
1384 }
1385 let new_cap = len
1386 .checked_add(additional)
1387 .ok_or(CollectionAllocErr::CapacityOverflow)?;
1388 self.try_grow(new_cap)
1389 }
1390
1391 pub fn shrink_to_fit(&mut self) {
1396 if !self.spilled() {
1397 return;
1398 }
1399 let len = self.len();
1400 if self.inline_size() >= len {
1401 unsafe {
1402 let (ptr, len) = self.data.heap();
1403 self.data = SmallVecData::empty();
1404 ptr::copy_nonoverlapping(ptr.as_ptr(), self.data.inline_mut().as_ptr(), len);
1405 deallocate(ptr.0, self.capacity);
1406 self.capacity = len;
1407 }
1408 } else if self.capacity() > len {
1409 self.grow(len);
1410 }
1411 }
1412
1413 pub fn truncate(&mut self, len: usize) {
1422 unsafe {
1423 let (ptr, len_ptr, _) = self.triple_mut();
1424 let ptr = ptr.as_ptr();
1425 while len < *len_ptr {
1426 let last_index = *len_ptr - 1;
1427 *len_ptr = last_index;
1428 ptr::drop_in_place(ptr.add(last_index));
1429 }
1430 }
1431 }
1432
1433 pub fn as_slice(&self) -> &[A::Item] {
1437 self
1438 }
1439
1440 pub fn as_mut_slice(&mut self) -> &mut [A::Item] {
1444 self
1445 }
1446
1447 #[inline]
1454 pub fn swap_remove(&mut self, index: usize) -> A::Item {
1455 let len = self.len();
1456 self.swap(len - 1, index);
1457 self.pop()
1458 .unwrap_or_else(|| unsafe { unreachable_unchecked() })
1459 }
1460
1461 #[inline]
1463 pub fn clear(&mut self) {
1464 self.truncate(0);
1465 }
1466
1467 pub fn remove(&mut self, index: usize) -> A::Item {
1472 unsafe {
1473 let (ptr, len_ptr, _) = self.triple_mut();
1474 let len = *len_ptr;
1475 if !(index < len) {
::core::panicking::panic("assertion failed: index < len")
};assert!(index < len);
1476 *len_ptr = len - 1;
1477 let ptr = ptr.as_ptr().add(index);
1478 let item = ptr::read(ptr);
1479 ptr::copy(ptr.add(1), ptr, len - index - 1);
1480 item
1481 }
1482 }
1483
1484 pub fn insert(&mut self, index: usize, element: A::Item) {
1489 unsafe {
1490 let (mut ptr, mut len_ptr, cap) = self.triple_mut();
1491 if *len_ptr == cap {
1492 self.reserve_one_unchecked();
1493 let (heap_ptr, heap_len_ptr) = self.data.heap_mut();
1494 ptr = heap_ptr;
1495 len_ptr = heap_len_ptr;
1496 }
1497 let mut ptr = ptr.as_ptr();
1498 let len = *len_ptr;
1499 if index > len {
1500 ::core::panicking::panic("index exceeds length");panic!("index exceeds length");
1501 }
1502 ptr = ptr.add(index);
1504 if index < len {
1505 ptr::copy(ptr, ptr.add(1), len - index);
1507 }
1508 *len_ptr = len + 1;
1509 ptr::write(ptr, element);
1510 }
1511 }
1512
1513 pub fn insert_many<I: IntoIterator<Item = A::Item>>(&mut self, index: usize, iterable: I) {
1516 let mut iter = iterable.into_iter();
1517 if index == self.len() {
1518 return self.extend(iter);
1519 }
1520
1521 let (lower_size_bound, _) = iter.size_hint();
1522 #[allow(deprecated)]
1523 {
1524 if !(lower_size_bound <= core::isize::MAX as usize) {
::core::panicking::panic("assertion failed: lower_size_bound <= core::isize::MAX as usize")
}assert!(lower_size_bound <= core::isize::MAX as usize)
1525 } if !(index + lower_size_bound >= index) {
::core::panicking::panic("assertion failed: index + lower_size_bound >= index")
};assert!(index + lower_size_bound >= index); let mut num_added = 0;
1529 let old_len = self.len();
1530 if !(index <= old_len) {
::core::panicking::panic("assertion failed: index <= old_len")
};assert!(index <= old_len);
1531
1532 unsafe {
1533 self.reserve(lower_size_bound);
1535 let start = self.as_mut_ptr();
1536 let ptr = start.add(index);
1537
1538 ptr::copy(ptr, ptr.add(lower_size_bound), old_len - index);
1540
1541 self.set_len(0);
1544 let mut guard = DropOnPanic {
1545 start,
1546 skip: index..(index + lower_size_bound),
1547 len: old_len + lower_size_bound,
1548 };
1549
1550 let start = self.as_mut_ptr();
1553 let ptr = start.add(index);
1554
1555 while num_added < lower_size_bound {
1556 let element = match iter.next() {
1557 Some(x) => x,
1558 None => break,
1559 };
1560 let cur = ptr.add(num_added);
1561 ptr::write(cur, element);
1562 guard.skip.start += 1;
1563 num_added += 1;
1564 }
1565
1566 if num_added < lower_size_bound {
1567 ptr::copy(
1570 ptr.add(lower_size_bound),
1571 ptr.add(num_added),
1572 old_len - index,
1573 );
1574 }
1575 self.set_len(old_len + num_added);
1578 mem::forget(guard);
1579 }
1580
1581 for element in iter {
1583 self.insert(index + num_added, element);
1584 num_added += 1;
1585 }
1586
1587 struct DropOnPanic<T> {
1588 start: *mut T,
1589 skip: Range<usize>, len: usize,
1591 }
1592
1593 impl<T> Drop for DropOnPanic<T> {
1594 fn drop(&mut self) {
1595 for i in 0..self.len {
1596 if !self.skip.contains(&i) {
1597 unsafe {
1598 ptr::drop_in_place(self.start.add(i));
1599 }
1600 }
1601 }
1602 }
1603 }
1604 }
1605
1606 pub fn into_vec(mut self) -> Vec<A::Item> {
1609 if self.spilled() {
1610 unsafe {
1611 let (ptr, &mut len) = self.data.heap_mut();
1612 let v = Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity);
1613 mem::forget(self);
1614 v
1615 }
1616 } else {
1617 self.into_iter().collect()
1618 }
1619 }
1620
1621 pub fn into_boxed_slice(self) -> Box<[A::Item]> {
1626 self.into_vec().into_boxed_slice()
1627 }
1628
1629 pub fn into_inner(self) -> Result<A, Self> {
1636 if self.spilled() || self.len() != A::size() {
1637 Err(self)
1639 } else {
1640 unsafe {
1641 let data = ptr::read(&self.data);
1642 mem::forget(self);
1643 Ok(data.into_inline().assume_init())
1644 }
1645 }
1646 }
1647
1648 pub fn retain<F: FnMut(&mut A::Item) -> bool>(&mut self, mut f: F) {
1654 let original_len = self.len();
1655
1656 if original_len == 0 {
1657 return;
1660 }
1661
1662 struct PanicGuard<'a, A: Array> {
1674 v: &'a mut SmallVec<A>,
1675 read: usize,
1676 write: usize,
1677 original_len: usize,
1678 }
1679
1680 impl<A: Array> Drop for PanicGuard<'_, A> {
1681 #[cold]
1682 fn drop(&mut self) {
1683 let remaining = self.original_len - self.read;
1684 unsafe {
1687 let ptr = self.v.as_mut_ptr();
1688 ptr::copy(ptr.add(self.read), ptr.add(self.write), remaining);
1689 }
1690 unsafe {
1693 self.v.set_len(self.write + remaining);
1694 }
1695 }
1696 }
1697
1698 let mut read = 0;
1699 loop {
1700 let cur = unsafe { self.get_unchecked_mut(read) };
1702 if !f(cur) {
1703 break;
1704 }
1705 read += 1;
1706 if read == original_len {
1707 return;
1709 }
1710 }
1711
1712 let mut g = PanicGuard {
1716 v: self,
1717 read: read + 1,
1718 write: read,
1719 original_len,
1720 };
1721 unsafe { ptr::drop_in_place(g.v.as_mut_ptr().add(read)) }
1723
1724 let ptr = g.v.as_mut_ptr();
1725 while g.read < g.original_len {
1726 let cur = unsafe { &mut *ptr.add(g.read) };
1728 if !f(cur) {
1729 g.read += 1;
1732 unsafe { ptr::drop_in_place(cur) };
1734 } else {
1735 unsafe {
1739 let hole = ptr.add(g.write);
1740 ptr::copy_nonoverlapping(cur, hole, 1);
1741 }
1742 g.write += 1;
1743 g.read += 1;
1744 }
1745 }
1746
1747 unsafe { g.v.set_len(g.write) };
1751 core::mem::forget(g);
1752 }
1753
1754 pub fn retain_mut<F: FnMut(&mut A::Item) -> bool>(&mut self, f: F) {
1760 self.retain(f)
1761 }
1762
1763 pub fn dedup(&mut self)
1765 where
1766 A::Item: PartialEq<A::Item>,
1767 {
1768 self.dedup_by(|a, b| a == b);
1769 }
1770
1771 pub fn dedup_by<F>(&mut self, mut same_bucket: F)
1774 where
1775 F: FnMut(&mut A::Item, &mut A::Item) -> bool,
1776 {
1777 let len = self.len();
1780 if len <= 1 {
1781 return;
1782 }
1783
1784 let ptr = self.as_mut_ptr();
1785 let mut w: usize = 1;
1786
1787 unsafe {
1788 for r in 1..len {
1789 let p_r = ptr.add(r);
1790 let p_wm1 = ptr.add(w - 1);
1791 if !same_bucket(&mut *p_r, &mut *p_wm1) {
1792 if r != w {
1793 let p_w = p_wm1.add(1);
1794 mem::swap(&mut *p_r, &mut *p_w);
1795 }
1796 w += 1;
1797 }
1798 }
1799 }
1800
1801 self.truncate(w);
1802 }
1803
1804 pub fn dedup_by_key<F, K>(&mut self, mut key: F)
1806 where
1807 F: FnMut(&mut A::Item) -> K,
1808 K: PartialEq<K>,
1809 {
1810 self.dedup_by(|a, b| key(a) == key(b));
1811 }
1812
1813 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
1844 where
1845 F: FnMut() -> A::Item,
1846 {
1847 let old_len = self.len();
1848 if old_len < new_len {
1849 let mut f = f;
1850 let additional = new_len - old_len;
1851 self.reserve(additional);
1852 for _ in 0..additional {
1853 self.push(f());
1854 }
1855 } else if old_len > new_len {
1856 self.truncate(new_len);
1857 }
1858 }
1859
1860 #[inline]
1928 pub unsafe fn from_raw_parts(ptr: *mut A::Item, length: usize, capacity: usize) -> SmallVec<A> {
1929 let ptr = unsafe {
1932 if true {
if !!ptr.is_null() {
::core::panicking::panic("Called `from_raw_parts` with null pointer.")
};
};debug_assert!(!ptr.is_null(), "Called `from_raw_parts` with null pointer.");
1933 NonNull::new_unchecked(ptr)
1934 };
1935 if !(capacity > Self::inline_capacity()) {
::core::panicking::panic("assertion failed: capacity > Self::inline_capacity()")
};assert!(capacity > Self::inline_capacity());
1936 SmallVec {
1937 capacity,
1938 data: SmallVecData::from_heap(ptr, length),
1939 _marker: PhantomData,
1940 }
1941 }
1942
1943 pub fn as_ptr(&self) -> *const A::Item {
1945 self.triple().0.as_ptr()
1949 }
1950
1951 pub fn as_mut_ptr(&mut self) -> *mut A::Item {
1953 self.triple_mut().0.as_ptr()
1957 }
1958}
1959
1960impl<A: Array> SmallVec<A>
1961where
1962 A::Item: Copy,
1963{
1964 pub fn from_slice(slice: &[A::Item]) -> Self {
1969 let len = slice.len();
1970 if len <= Self::inline_capacity() {
1971 SmallVec {
1972 capacity: len,
1973 data: SmallVecData::from_inline(unsafe {
1974 let mut data: MaybeUninit<A> = MaybeUninit::uninit();
1975 ptr::copy_nonoverlapping(
1976 slice.as_ptr(),
1977 data.as_mut_ptr() as *mut A::Item,
1978 len,
1979 );
1980 data
1981 }),
1982 _marker: PhantomData,
1983 }
1984 } else {
1985 let mut b = slice.to_vec();
1986 let cap = b.capacity();
1987 let ptr = NonNull::new(b.as_mut_ptr()).expect("Vec always contain non null pointers.");
1988 mem::forget(b);
1989 SmallVec {
1990 capacity: cap,
1991 data: SmallVecData::from_heap(ptr, len),
1992 _marker: PhantomData,
1993 }
1994 }
1995 }
1996
1997 #[inline]
2002 pub fn insert_from_slice(&mut self, index: usize, slice: &[A::Item]) {
2003 self.reserve(slice.len());
2004
2005 let len = self.len();
2006 if !(index <= len) {
::core::panicking::panic("assertion failed: index <= len")
};assert!(index <= len);
2007
2008 unsafe {
2009 let slice_ptr = slice.as_ptr();
2010 let ptr = self.as_mut_ptr().add(index);
2011 ptr::copy(ptr, ptr.add(slice.len()), len - index);
2012 ptr::copy_nonoverlapping(slice_ptr, ptr, slice.len());
2013 self.set_len(len + slice.len());
2014 }
2015 }
2016
2017 #[inline]
2021 pub fn extend_from_slice(&mut self, slice: &[A::Item]) {
2022 let len = self.len();
2023 self.insert_from_slice(len, slice);
2024 }
2025}
2026
2027impl<A: Array> SmallVec<A>
2028where
2029 A::Item: Clone,
2030{
2031 pub fn resize(&mut self, len: usize, value: A::Item) {
2038 let old_len = self.len();
2039
2040 if len > old_len {
2041 self.extend(repeat(value).take(len - old_len));
2042 } else {
2043 self.truncate(len);
2044 }
2045 }
2046
2047 pub fn from_elem(elem: A::Item, n: usize) -> Self {
2055 if n > Self::inline_capacity() {
2056 ::alloc::vec::from_elem(elem, n)vec![elem; n].into()
2057 } else {
2058 let mut v = SmallVec::<A>::new();
2059 unsafe {
2060 let (ptr, len_ptr, _) = v.triple_mut();
2061 let ptr = ptr.as_ptr();
2062 let mut local_len = SetLenOnDrop::new(len_ptr);
2063
2064 for i in 0..n {
2065 ::core::ptr::write(ptr.add(i), elem.clone());
2066 local_len.increment_len(1);
2067 }
2068 }
2069 v
2070 }
2071 }
2072}
2073
2074impl<A: Array> ops::Deref for SmallVec<A> {
2075 type Target = [A::Item];
2076 #[inline]
2077 fn deref(&self) -> &[A::Item] {
2078 unsafe {
2079 let (ptr, len, _) = self.triple();
2080 slice::from_raw_parts(ptr.as_ptr(), len)
2081 }
2082 }
2083}
2084
2085impl<A: Array> ops::DerefMut for SmallVec<A> {
2086 #[inline]
2087 fn deref_mut(&mut self) -> &mut [A::Item] {
2088 unsafe {
2089 let (ptr, &mut len, _) = self.triple_mut();
2090 slice::from_raw_parts_mut(ptr.as_ptr(), len)
2091 }
2092 }
2093}
2094
2095impl<A: Array> AsRef<[A::Item]> for SmallVec<A> {
2096 #[inline]
2097 fn as_ref(&self) -> &[A::Item] {
2098 self
2099 }
2100}
2101
2102impl<A: Array> AsMut<[A::Item]> for SmallVec<A> {
2103 #[inline]
2104 fn as_mut(&mut self) -> &mut [A::Item] {
2105 self
2106 }
2107}
2108
2109impl<A: Array> Borrow<[A::Item]> for SmallVec<A> {
2110 #[inline]
2111 fn borrow(&self) -> &[A::Item] {
2112 self
2113 }
2114}
2115
2116impl<A: Array> BorrowMut<[A::Item]> for SmallVec<A> {
2117 #[inline]
2118 fn borrow_mut(&mut self) -> &mut [A::Item] {
2119 self
2120 }
2121}
2122
2123#[cfg(feature = "write")]
2124#[cfg_attr(docsrs, doc(cfg(feature = "write")))]
2125impl<A: Array<Item = u8>> io::Write for SmallVec<A> {
2126 #[inline]
2127 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
2128 self.extend_from_slice(buf);
2129 Ok(buf.len())
2130 }
2131
2132 #[inline]
2133 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
2134 self.extend_from_slice(buf);
2135 Ok(())
2136 }
2137
2138 #[inline]
2139 fn flush(&mut self) -> io::Result<()> {
2140 Ok(())
2141 }
2142}
2143
2144#[cfg(feature = "serde")]
2145#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2146impl<A: Array> Serialize for SmallVec<A>
2147where
2148 A::Item: Serialize,
2149{
2150 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
2151 let mut state = serializer.serialize_seq(Some(self.len()))?;
2152 for item in self {
2153 state.serialize_element(&item)?;
2154 }
2155 state.end()
2156 }
2157}
2158
2159#[cfg(feature = "serde")]
2160#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2161impl<'de, A: Array> Deserialize<'de> for SmallVec<A>
2162where
2163 A::Item: Deserialize<'de>,
2164{
2165 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2166 deserializer.deserialize_seq(SmallVecVisitor {
2167 phantom: PhantomData,
2168 })
2169 }
2170}
2171
2172#[cfg(feature = "serde")]
2173struct SmallVecVisitor<A> {
2174 phantom: PhantomData<A>,
2175}
2176
2177#[cfg(feature = "serde")]
2178impl<'de, A: Array> Visitor<'de> for SmallVecVisitor<A>
2179where
2180 A::Item: Deserialize<'de>,
2181{
2182 type Value = SmallVec<A>;
2183
2184 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
2185 formatter.write_str("a sequence")
2186 }
2187
2188 fn visit_seq<B>(self, mut seq: B) -> Result<Self::Value, B::Error>
2189 where
2190 B: SeqAccess<'de>,
2191 {
2192 use serde::de::Error;
2193 let len = seq.size_hint().unwrap_or(0);
2194 let mut values = SmallVec::new();
2195 values.try_reserve(len).map_err(B::Error::custom)?;
2196
2197 while let Some(value) = seq.next_element()? {
2198 values.push(value);
2199 }
2200
2201 Ok(values)
2202 }
2203}
2204
2205#[cfg(feature = "malloc_size_of")]
2206impl<A: Array> MallocShallowSizeOf for SmallVec<A> {
2207 fn shallow_size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
2208 if self.spilled() {
2209 unsafe { ops.malloc_size_of(self.as_ptr()) }
2210 } else {
2211 0
2212 }
2213 }
2214}
2215
2216#[cfg(feature = "malloc_size_of")]
2217impl<A> MallocSizeOf for SmallVec<A>
2218where
2219 A: Array,
2220 A::Item: MallocSizeOf,
2221{
2222 fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
2223 let mut n = self.shallow_size_of(ops);
2224 for elem in self.iter() {
2225 n += elem.size_of(ops);
2226 }
2227 n
2228 }
2229}
2230
2231#[cfg(feature = "specialization")]
2232trait SpecFrom<A: Array, S> {
2233 fn spec_from(slice: S) -> SmallVec<A>;
2234}
2235
2236#[cfg(feature = "specialization")]
2237mod specialization;
2238
2239#[cfg(feature = "arbitrary")]
2240mod arbitrary;
2241
2242#[cfg(feature = "specialization")]
2243impl<'a, A: Array> SpecFrom<A, &'a [A::Item]> for SmallVec<A>
2244where
2245 A::Item: Copy,
2246{
2247 #[inline]
2248 fn spec_from(slice: &'a [A::Item]) -> SmallVec<A> {
2249 SmallVec::from_slice(slice)
2250 }
2251}
2252
2253impl<'a, A: Array> From<&'a [A::Item]> for SmallVec<A>
2254where
2255 A::Item: Clone,
2256{
2257 #[cfg(not(feature = "specialization"))]
2258 #[inline]
2259 fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2260 slice.iter().cloned().collect()
2261 }
2262
2263 #[cfg(feature = "specialization")]
2264 #[inline]
2265 fn from(slice: &'a [A::Item]) -> SmallVec<A> {
2266 SmallVec::spec_from(slice)
2267 }
2268}
2269
2270impl<A: Array> From<Vec<A::Item>> for SmallVec<A> {
2271 #[inline]
2272 fn from(vec: Vec<A::Item>) -> SmallVec<A> {
2273 SmallVec::from_vec(vec)
2274 }
2275}
2276
2277impl<A: Array> From<A> for SmallVec<A> {
2278 #[inline]
2279 fn from(array: A) -> SmallVec<A> {
2280 SmallVec::from_buf(array)
2281 }
2282}
2283
2284impl<A: Array, I: SliceIndex<[A::Item]>> ops::Index<I> for SmallVec<A> {
2285 type Output = I::Output;
2286
2287 fn index(&self, index: I) -> &I::Output {
2288 &(**self)[index]
2289 }
2290}
2291
2292impl<A: Array, I: SliceIndex<[A::Item]>> ops::IndexMut<I> for SmallVec<A> {
2293 fn index_mut(&mut self, index: I) -> &mut I::Output {
2294 &mut (&mut **self)[index]
2295 }
2296}
2297
2298#[allow(deprecated)]
2299impl<A: Array> ExtendFromSlice<A::Item> for SmallVec<A>
2300where
2301 A::Item: Copy,
2302{
2303 fn extend_from_slice(&mut self, other: &[A::Item]) {
2304 SmallVec::extend_from_slice(self, other)
2305 }
2306}
2307
2308impl<A: Array> FromIterator<A::Item> for SmallVec<A> {
2309 #[inline]
2310 fn from_iter<I: IntoIterator<Item = A::Item>>(iterable: I) -> SmallVec<A> {
2311 let mut v = SmallVec::new();
2312 v.extend(iterable);
2313 v
2314 }
2315}
2316
2317impl<A: Array> Extend<A::Item> for SmallVec<A> {
2318 fn extend<I: IntoIterator<Item = A::Item>>(&mut self, iterable: I) {
2319 let mut iter = iterable.into_iter();
2320 let (lower_size_bound, _) = iter.size_hint();
2321 self.reserve(lower_size_bound);
2322
2323 unsafe {
2324 let (ptr, len_ptr, cap) = self.triple_mut();
2325 let ptr = ptr.as_ptr();
2326 let mut len = SetLenOnDrop::new(len_ptr);
2327 while len.get() < cap {
2328 if let Some(out) = iter.next() {
2329 ptr::write(ptr.add(len.get()), out);
2330 len.increment_len(1);
2331 } else {
2332 return;
2333 }
2334 }
2335 }
2336
2337 for elem in iter {
2338 self.push(elem);
2339 }
2340 }
2341}
2342
2343impl<A: Array> fmt::Debug for SmallVec<A>
2344where
2345 A::Item: fmt::Debug,
2346{
2347 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2348 f.debug_list().entries(self.iter()).finish()
2349 }
2350}
2351
2352impl<A: Array> Default for SmallVec<A> {
2353 #[inline]
2354 fn default() -> SmallVec<A> {
2355 SmallVec::new()
2356 }
2357}
2358
2359#[cfg(feature = "may_dangle")]
2360unsafe impl<#[may_dangle] A: Array> Drop for SmallVec<A> {
2361 fn drop(&mut self) {
2362 unsafe {
2363 if self.spilled() {
2364 let (ptr, &mut len) = self.data.heap_mut();
2365 Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity);
2366 } else {
2367 ptr::drop_in_place(&mut self[..]);
2368 }
2369 }
2370 }
2371}
2372
2373#[cfg(not(feature = "may_dangle"))]
2374impl<A: Array> Drop for SmallVec<A> {
2375 fn drop(&mut self) {
2376 unsafe {
2377 if self.spilled() {
2378 let (ptr, &mut len) = self.data.heap_mut();
2379 drop(Vec::from_raw_parts(ptr.as_ptr(), len, self.capacity));
2380 } else {
2381 ptr::drop_in_place(&mut self[..]);
2382 }
2383 }
2384 }
2385}
2386
2387impl<A: Array> Clone for SmallVec<A>
2388where
2389 A::Item: Clone,
2390{
2391 #[inline]
2392 fn clone(&self) -> SmallVec<A> {
2393 SmallVec::from(self.as_slice())
2394 }
2395
2396 fn clone_from(&mut self, source: &Self) {
2397 self.truncate(source.len());
2401
2402 let (init, tail) = source.split_at(self.len());
2405
2406 self.clone_from_slice(init);
2408 self.extend(tail.iter().cloned());
2409 }
2410}
2411
2412impl<A: Array, B: Array> PartialEq<SmallVec<B>> for SmallVec<A>
2413where
2414 A::Item: PartialEq<B::Item>,
2415{
2416 #[inline]
2417 fn eq(&self, other: &SmallVec<B>) -> bool {
2418 self[..] == other[..]
2419 }
2420}
2421
2422impl<A: Array> Eq for SmallVec<A> where A::Item: Eq {}
2423
2424impl<A: Array> PartialOrd for SmallVec<A>
2425where
2426 A::Item: PartialOrd,
2427{
2428 #[inline]
2429 fn partial_cmp(&self, other: &SmallVec<A>) -> Option<cmp::Ordering> {
2430 PartialOrd::partial_cmp(&**self, &**other)
2431 }
2432}
2433
2434impl<A: Array> Ord for SmallVec<A>
2435where
2436 A::Item: Ord,
2437{
2438 #[inline]
2439 fn cmp(&self, other: &SmallVec<A>) -> cmp::Ordering {
2440 Ord::cmp(&**self, &**other)
2441 }
2442}
2443
2444impl<A: Array> Hash for SmallVec<A>
2445where
2446 A::Item: Hash,
2447{
2448 fn hash<H: Hasher>(&self, state: &mut H) {
2449 (**self).hash(state)
2450 }
2451}
2452
2453unsafe impl<A: Array> Send for SmallVec<A> where A::Item: Send {}
2454
2455pub struct IntoIter<A: Array> {
2461 data: SmallVec<A>,
2462 current: usize,
2463 end: usize,
2464}
2465
2466impl<A: Array> fmt::Debug for IntoIter<A>
2467where
2468 A::Item: fmt::Debug,
2469{
2470 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2471 f.debug_tuple("IntoIter").field(&self.as_slice()).finish()
2472 }
2473}
2474
2475impl<A: Array + Clone> Clone for IntoIter<A>
2476where
2477 A::Item: Clone,
2478{
2479 fn clone(&self) -> IntoIter<A> {
2480 SmallVec::from(self.as_slice()).into_iter()
2481 }
2482}
2483
2484impl<A: Array> Drop for IntoIter<A> {
2485 fn drop(&mut self) {
2486 for _ in self {}
2487 }
2488}
2489
2490impl<A: Array> Iterator for IntoIter<A> {
2491 type Item = A::Item;
2492
2493 #[inline]
2494 fn next(&mut self) -> Option<A::Item> {
2495 if self.current == self.end {
2496 None
2497 } else {
2498 unsafe {
2499 let current = self.current;
2500 self.current += 1;
2501 Some(ptr::read(self.data.as_ptr().add(current)))
2502 }
2503 }
2504 }
2505
2506 #[inline]
2507 fn size_hint(&self) -> (usize, Option<usize>) {
2508 let size = self.end - self.current;
2509 (size, Some(size))
2510 }
2511}
2512
2513impl<A: Array> DoubleEndedIterator for IntoIter<A> {
2514 #[inline]
2515 fn next_back(&mut self) -> Option<A::Item> {
2516 if self.current == self.end {
2517 None
2518 } else {
2519 unsafe {
2520 self.end -= 1;
2521 Some(ptr::read(self.data.as_ptr().add(self.end)))
2522 }
2523 }
2524 }
2525}
2526
2527impl<A: Array> ExactSizeIterator for IntoIter<A> {}
2528impl<A: Array> FusedIterator for IntoIter<A> {}
2529
2530impl<A: Array> IntoIter<A> {
2531 pub fn as_slice(&self) -> &[A::Item] {
2533 let len = self.end - self.current;
2534 unsafe { core::slice::from_raw_parts(self.data.as_ptr().add(self.current), len) }
2535 }
2536
2537 pub fn as_mut_slice(&mut self) -> &mut [A::Item] {
2539 let len = self.end - self.current;
2540 unsafe { core::slice::from_raw_parts_mut(self.data.as_mut_ptr().add(self.current), len) }
2541 }
2542}
2543
2544impl<A: Array> IntoIterator for SmallVec<A> {
2545 type IntoIter = IntoIter<A>;
2546 type Item = A::Item;
2547 fn into_iter(mut self) -> Self::IntoIter {
2548 unsafe {
2549 let len = self.len();
2552 self.set_len(0);
2553 IntoIter {
2554 data: self,
2555 current: 0,
2556 end: len,
2557 }
2558 }
2559 }
2560}
2561
2562impl<'a, A: Array> IntoIterator for &'a SmallVec<A> {
2563 type IntoIter = slice::Iter<'a, A::Item>;
2564 type Item = &'a A::Item;
2565 fn into_iter(self) -> Self::IntoIter {
2566 self.iter()
2567 }
2568}
2569
2570impl<'a, A: Array> IntoIterator for &'a mut SmallVec<A> {
2571 type IntoIter = slice::IterMut<'a, A::Item>;
2572 type Item = &'a mut A::Item;
2573 fn into_iter(self) -> Self::IntoIter {
2574 self.iter_mut()
2575 }
2576}
2577
2578pub unsafe trait Array {
2580 type Item;
2582 fn size() -> usize;
2584}
2585
2586struct SetLenOnDrop<'a> {
2590 len: &'a mut usize,
2591 local_len: usize,
2592}
2593
2594impl<'a> SetLenOnDrop<'a> {
2595 #[inline]
2596 fn new(len: &'a mut usize) -> Self {
2597 SetLenOnDrop {
2598 local_len: *len,
2599 len,
2600 }
2601 }
2602
2603 #[inline]
2604 fn get(&self) -> usize {
2605 self.local_len
2606 }
2607
2608 #[inline]
2609 fn increment_len(&mut self, increment: usize) {
2610 self.local_len += increment;
2611 }
2612}
2613
2614impl<'a> Drop for SetLenOnDrop<'a> {
2615 #[inline]
2616 fn drop(&mut self) {
2617 *self.len = self.local_len;
2618 }
2619}
2620
2621#[cfg(feature = "const_new")]
2622impl<T, const N: usize> SmallVec<[T; N]> {
2623 #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2628 #[inline]
2629 pub const fn new_const() -> Self {
2630 SmallVec {
2631 capacity: 0,
2632 data: SmallVecData::from_const(MaybeUninit::uninit()),
2633 _marker: PhantomData,
2634 }
2635 }
2636
2637 #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2644 #[inline]
2645 pub const fn from_const(items: [T; N]) -> Self {
2646 SmallVec {
2647 capacity: N,
2648 data: SmallVecData::from_const(MaybeUninit::new(items)),
2649 _marker: PhantomData,
2650 }
2651 }
2652
2653 #[cfg_attr(docsrs, doc(cfg(feature = "const_new")))]
2661 #[inline]
2662 pub const unsafe fn from_const_with_len_unchecked(items: [T; N], len: usize) -> Self {
2663 SmallVec {
2664 capacity: len,
2665 data: SmallVecData::from_const(MaybeUninit::new(items)),
2666 _marker: PhantomData,
2667 }
2668 }
2669}
2670
2671#[cfg(feature = "const_generics")]
2672#[cfg_attr(docsrs, doc(cfg(feature = "const_generics")))]
2673unsafe impl<T, const N: usize> Array for [T; N] {
2674 type Item = T;
2675 #[inline]
2676 fn size() -> usize {
2677 N
2678 }
2679}
2680
2681#[cfg(not(feature = "const_generics"))]
2682macro_rules! impl_array(
2683 ($($size:expr),+) => {
2684 $(
2685 unsafe impl<T> Array for [T; $size] {
2686 type Item = T;
2687 #[inline]
2688 fn size() -> usize { $size }
2689 }
2690 )+
2691 }
2692);
2693
2694#[cfg(not(feature = "const_generics"))]
2695impl_array!(
2696 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2697 26, 27, 28, 29, 30, 31, 32, 36, 0x40, 0x60, 0x80, 0x100, 0x200, 0x400, 0x600, 0x800, 0x1000,
2698 0x2000, 0x4000, 0x6000, 0x8000, 0x10000, 0x20000, 0x40000, 0x60000, 0x80000, 0x10_0000
2699);
2700
2701pub trait ToSmallVec<A: Array> {
2703 fn to_smallvec(&self) -> SmallVec<A>;
2705}
2706
2707impl<A: Array> ToSmallVec<A> for [A::Item]
2708where
2709 A::Item: Copy,
2710{
2711 #[inline]
2712 fn to_smallvec(&self) -> SmallVec<A> {
2713 SmallVec::from_slice(self)
2714 }
2715}
2716
2717#[repr(transparent)]
2719struct ConstNonNull<T>(NonNull<T>);
2720
2721impl<T> ConstNonNull<T> {
2722 #[inline]
2723 fn new(ptr: *const T) -> Option<Self> {
2724 NonNull::new(ptr as *mut T).map(Self)
2725 }
2726 #[inline]
2727 fn as_ptr(self) -> *const T {
2728 self.0.as_ptr()
2729 }
2730}
2731
2732impl<T> Clone for ConstNonNull<T> {
2733 #[inline]
2734 fn clone(&self) -> Self {
2735 *self
2736 }
2737}
2738
2739impl<T> Copy for ConstNonNull<T> {}
2740
2741#[cfg(feature = "impl_bincode")]
2742use bincode::{
2743 de::{read::Reader, BorrowDecoder, Decode, Decoder},
2744 enc::{write::Writer, Encode, Encoder},
2745 error::{DecodeError, EncodeError},
2746 BorrowDecode,
2747};
2748
2749#[cfg(feature = "impl_bincode")]
2750impl<A, Context> Decode<Context> for SmallVec<A>
2751where
2752 A: Array,
2753 A::Item: Decode<Context>,
2754{
2755 fn decode<D: Decoder<Context = Context>>(decoder: &mut D) -> Result<Self, DecodeError> {
2756 use core::convert::TryInto;
2757 let len = u64::decode(decoder)?;
2758 let len = len
2759 .try_into()
2760 .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
2761 decoder.claim_container_read::<A::Item>(len)?;
2762
2763 let mut vec = SmallVec::with_capacity(len);
2764 if unty::type_equal::<A::Item, u8>() {
2765 let ptr = vec.as_mut_ptr();
2769 unsafe {
2772 core::ptr::write_bytes(ptr, 0, len);
2773 vec.set_len(len);
2774 }
2775 let slice = vec.as_mut_slice();
2777 let slice = unsafe { core::mem::transmute::<&mut [A::Item], &mut [u8]>(slice) };
2779 decoder.reader().read(slice)?;
2780 } else {
2781 for _ in 0..len {
2782 decoder.unclaim_bytes_read(core::mem::size_of::<A::Item>());
2783 vec.push(A::Item::decode(decoder)?);
2784 }
2785 }
2786 Ok(vec)
2787 }
2788}
2789
2790#[cfg(feature = "impl_bincode")]
2791impl<'de, A, Context> BorrowDecode<'de, Context> for SmallVec<A>
2792where
2793 A: Array,
2794 A::Item: BorrowDecode<'de, Context>,
2795{
2796 fn borrow_decode<D: BorrowDecoder<'de, Context = Context>>(
2797 decoder: &mut D,
2798 ) -> Result<Self, DecodeError> {
2799 use core::convert::TryInto;
2800 let len = u64::decode(decoder)?;
2801 let len = len
2802 .try_into()
2803 .map_err(|_| DecodeError::OutsideUsizeRange(len))?;
2804 decoder.claim_container_read::<A::Item>(len)?;
2805
2806 let mut vec = SmallVec::with_capacity(len);
2807 if unty::type_equal::<A::Item, u8>() {
2808 let ptr = vec.as_mut_ptr();
2812 unsafe {
2815 core::ptr::write_bytes(ptr, 0, len);
2816 vec.set_len(len);
2817 }
2818 let slice = vec.as_mut_slice();
2820 let slice = unsafe { core::mem::transmute::<&mut [A::Item], &mut [u8]>(slice) };
2822 decoder.reader().read(slice)?;
2823 } else {
2824 for _ in 0..len {
2825 decoder.unclaim_bytes_read(core::mem::size_of::<A::Item>());
2826 vec.push(A::Item::borrow_decode(decoder)?);
2827 }
2828 }
2829 Ok(vec)
2830 }
2831}
2832
2833#[cfg(feature = "impl_bincode")]
2834impl<A> Encode for SmallVec<A>
2835where
2836 A: Array,
2837 A::Item: Encode,
2838{
2839 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
2840 (self.len() as u64).encode(encoder)?;
2841 if unty::type_equal::<A::Item, u8>() {
2842 let slice: &[u8] = unsafe { core::mem::transmute(self.as_slice()) };
2844 encoder.writer().write(slice)?;
2845 } else {
2846 for item in self.iter() {
2847 item.encode(encoder)?;
2848 }
2849 }
2850 Ok(())
2851 }
2852}