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(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.data, 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.data, 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 if !self.fragments.is_empty() {
280 self.fragments.truncate(1);
281 self.fragments[0].clear();
282 }
283 self.len = 0;
284 }
285
286 fn extend_from_slice(&mut self, other: &[T])
306 where
307 T: Clone,
308 {
309 self.len += other.len();
310 let mut slice = other;
311 while !slice.is_empty() {
312 if !self.has_capacity_for_one() {
313 self.add_fragment();
314 }
315 let f = self.fragments.len() - 1;
316
317 let last = &mut self.fragments[f];
318 let available = last.room();
319
320 match available < slice.len() {
321 true => {
322 last.extend_from_slice(&slice[0..available]);
323 slice = &slice[available..];
324 self.add_fragment();
325 }
326 false => {
327 last.extend_from_slice(slice);
328 break;
329 }
330 }
331 }
332 }
333
334 unsafe fn extend_from_nonoverlapping(&mut self, mut src: *const T, count: usize) {
335 self.len += count;
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
368 fn get(&self, index: usize) -> Option<&T> {
382 self.get_fragment_and_inner_indices(index)
383 .map(|(f, i)| unsafe { self.fragments.get_unchecked(f).get_unchecked(i) })
384 }
385
386 fn get_mut(&mut self, index: usize) -> Option<&mut T> {
404 self.get_fragment_and_inner_indices(index)
405 .map(|(f, i)| unsafe { self.fragments.get_unchecked_mut(f).get_unchecked_mut(i) })
406 }
407
408 unsafe fn get_unchecked(&self, index: usize) -> &T {
417 self.get(index).expect("out-of-bounds")
418 }
419
420 unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
429 self.get_mut(index).expect("out-of-bounds")
430 }
431
432 #[inline(always)]
452 fn first(&self) -> Option<&T> {
453 self.fragments.first().and_then(|x| x.first())
454 }
455
456 #[inline(always)]
476 fn last(&self) -> Option<&T> {
477 self.fragments.last().and_then(|x| x.last())
478 }
479
480 #[inline(always)]
481 unsafe fn first_unchecked(&self) -> &T {
482 unsafe { self.fragments.get_unchecked(0).get_unchecked(0) }
483 }
484
485 #[inline(always)]
486 unsafe fn last_unchecked(&self) -> &T {
487 let fragment = unsafe { self.fragments.get_unchecked(self.fragments.len() - 1) };
488 unsafe { fragment.get_unchecked(fragment.len() - 1) }
489 }
490
491 fn insert(&mut self, index: usize, value: T) {
492 if index == self.len {
493 self.push(value);
494 } else {
495 if !self.has_capacity_for_one() {
497 self.add_fragment();
498 }
499
500 let (f, i) = self
501 .get_fragment_and_inner_indices(index)
502 .expect("out-of-bounds");
503
504 if self.fragments[f].has_capacity_for_one() {
505 self.fragments[f].insert(i, value);
506 } else {
507 let mut popped = self.fragments[f].pop().expect("no-way!");
508 self.fragments[f].insert(i, value);
509 let mut f = f;
510 loop {
511 f += 1;
512
513 if self.fragments[f].has_capacity_for_one() {
514 self.fragments[f].insert(0, popped);
515 break;
516 } else {
517 let new_popped = self.fragments[f].pop().expect("no-way");
518 self.fragments[f].insert(0, popped);
519 popped = new_popped;
520 }
521 }
522 }
523 self.len += 1;
524 }
525 }
526
527 fn is_empty(&self) -> bool {
540 self.len == 0
541 }
542
543 fn len(&self) -> usize {
559 self.len
560 }
561
562 fn pop(&mut self) -> Option<T> {
563 if self.fragments.is_empty() {
564 None
565 } else {
566 let f = self.fragments.len() - 1;
567 if self.fragments[f].is_empty() {
568 if f == 0 {
569 None
570 } else {
571 self.len -= 1;
572 self.fragments.pop();
573 self.fragments[f - 1].pop()
574 }
575 } else {
576 self.len -= 1;
577 let popped = self.fragments[f].pop();
578 if self.fragments[f].is_empty() {
579 self.fragments.pop();
580 }
581 popped
582 }
583 }
584 }
585
586 fn push(&mut self, value: T) {
600 self.len += 1;
601 match self.has_capacity_for_one() {
602 true => {
603 let last_f = self.fragments.len() - 1;
604 self.fragments[last_f].push(value);
605 }
606 false => self.add_fragment_with_first_value(value),
607 }
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.fragments.truncate(f + 1);
654 self.fragments[f].truncate(i);
655 self.len = len;
656
657 self.drop_last_empty_fragment();
658 }
659 }
660
661 fn iter_rev(&self) -> Self::IterRev<'_> {
662 Self::IterRev::new(&self.fragments)
663 }
664
665 fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
666 Self::IterMutRev::new(&mut self.fragments)
667 }
668
669 fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
703 Self::SliceIter::new(self, range)
704 }
705
706 fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_> {
758 Self::SliceMutIter::new(self, range)
759 }
760
761 fn iter_over<'a>(
762 &'a self,
763 range: impl RangeBounds<usize>,
764 ) -> impl ExactSizeIterator<Item = &'a T>
765 where
766 T: 'a,
767 {
768 FlattenedIterOfSlices::<_, SliceBorrowAsRef>::new(self, range)
769 }
770
771 fn iter_mut_over<'a>(
772 &'a mut self,
773 range: impl RangeBounds<usize>,
774 ) -> impl ExactSizeIterator<Item = &'a mut T>
775 where
776 T: 'a,
777 {
778 FlattenedIterOfSlices::<_, SliceBorrowAsMut>::new(self, range)
779 }
780
781 #[inline(always)]
795 fn get_ptr(&self, index: usize) -> Option<*const T> {
796 self.growth_get_ptr(index)
797 }
798
799 #[inline(always)]
813 fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T> {
814 self.growth_get_ptr_mut(index)
815 }
816
817 unsafe fn set_len(&mut self, new_len: usize) {
818 unsafe { set_fragments_len(&mut self.fragments, new_len) };
819 self.len = new_len;
820 }
821
822 fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
823 where
824 F: FnMut(&T) -> Ordering,
825 {
826 algorithms::binary_search::binary_search_by(&self.fragments, f)
827 }
828
829 fn sort(&mut self)
830 where
831 T: Ord,
832 {
833 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, T::cmp)
834 }
835
836 fn sort_by<F>(&mut self, compare: F)
837 where
838 F: FnMut(&T, &T) -> Ordering,
839 {
840 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
841 }
842
843 fn sort_by_key<K, F>(&mut self, mut f: F)
844 where
845 F: FnMut(&T) -> K,
846 K: Ord,
847 {
848 let compare = |a: &T, b: &T| f(a).cmp(&f(b));
849 algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
850 }
851
852 fn capacity_bound(&self) -> usize {
853 self.growth
854 .maximum_concurrent_capacity_bound(&self.fragments, self.fragments.capacity())
855 }
856}
857
858#[cfg(test)]
859mod tests {
860 use crate::test::macros::Num;
861 use crate::test_all_growth_types;
862 use crate::*;
863 use alloc::string::String;
864 use alloc::vec::Vec;
865 use orx_pinned_vec::*;
866 use orx_pseudo_default::PseudoDefault;
867
868 #[test]
869 fn pinned_vec_tests() {
870 fn test<G: Growth>(vec: SplitVec<usize, G>) {
871 #[cfg(not(miri))]
872 let capacities = [0, 10, 124, 5421];
873 #[cfg(miri)]
874 let capacities = [0, 34];
875
876 for cap in capacities {
877 test_pinned_vec(vec.clone(), cap);
878 }
879 }
880 test_all_growth_types!(test);
881 }
882
883 #[test]
884 fn index_of_and_contains() {
885 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
886 #[cfg(not(miri))]
887 const TARGET_LEN: usize = 157;
888 #[cfg(miri)]
889 const TARGET_LEN: usize = 37;
890
891 let mut another_vec = Vec::new();
892 for i in 0..TARGET_LEN {
893 vec.push(i);
894 another_vec.push(i);
895 }
896 for i in 0..vec.len() {
897 assert_eq!(Some(i), vec.index_of(&vec[i]));
898 assert!(vec.contains_reference(&vec[i]));
899
900 assert_eq!(None, vec.index_of(&another_vec[i]));
901 assert!(!vec.contains_reference(&another_vec[i]));
902
903 let scalar = another_vec[i];
904 assert_eq!(None, vec.index_of(&scalar));
905 assert!(!vec.contains_reference(&scalar));
906 }
907 }
908 test_all_growth_types!(test);
909 }
910
911 #[test]
912 fn capacity_state() {
913 fn test<G: Growth>(vec: SplitVec<usize, G>) {
914 match vec.capacity_state() {
915 CapacityState::DynamicCapacity {
916 current_capacity,
917 maximum_concurrent_capacity,
918 } => {
919 assert!(maximum_concurrent_capacity >= current_capacity);
920 assert_eq!(current_capacity, vec.capacity());
921 assert_eq!(
922 maximum_concurrent_capacity,
923 vec.growth()
924 .maximum_concurrent_capacity(vec.fragments(), vec.fragments.capacity())
925 );
926 }
927 #[allow(clippy::panic)]
928 _ => panic!("must have dynamic capacity"),
929 }
930 }
931 test_all_growth_types!(test);
932 }
933
934 #[test]
935 fn len_and_is_empty() {
936 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
937 for i in 0..42 {
938 assert_eq!(i, vec.len());
939 vec.push(i);
940 }
941 assert_eq!(42, vec.len());
942
943 vec.clear();
944 assert_eq!(0, vec.len());
945
946 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
947 assert_eq!(42, vec.len());
948
949 for i in 0..42 {
950 assert_eq!(42 - i, vec.len());
951 vec.pop();
952 }
953 assert_eq!(0, vec.len());
954
955 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
956 for i in 0..42 {
957 assert_eq!(42 - i, vec.len());
958 vec.remove(vec.len() / 2);
959 }
960 assert_eq!(0, vec.len());
961
962 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
963 for i in 0..42 {
964 assert_eq!(42 - i, vec.len());
965 vec.remove(0);
966 }
967 assert_eq!(0, vec.len());
968
969 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
970 for i in 0..42 {
971 assert_eq!(42 - i, vec.len());
972 vec.remove(vec.len() - 1);
973 }
974 assert_eq!(0, vec.len());
975
976 vec.clear();
977 for i in 0..42 {
978 assert_eq!(i, vec.len());
979 vec.insert(i, i);
980 assert_eq!(i + 1, vec.len());
981 }
982 assert_eq!(42, vec.len());
983
984 vec.clear();
985 for i in 0..42 {
986 assert_eq!(i, vec.len());
987 vec.insert(0, i);
988 }
989 assert_eq!(42, vec.len());
990 }
991
992 test_all_growth_types!(test);
993 }
994
995 #[test]
996 fn clear() {
997 fn clear_is_empty<G: Growth>(mut vec: SplitVec<usize, G>) {
998 vec.clear();
999 assert!(vec.is_empty());
1000 assert_eq!(0, vec.len());
1001
1002 vec.push(1);
1003 assert!(!vec.is_empty());
1004 for i in 0..42 {
1005 vec.push(i);
1006 }
1007 assert!(!vec.is_empty());
1008
1009 vec.clear();
1010 assert!(vec.is_empty());
1011 assert_eq!(0, vec.len());
1012 }
1013 test_all_growth_types!(clear_is_empty);
1014 }
1015
1016 #[test]
1017 fn get() {
1018 fn test_get<G: Growth>(mut vec: SplitVec<usize, G>) {
1019 assert!(vec.is_empty());
1020
1021 for i in 0..53 {
1022 vec.push(i);
1023
1024 assert_eq!(vec.get(i), Some(&i));
1025 assert_eq!(vec.get(i + 1), None);
1026
1027 *vec.get_mut(i).expect("is-some") += 100;
1028 }
1029
1030 for i in 0..53 {
1031 assert_eq!(vec.get(i), Some(&(100 + i)));
1032 }
1033 }
1034 test_all_growth_types!(test_get);
1035 }
1036
1037 #[test]
1038 fn first_last() {
1039 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1040 assert!(vec.first().is_none());
1041 assert!(vec.last().is_none());
1042
1043 vec.push(42);
1044
1045 assert_eq!(vec.first(), Some(&42));
1046 assert_eq!(vec.last(), Some(&42));
1047
1048 unsafe {
1049 assert_eq!(vec.first_unchecked(), &42);
1050 assert_eq!(vec.last_unchecked(), &42);
1051 }
1052
1053 vec.push(7);
1054
1055 assert_eq!(vec.first(), Some(&42));
1056 assert_eq!(vec.last(), Some(&7));
1057
1058 unsafe {
1059 assert_eq!(vec.first_unchecked(), &42);
1060 assert_eq!(vec.last_unchecked(), &7);
1061 }
1062
1063 #[cfg(not(miri))]
1064 const TARGET_LEN: usize = 800;
1065 #[cfg(miri)]
1066 const TARGET_LEN: usize = 37;
1067
1068 for _ in 0..TARGET_LEN {
1069 vec.insert(1, 56421);
1070 }
1071
1072 assert_eq!(vec.first(), Some(&42));
1073 assert_eq!(vec.last(), Some(&7));
1074
1075 unsafe {
1076 assert_eq!(vec.first_unchecked(), &42);
1077 assert_eq!(vec.last_unchecked(), &7);
1078 }
1079
1080 vec.clear();
1081
1082 assert!(vec.first().is_none());
1083 assert!(vec.last().is_none());
1084 }
1085
1086 test_all_growth_types!(test);
1087 }
1088
1089 #[test]
1090 fn extend_from_slice() {
1091 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1092 vec.extend_from_slice(&(0..21).collect::<Vec<_>>());
1093 vec.extend_from_slice(&(21..35).collect::<Vec<_>>());
1094 vec.extend_from_slice(&(35..49).collect::<Vec<_>>());
1095
1096 assert_eq!(49, vec.len());
1097 for i in 0..49 {
1098 assert_eq!(i, vec[i]);
1099 }
1100 }
1101 test_all_growth_types!(test);
1102 }
1103
1104 #[test]
1105 fn grow() {
1106 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1107 for i in 0..42 {
1108 vec.push(i);
1109 }
1110 for i in 0..42 {
1111 vec.insert(i, 100 + i);
1112 }
1113
1114 for i in 0..42 {
1115 assert_eq!(i, vec[42 + i]);
1116 assert_eq!(100 + i, vec[i]);
1117 }
1118 }
1119 test_all_growth_types!(test);
1120 }
1121
1122 #[test]
1123 fn shrink() {
1124 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1125 for i in 0..42 {
1126 vec.push(i);
1127 assert_eq!(i, vec.remove(0));
1128 assert!(vec.is_empty());
1129 }
1130
1131 for i in 0..42 {
1132 vec.push(i);
1133 }
1134 for i in 0..42 {
1135 assert_eq!(i, vec.remove(0));
1136 }
1137 assert!(vec.is_empty());
1138
1139 for i in 0..42 {
1140 vec.push(i);
1141 }
1142 for _ in 0..42 {
1143 vec.remove(vec.len() / 2);
1144 }
1145 assert!(vec.is_empty());
1146 }
1147 test_all_growth_types!(test);
1148 }
1149
1150 #[test]
1151 fn swap() {
1152 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1153 for i in 0..42 {
1154 vec.push(i);
1155 }
1156
1157 for i in 0..21 {
1158 vec.swap(i, 21 + i);
1159 }
1160
1161 for i in 0..21 {
1162 assert_eq!(21 + i, vec[i]);
1163 }
1164 for i in 21..42 {
1165 assert_eq!(i - 21, vec[i]);
1166 }
1167 }
1168 test_all_growth_types!(test);
1169 }
1170
1171 #[test]
1172 fn truncate() {
1173 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1174 let std_vec: Vec<_> = (0..42).collect();
1175 for i in 0..42 {
1176 vec.push(i);
1177 }
1178
1179 vec.truncate(100);
1180 assert_eq!(vec, std_vec);
1181
1182 for i in (0..42).rev() {
1183 vec.truncate(i);
1184 assert_eq!(vec, &std_vec[0..i]);
1185 }
1186 }
1187 test_all_growth_types!(test);
1188 }
1189
1190 #[test]
1191 fn insert() {
1192 fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1193 for i in 0..42 {
1194 vec.push(Num::new(i));
1195 }
1196 for i in 0..42 {
1197 vec.insert(i, Num::new(100 + i));
1198 }
1199
1200 for i in 0..42 {
1201 assert_eq!(Some(&Num::new(i)), vec.get(42 + i));
1202 assert_eq!(Some(&Num::new(100 + i)), vec.get(i));
1203 }
1204 }
1205 test_all_growth_types!(test);
1206 }
1207
1208 #[test]
1209 fn clone() {
1210 fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1211 assert!(vec.is_empty());
1212
1213 for i in 0..53 {
1214 vec.push(Num::new(i));
1215 }
1216
1217 let clone = vec.clone();
1218 assert_eq!(vec, clone);
1219 }
1220 test_all_growth_types!(test);
1221 }
1222
1223 #[test]
1224 fn slices() {
1225 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1226 #[cfg(not(miri))]
1227 const TARGET_LEN: usize = 184;
1228 #[cfg(miri)]
1229 const TARGET_LEN: usize = 41;
1230
1231 for i in 0..TARGET_LEN {
1232 assert_eq!(vec.slices(i..i + 1).len(), 0);
1233 assert_eq!(vec.slices(0..i + 1).len(), 0);
1234 vec.push(i);
1235 }
1236
1237 let slice = vec.slices(0..vec.len());
1238 let mut combined = Vec::new();
1239 for s in slice {
1240 combined.extend_from_slice(s);
1241 }
1242 for i in 0..TARGET_LEN {
1243 assert_eq!(i, vec[i]);
1244 assert_eq!(i, combined[i]);
1245 }
1246
1247 let begin = vec.len() / 4;
1248 let end = 3 * vec.len() / 4;
1249 let slice = vec.slices(begin..end);
1250 let mut combined = Vec::new();
1251 for s in slice {
1252 combined.extend_from_slice(s);
1253 }
1254 for i in begin..end {
1255 assert_eq!(i, vec[i]);
1256 assert_eq!(i, combined[i - begin]);
1257 }
1258 }
1259 test_all_growth_types!(test);
1260 }
1261
1262 #[test]
1263 fn slices_mut() {
1264 fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1265 for i in 0..84 {
1266 assert_eq!(vec.slices_mut(i..i + 1).len(), 0);
1267 assert_eq!(vec.slices_mut(0..i + 1).len(), 0);
1268 vec.push(i);
1269 }
1270
1271 let slice = vec.slices_mut(0..vec.len());
1272 let mut combined = Vec::new();
1273 for s in slice {
1274 combined.extend_from_slice(s);
1275 }
1276 for i in 0..84 {
1277 assert_eq!(i, vec[i]);
1278 assert_eq!(i, combined[i]);
1279 }
1280
1281 let begin = vec.len() / 4;
1282 let end = 3 * vec.len() / 4;
1283 let slice = vec.slices_mut(begin..end);
1284 let mut combined = Vec::new();
1285 for s in slice {
1286 combined.extend_from_slice(s);
1287 }
1288 for i in begin..end {
1289 assert_eq!(i, vec[i]);
1290 assert_eq!(i, combined[i - begin]);
1291 }
1292
1293 vec.clear();
1294
1295 for _ in 0..84 {
1296 vec.push(0);
1297 }
1298
1299 fn update<'a>(slice: impl Iterator<Item = &'a mut [usize]>, begin: usize) {
1300 let mut val = begin;
1301 for s in slice {
1302 for x in s {
1303 *x = val;
1304 val += 1;
1305 }
1306 }
1307 }
1308 let mut fill = |begin: usize, end: usize| {
1309 let range = begin..end;
1310 update(vec.slices_mut(range), begin);
1311 };
1312
1313 fill(0, 7);
1314 fill(7, 14);
1315 fill(14, 33);
1316 fill(33, 61);
1317 fill(61, 72);
1318 fill(72, 84);
1319 for i in 0..84 {
1320 assert_eq!(vec.get(i), Some(&i));
1321 }
1322 }
1323 test_all_growth_types!(test);
1324 }
1325
1326 #[test]
1327 fn set_len_get_ptr_mut() {
1328 let mut vec = SplitVec::with_doubling_growth();
1329 vec.push(0);
1330 vec.push(1);
1331 vec.push(2);
1332 vec.push(3);
1333 vec.push(4);
1334
1335 assert_eq!(vec.capacity(), 12);
1336
1337 for i in vec.len()..vec.capacity() {
1338 unsafe { *(vec.get_ptr_mut(i).expect("is-some")) = i };
1339 unsafe { vec.set_len(i + 1) };
1340
1341 assert_eq!(vec.get(i), Some(&i));
1342 }
1343
1344 for i in vec.capacity()..(vec.capacity() + 100) {
1345 assert!(vec.get_ptr_mut(i).is_none());
1346 }
1347 }
1348
1349 #[test]
1350 fn pseudo_default() {
1351 let vec = SplitVec::<String, Doubling>::pseudo_default();
1352 assert_eq!(vec.len(), 0);
1353
1354 let vec = SplitVec::<String, Recursive>::pseudo_default();
1355 assert_eq!(vec.len(), 0);
1356
1357 let vec = SplitVec::<String, Linear>::pseudo_default();
1358 assert_eq!(vec.len(), 0);
1359 }
1360}