1use crate::common_traits::iterator::FlattenedIterOfSlices;
2use crate::common_traits::iterator::IterOfSlices;
3use crate::common_traits::iterator::IterPtr;
4use crate::common_traits::iterator::IterPtrBackward;
5use crate::common_traits::iterator::SliceBorrowAsMut;
6use crate::common_traits::iterator::SliceBorrowAsRef;
7use crate::fragment::fragment_struct::set_fragments_len;
8use crate::{Fragment, Growth, SplitVec, algorithms};
9use core::cmp::Ordering;
10use core::ops::RangeBounds;
11use orx_iterable::Collection;
12use orx_pinned_vec::utils::slice;
13use orx_pinned_vec::{CapacityState, PinnedVec};
14use orx_pseudo_default::PseudoDefault;
15
16impl<T, G: Growth> PseudoDefault for SplitVec<T, G> {
17 fn pseudo_default() -> Self {
18 let growth = G::pseudo_default();
19 let capacity = growth.first_fragment_capacity();
20 let fragments = alloc::vec![Fragment::new_empty(capacity)];
21 Self::from_raw_parts(0, fragments, growth)
22 }
23}
24
25impl<T, G: Growth> PinnedVec<T> for SplitVec<T, G> {
26 type IterRev<'a>
27 = crate::common_traits::iterator::IterRev<'a, T>
28 where
29 T: 'a,
30 Self: 'a;
31
32 type IterMutRev<'a>
33 = crate::common_traits::iterator::IterMutRev<'a, T>
34 where
35 T: 'a,
36 Self: 'a;
37
38 type SliceIter<'a>
39 = IterOfSlices<'a, T, SliceBorrowAsRef>
40 where
41 T: 'a,
42 Self: 'a;
43
44 type SliceMutIter<'a>
45 = IterOfSlices<'a, T, SliceBorrowAsMut>
46 where
47 T: 'a,
48 Self: 'a;
49
50 fn index_of(&self, element: &T) -> Option<usize> {
96 let mut count = 0;
97 for fragment in &self.fragments {
98 if let Some(index) = slice::index_of(fragment.as_slice(), element) {
99 return Some(count + index);
100 } else {
101 count += fragment.len()
102 }
103 }
104 None
105 }
106
107 fn index_of_ptr(&self, element_ptr: *const T) -> Option<usize> {
120 let mut count = 0;
122 for fragment in &self.fragments {
123 if let Some(index) = slice::index_of_ptr(fragment.as_slice(), element_ptr) {
124 return Some(count + index);
125 } else {
126 count += fragment.len()
127 }
128 }
129 None
130 }
131
132 fn push_get_ptr(&mut self, value: T) -> *const T {
133 self.len += 1;
134 match self.has_capacity_for_one() {
135 true => {
136 let f = self.fragments.len() - 1;
137 let fragment = &mut self.fragments[f];
138 let idx = fragment.len();
139 fragment.push(value);
140 unsafe { fragment.as_ptr().add(idx) }
141 }
142 false => {
143 self.add_fragment_with_first_value(value);
145 let f = self.fragments.len() - 1;
146 self.fragments[f].as_ptr()
147 }
148 }
149 }
150
151 unsafe fn iter_ptr<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
152 where
153 T: 'i,
154 {
155 IterPtr::from(self.fragments.as_slice())
156 }
157
158 unsafe fn iter_ptr_rev<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
159 where
160 T: 'i,
161 {
162 IterPtrBackward::from(self.fragments.as_slice())
163 }
164
165 fn contains_reference(&self, element: &T) -> bool {
208 self.fragments
209 .iter()
210 .any(|fragment| slice::contains_reference(fragment.as_slice(), element))
211 }
212
213 fn contains_ptr(&self, element_ptr: *const T) -> bool {
219 self.fragments
220 .iter()
221 .any(|fragment| slice::contains_ptr(fragment.as_slice(), element_ptr))
222 }
223
224 fn capacity(&self) -> usize {
248 self.fragments.iter().map(|f| f.capacity()).sum()
249 }
250
251 fn capacity_state(&self) -> CapacityState {
252 CapacityState::DynamicCapacity {
253 current_capacity: self.capacity(),
254 maximum_concurrent_capacity: self.maximum_concurrent_capacity(),
255 }
256 }
257
258 fn clear(&mut self) {
279 self.len = 0;
280 if !self.fragments.is_empty() {
281 self.fragments.truncate(1);
282 self.fragments[0].clear();
283 }
284 }
285
286 fn extend_from_slice(&mut self, other: &[T])
306 where
307 T: Clone,
308 {
309 let mut slice = other;
310 while !slice.is_empty() {
311 if !self.has_capacity_for_one() {
312 self.add_fragment();
313 }
314 let f = self.fragments.len() - 1;
315
316 let last = &mut self.fragments[f];
317 let available = last.room();
318
319 match available < slice.len() {
320 true => {
321 last.extend_from_slice(&slice[0..available]);
322 slice = &slice[available..];
323 self.add_fragment();
324 }
325 false => {
326 last.extend_from_slice(slice);
327 break;
328 }
329 }
330 }
331
332 self.len += other.len();
333 }
334
335 unsafe fn extend_from_nonoverlapping(&mut self, mut src: *const T, count: usize) {
336 let mut left = count;
337 while left > 0 {
338 if !self.has_capacity_for_one() {
339 self.add_fragment();
340 }
341 let f = self.fragments.len() - 1;
342
343 let last = &mut self.fragments[f];
344 let last_len = last.len();
345 let last_available = last.room();
346
347 let dst = unsafe { last.as_mut_ptr().add(last.len()) };
348 match last_available < left {
349 true => {
350 unsafe { dst.copy_from_nonoverlapping(src, last_available) };
351 unsafe { last.set_len(last_len + last_available) };
352 debug_assert_eq!(last.len(), last.capacity());
353
354 src = unsafe { src.add(last_available) };
355 left -= last_available;
356
357 self.add_fragment();
358 }
359 false => {
360 unsafe { dst.copy_from_nonoverlapping(src, left) };
361 unsafe { last.set_len(last_len + left) };
362 break;
363 }
364 }
365 }
366
367 self.len += count;
368 }
369
370 fn get(&self, index: usize) -> Option<&T> {
384 self.get_fragment_and_inner_indices(index)
385 .map(|(f, i)| unsafe { self.fragments.get_unchecked(f).get_unchecked(i) })
386 }
387
388 fn get_mut(&mut self, index: usize) -> Option<&mut T> {
406 self.get_fragment_and_inner_indices(index)
407 .map(|(f, i)| unsafe { self.fragments.get_unchecked_mut(f).get_unchecked_mut(i) })
408 }
409
410 unsafe fn get_unchecked(&self, index: usize) -> &T {
419 self.get(index).expect("out-of-bounds")
420 }
421
422 unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
431 self.get_mut(index).expect("out-of-bounds")
432 }
433
434 #[inline(always)]
454 fn first(&self) -> Option<&T> {
455 self.fragments.first().and_then(|x| x.first())
456 }
457
458 #[inline(always)]
478 fn last(&self) -> Option<&T> {
479 self.fragments.last().and_then(|x| x.last())
480 }
481
482 #[inline(always)]
483 unsafe fn first_unchecked(&self) -> &T {
484 unsafe { self.fragments.get_unchecked(0).get_unchecked(0) }
485 }
486
487 #[inline(always)]
488 unsafe fn last_unchecked(&self) -> &T {
489 let fragment = unsafe { self.fragments.get_unchecked(self.fragments.len() - 1) };
490 unsafe { fragment.get_unchecked(fragment.len() - 1) }
491 }
492
493 fn insert(&mut self, index: usize, value: T) {
494 if index == self.len {
495 self.push(value);
496 } else {
497 if !self.has_capacity_for_one() {
499 self.add_fragment();
500 }
501
502 let (f, i) = self
503 .get_fragment_and_inner_indices(index)
504 .expect("out-of-bounds");
505
506 if self.fragments[f].has_capacity_for_one() {
507 self.fragments[f].insert(i, value);
508 } else {
509 let mut popped = self.fragments[f].pop().expect("no-way!");
510 self.fragments[f].insert(i, value);
511 let mut f = f;
512 loop {
513 f += 1;
514
515 if self.fragments[f].has_capacity_for_one() {
516 self.fragments[f].insert(0, popped);
517 break;
518 } else {
519 let new_popped = self.fragments[f].pop().expect("no-way");
520 self.fragments[f].insert(0, popped);
521 popped = new_popped;
522 }
523 }
524 }
525 self.len += 1;
526 }
527 }
528
529 fn is_empty(&self) -> bool {
542 self.len == 0
543 }
544
545 fn len(&self) -> usize {
561 self.len
562 }
563
564 fn pop(&mut self) -> Option<T> {
565 if self.fragments.is_empty() {
566 None
567 } else {
568 let f = self.fragments.len() - 1;
569 if self.fragments[f].is_empty() {
570 if f == 0 {
571 None
572 } else {
573 self.len -= 1;
574 self.fragments.pop();
575 self.fragments[f - 1].pop()
576 }
577 } else {
578 self.len -= 1;
579 let popped = self.fragments[f].pop();
580 if self.fragments[f].is_empty() {
581 self.fragments.pop();
582 }
583 popped
584 }
585 }
586 }
587
588 fn push(&mut self, value: T) {
602 if !self.has_capacity_for_one() {
603 self.add_fragment(); }
605 let last_f = self.fragments.len() - 1;
606 self.fragments[last_f].push(value);
607 self.len += 1;
608 }
609
610 fn remove(&mut self, index: usize) -> T {
611 self.drop_last_empty_fragment();
612
613 let (f, i) = self
614 .get_fragment_and_inner_indices(index)
615 .expect("out-of-bounds");
616
617 let value = self.fragments[f].remove(i);
618
619 for f2 in f + 1..self.fragments.len() {
620 let x = self.fragments[f2].remove(0);
621 self.fragments[f2 - 1].push(x);
622 if self.fragments[f2].is_empty() {
623 self.fragments.remove(f2);
624 break;
625 }
626 }
627
628 self.drop_last_empty_fragment();
629
630 self.len -= 1;
631 value
632 }
633
634 fn swap(&mut self, a: usize, b: usize) {
635 let (af, ai) = self
636 .get_fragment_and_inner_indices(a)
637 .expect("first index is out-of-bounds");
638 let (bf, bi) = self
639 .get_fragment_and_inner_indices(b)
640 .expect("second index out-of-bounds");
641 if af == bf {
642 self.fragments[af].swap(ai, bi);
643 } else {
644 let ptr_a = unsafe { self.fragments[af].as_mut_ptr().add(ai) };
645 let ref_a = unsafe { &mut *ptr_a };
646 let ref_b = &mut self.fragments[bf][bi];
647 core::mem::swap(ref_a, ref_b);
648 }
649 }
650
651 fn truncate(&mut self, len: usize) {
652 if let Some((f, i)) = self.get_fragment_and_inner_indices(len) {
653 self.len = len;
654
655 self.fragments.truncate(f + 1);
656 self.fragments[f].truncate(i);
657
658 self.drop_last_empty_fragment();
659 }
660 }
661
662 fn iter_rev(&self) -> Self::IterRev<'_> {
663 Self::IterRev::new(&self.fragments)
664 }
665
666 fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
667 Self::IterMutRev::new(&mut self.fragments)
668 }
669
670 fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
704 Self::SliceIter::new(self, range)
705 }
706
707 fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_> {
759 Self::SliceMutIter::new(self, range)
760 }
761
762 fn iter_over<'a>(
763 &'a self,
764 range: impl RangeBounds<usize>,
765 ) -> impl ExactSizeIterator<Item = &'a T>
766 where
767 T: 'a,
768 {
769 FlattenedIterOfSlices::<_, SliceBorrowAsRef>::new(self, range)
770 }
771
772 fn iter_mut_over<'a>(
773 &'a mut self,
774 range: impl RangeBounds<usize>,
775 ) -> impl ExactSizeIterator<Item = &'a mut T>
776 where
777 T: 'a,
778 {
779 FlattenedIterOfSlices::<_, SliceBorrowAsMut>::new(self, range)
780 }
781
782 #[inline(always)]
796 fn get_ptr(&self, index: usize) -> Option<*const T> {
797 self.growth_get_ptr(index)
798 }
799
800 #[inline(always)]
814 fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T> {
815 self.growth_get_ptr_mut(index)
816 }
817
818 unsafe fn set_len(&mut self, new_len: usize) {
819 unsafe { set_fragments_len(&mut self.fragments, new_len) };
820 self.len = new_len;
821 }
822
823 fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
824 where
825 F: FnMut(&T) -> Ordering,
826 {
827 algorithms::binary_search::binary_search_by(&self.fragments, f)
828 }
829
830 fn sort(&mut self)
831 where
832 T: Ord,
833 {
834 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, T::cmp)
835 }
836
837 fn sort_by<F>(&mut self, compare: F)
838 where
839 F: FnMut(&T, &T) -> Ordering,
840 {
841 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
842 }
843
844 fn sort_by_key<K, F>(&mut self, mut f: F)
845 where
846 F: FnMut(&T) -> K,
847 K: Ord,
848 {
849 let compare = |a: &T, b: &T| f(a).cmp(&f(b));
850 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
851 }
852
853 fn capacity_bound(&self) -> usize {
854 self.growth
855 .maximum_concurrent_capacity_bound(&self.fragments, self.fragments.capacity())
856 }
857}
858
859#[cfg(test)]
860mod tests {
861 use crate::test::macros::Num;
862 use crate::test_all_growth_types;
863 use crate::*;
864 use alloc::string::String;
865 use alloc::vec::Vec;
866 use orx_pinned_vec::*;
867 use orx_pseudo_default::PseudoDefault;
868
869 #[test]
870 fn pinned_vec_tests() {
871 fn test<G: Growth>(vec: SplitVec<usize, G>) {
872 #[cfg(not(miri))]
873 let capacities = [0, 10, 124, 5421];
874 #[cfg(miri)]
875 let capacities = [0, 34];
876
877 for cap in capacities {
878 test_pinned_vec(vec.clone(), cap);
879 }
880 }
881 test_all_growth_types!(test);
882 }
883
884 #[test]
885 fn index_of_and_contains() {
886 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
887 #[cfg(not(miri))]
888 const TARGET_LEN: usize = 157;
889 #[cfg(miri)]
890 const TARGET_LEN: usize = 37;
891
892 let mut another_vec = Vec::new();
893 for i in 0..TARGET_LEN {
894 vec.push(i);
895 another_vec.push(i);
896 }
897 for i in 0..vec.len() {
898 assert_eq!(Some(i), vec.index_of(&vec[i]));
899 assert!(vec.contains_reference(&vec[i]));
900
901 assert_eq!(None, vec.index_of(&another_vec[i]));
902 assert!(!vec.contains_reference(&another_vec[i]));
903
904 let scalar = another_vec[i];
905 assert_eq!(None, vec.index_of(&scalar));
906 assert!(!vec.contains_reference(&scalar));
907 }
908 }
909 test_all_growth_types!(test);
910 }
911
912 #[test]
913 fn capacity_state() {
914 fn test<G: Growth>(vec: SplitVec<usize, G>) {
915 match vec.capacity_state() {
916 CapacityState::DynamicCapacity {
917 current_capacity,
918 maximum_concurrent_capacity,
919 } => {
920 assert!(maximum_concurrent_capacity >= current_capacity);
921 assert_eq!(current_capacity, vec.capacity());
922 assert_eq!(
923 maximum_concurrent_capacity,
924 vec.growth()
925 .maximum_concurrent_capacity(vec.fragments(), vec.fragments.capacity())
926 );
927 }
928 #[allow(clippy::panic)]
929 _ => panic!("must have dynamic capacity"),
930 }
931 }
932 test_all_growth_types!(test);
933 }
934
935 #[test]
936 fn len_and_is_empty() {
937 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
938 for i in 0..42 {
939 assert_eq!(i, vec.len());
940 vec.push(i);
941 }
942 assert_eq!(42, vec.len());
943
944 vec.clear();
945 assert_eq!(0, vec.len());
946
947 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
948 assert_eq!(42, vec.len());
949
950 for i in 0..42 {
951 assert_eq!(42 - i, vec.len());
952 vec.pop();
953 }
954 assert_eq!(0, vec.len());
955
956 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
957 for i in 0..42 {
958 assert_eq!(42 - i, vec.len());
959 vec.remove(vec.len() / 2);
960 }
961 assert_eq!(0, vec.len());
962
963 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
964 for i in 0..42 {
965 assert_eq!(42 - i, vec.len());
966 vec.remove(0);
967 }
968 assert_eq!(0, vec.len());
969
970 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
971 for i in 0..42 {
972 assert_eq!(42 - i, vec.len());
973 vec.remove(vec.len() - 1);
974 }
975 assert_eq!(0, vec.len());
976
977 vec.clear();
978 for i in 0..42 {
979 assert_eq!(i, vec.len());
980 vec.insert(i, i);
981 assert_eq!(i + 1, vec.len());
982 }
983 assert_eq!(42, vec.len());
984
985 vec.clear();
986 for i in 0..42 {
987 assert_eq!(i, vec.len());
988 vec.insert(0, i);
989 }
990 assert_eq!(42, vec.len());
991 }
992
993 test_all_growth_types!(test);
994 }
995
996 #[test]
997 fn clear() {
998 fn clear_is_empty<G: Growth>(mut vec: SplitVec<usize, G>) {
999 vec.clear();
1000 assert!(vec.is_empty());
1001 assert_eq!(0, vec.len());
1002
1003 vec.push(1);
1004 assert!(!vec.is_empty());
1005 for i in 0..42 {
1006 vec.push(i);
1007 }
1008 assert!(!vec.is_empty());
1009
1010 vec.clear();
1011 assert!(vec.is_empty());
1012 assert_eq!(0, vec.len());
1013 }
1014 test_all_growth_types!(clear_is_empty);
1015 }
1016
1017 #[test]
1018 fn get() {
1019 fn test_get<G: Growth>(mut vec: SplitVec<usize, G>) {
1020 assert!(vec.is_empty());
1021
1022 for i in 0..53 {
1023 vec.push(i);
1024
1025 assert_eq!(vec.get(i), Some(&i));
1026 assert_eq!(vec.get(i + 1), None);
1027
1028 *vec.get_mut(i).expect("is-some") += 100;
1029 }
1030
1031 for i in 0..53 {
1032 assert_eq!(vec.get(i), Some(&(100 + i)));
1033 }
1034 }
1035 test_all_growth_types!(test_get);
1036 }
1037
1038 #[test]
1039 fn first_last() {
1040 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1041 assert!(vec.first().is_none());
1042 assert!(vec.last().is_none());
1043
1044 vec.push(42);
1045
1046 assert_eq!(vec.first(), Some(&42));
1047 assert_eq!(vec.last(), Some(&42));
1048
1049 unsafe {
1050 assert_eq!(vec.first_unchecked(), &42);
1051 assert_eq!(vec.last_unchecked(), &42);
1052 }
1053
1054 vec.push(7);
1055
1056 assert_eq!(vec.first(), Some(&42));
1057 assert_eq!(vec.last(), Some(&7));
1058
1059 unsafe {
1060 assert_eq!(vec.first_unchecked(), &42);
1061 assert_eq!(vec.last_unchecked(), &7);
1062 }
1063
1064 #[cfg(not(miri))]
1065 const TARGET_LEN: usize = 800;
1066 #[cfg(miri)]
1067 const TARGET_LEN: usize = 37;
1068
1069 for _ in 0..TARGET_LEN {
1070 vec.insert(1, 56421);
1071 }
1072
1073 assert_eq!(vec.first(), Some(&42));
1074 assert_eq!(vec.last(), Some(&7));
1075
1076 unsafe {
1077 assert_eq!(vec.first_unchecked(), &42);
1078 assert_eq!(vec.last_unchecked(), &7);
1079 }
1080
1081 vec.clear();
1082
1083 assert!(vec.first().is_none());
1084 assert!(vec.last().is_none());
1085 }
1086
1087 test_all_growth_types!(test);
1088 }
1089
1090 #[test]
1091 fn extend_from_slice() {
1092 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1093 vec.extend_from_slice(&(0..21).collect::<Vec<_>>());
1094 vec.extend_from_slice(&(21..35).collect::<Vec<_>>());
1095 vec.extend_from_slice(&(35..49).collect::<Vec<_>>());
1096
1097 assert_eq!(49, vec.len());
1098 for i in 0..49 {
1099 assert_eq!(i, vec[i]);
1100 }
1101 }
1102 test_all_growth_types!(test);
1103 }
1104
1105 #[test]
1106 fn grow() {
1107 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1108 for i in 0..42 {
1109 vec.push(i);
1110 }
1111 for i in 0..42 {
1112 vec.insert(i, 100 + i);
1113 }
1114
1115 for i in 0..42 {
1116 assert_eq!(i, vec[42 + i]);
1117 assert_eq!(100 + i, vec[i]);
1118 }
1119 }
1120 test_all_growth_types!(test);
1121 }
1122
1123 #[test]
1124 fn shrink() {
1125 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1126 for i in 0..42 {
1127 vec.push(i);
1128 assert_eq!(i, vec.remove(0));
1129 assert!(vec.is_empty());
1130 }
1131
1132 for i in 0..42 {
1133 vec.push(i);
1134 }
1135 for i in 0..42 {
1136 assert_eq!(i, vec.remove(0));
1137 }
1138 assert!(vec.is_empty());
1139
1140 for i in 0..42 {
1141 vec.push(i);
1142 }
1143 for _ in 0..42 {
1144 vec.remove(vec.len() / 2);
1145 }
1146 assert!(vec.is_empty());
1147 }
1148 test_all_growth_types!(test);
1149 }
1150
1151 #[test]
1152 fn swap() {
1153 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1154 for i in 0..42 {
1155 vec.push(i);
1156 }
1157
1158 for i in 0..21 {
1159 vec.swap(i, 21 + i);
1160 }
1161
1162 for i in 0..21 {
1163 assert_eq!(21 + i, vec[i]);
1164 }
1165 for i in 21..42 {
1166 assert_eq!(i - 21, vec[i]);
1167 }
1168 }
1169 test_all_growth_types!(test);
1170 }
1171
1172 #[test]
1173 fn truncate() {
1174 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1175 let std_vec: Vec<_> = (0..42).collect();
1176 for i in 0..42 {
1177 vec.push(i);
1178 }
1179
1180 vec.truncate(100);
1181 assert_eq!(vec, std_vec);
1182
1183 for i in (0..42).rev() {
1184 vec.truncate(i);
1185 assert_eq!(vec, &std_vec[0..i]);
1186 }
1187 }
1188 test_all_growth_types!(test);
1189 }
1190
1191 #[test]
1192 fn insert() {
1193 fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1194 for i in 0..42 {
1195 vec.push(Num::new(i));
1196 }
1197 for i in 0..42 {
1198 vec.insert(i, Num::new(100 + i));
1199 }
1200
1201 for i in 0..42 {
1202 assert_eq!(Some(&Num::new(i)), vec.get(42 + i));
1203 assert_eq!(Some(&Num::new(100 + i)), vec.get(i));
1204 }
1205 }
1206 test_all_growth_types!(test);
1207 }
1208
1209 #[test]
1210 fn clone() {
1211 fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1212 assert!(vec.is_empty());
1213
1214 for i in 0..53 {
1215 vec.push(Num::new(i));
1216 }
1217
1218 let clone = vec.clone();
1219 assert_eq!(vec, clone);
1220 }
1221 test_all_growth_types!(test);
1222 }
1223
1224 #[test]
1225 fn slices() {
1226 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1227 #[cfg(not(miri))]
1228 const TARGET_LEN: usize = 184;
1229 #[cfg(miri)]
1230 const TARGET_LEN: usize = 41;
1231
1232 for i in 0..TARGET_LEN {
1233 assert_eq!(vec.slices(i..i + 1).len(), 0);
1234 assert_eq!(vec.slices(0..i + 1).len(), 0);
1235 vec.push(i);
1236 }
1237
1238 let slice = vec.slices(0..vec.len());
1239 let mut combined = Vec::new();
1240 for s in slice {
1241 combined.extend_from_slice(s);
1242 }
1243 for i in 0..TARGET_LEN {
1244 assert_eq!(i, vec[i]);
1245 assert_eq!(i, combined[i]);
1246 }
1247
1248 let begin = vec.len() / 4;
1249 let end = 3 * vec.len() / 4;
1250 let slice = vec.slices(begin..end);
1251 let mut combined = Vec::new();
1252 for s in slice {
1253 combined.extend_from_slice(s);
1254 }
1255 for i in begin..end {
1256 assert_eq!(i, vec[i]);
1257 assert_eq!(i, combined[i - begin]);
1258 }
1259 }
1260 test_all_growth_types!(test);
1261 }
1262
1263 #[test]
1264 fn slices_mut() {
1265 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1266 for i in 0..84 {
1267 assert_eq!(vec.slices_mut(i..i + 1).len(), 0);
1268 assert_eq!(vec.slices_mut(0..i + 1).len(), 0);
1269 vec.push(i);
1270 }
1271
1272 let slice = vec.slices_mut(0..vec.len());
1273 let mut combined = Vec::new();
1274 for s in slice {
1275 combined.extend_from_slice(s);
1276 }
1277 for i in 0..84 {
1278 assert_eq!(i, vec[i]);
1279 assert_eq!(i, combined[i]);
1280 }
1281
1282 let begin = vec.len() / 4;
1283 let end = 3 * vec.len() / 4;
1284 let slice = vec.slices_mut(begin..end);
1285 let mut combined = Vec::new();
1286 for s in slice {
1287 combined.extend_from_slice(s);
1288 }
1289 for i in begin..end {
1290 assert_eq!(i, vec[i]);
1291 assert_eq!(i, combined[i - begin]);
1292 }
1293
1294 vec.clear();
1295
1296 for _ in 0..84 {
1297 vec.push(0);
1298 }
1299
1300 fn update<'a>(slice: impl Iterator<Item = &'a mut [usize]>, begin: usize) {
1301 let mut val = begin;
1302 for s in slice {
1303 for x in s {
1304 *x = val;
1305 val += 1;
1306 }
1307 }
1308 }
1309 let mut fill = |begin: usize, end: usize| {
1310 let range = begin..end;
1311 update(vec.slices_mut(range), begin);
1312 };
1313
1314 fill(0, 7);
1315 fill(7, 14);
1316 fill(14, 33);
1317 fill(33, 61);
1318 fill(61, 72);
1319 fill(72, 84);
1320 for i in 0..84 {
1321 assert_eq!(vec.get(i), Some(&i));
1322 }
1323 }
1324 test_all_growth_types!(test);
1325 }
1326
1327 #[test]
1328 fn set_len_get_ptr_mut() {
1329 let mut vec = SplitVec::with_doubling_growth();
1330 vec.push(0);
1331 vec.push(1);
1332 vec.push(2);
1333 vec.push(3);
1334 vec.push(4);
1335
1336 assert_eq!(vec.capacity(), 12);
1337
1338 for i in vec.len()..vec.capacity() {
1339 unsafe { *(vec.get_ptr_mut(i).expect("is-some")) = i };
1340 unsafe { vec.set_len(i + 1) };
1341
1342 assert_eq!(vec.get(i), Some(&i));
1343 }
1344
1345 for i in vec.capacity()..(vec.capacity() + 100) {
1346 assert!(vec.get_ptr_mut(i).is_none());
1347 }
1348 }
1349
1350 #[test]
1351 fn pseudo_default() {
1352 let vec = SplitVec::<String, Doubling>::pseudo_default();
1353 assert_eq!(vec.len(), 0);
1354
1355 let vec = SplitVec::<String, Recursive>::pseudo_default();
1356 assert_eq!(vec.len(), 0);
1357
1358 let vec = SplitVec::<String, Linear>::pseudo_default();
1359 assert_eq!(vec.len(), 0);
1360 }
1361
1362 #[test]
1363 fn extend_from_slice_panic_safety() {
1364 use alloc::string::ToString;
1365
1366 struct PanicOnClone(String);
1367
1368 impl Clone for PanicOnClone {
1369 fn clone(&self) -> Self {
1370 assert_eq!(self.0, 42.to_string()); Self(self.0.clone())
1372 }
1373 }
1374
1375 let mut vec = SplitVec::new();
1376 let src = alloc::vec![
1377 PanicOnClone(42.to_string()),
1378 PanicOnClone(42.to_string()),
1379 PanicOnClone(7.to_string()), PanicOnClone(42.to_string())
1381 ];
1382
1383 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
1385 vec.extend_from_slice(&src);
1386 }));
1387 assert!(result.is_err());
1388
1389 if let Some(v) = vec.get(0) {
1392 let _ = v.0.len(); }
1394 }
1395}