Skip to main content

orx_split_vec/
pinned_vec.rs

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    /// Returns the index of the `element` with the given reference.
51    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
52    ///
53    /// Note that `T: Eq` is not required; reference equality is used.
54    ///
55    /// # Safety
56    ///
57    /// Since `SplitVec` implements `PinnedVec`, the underlying memory
58    /// of the vector stays pinned; i.e., is not carried to different memory
59    /// locations.
60    /// Therefore, it is possible and safe to compare an element's reference
61    /// to find its position in the vector.
62    ///
63    /// # Examples
64    ///
65    /// ```
66    /// use orx_split_vec::*;
67    ///
68    /// let mut vec = SplitVec::with_linear_growth(2);
69    /// for i in 0..4 {
70    ///     vec.push(10 * i);
71    /// }
72    ///
73    /// assert_eq!(Some(0), vec.index_of(&vec[0]));
74    /// assert_eq!(Some(1), vec.index_of(&vec[1]));
75    /// assert_eq!(Some(2), vec.index_of(&vec[2]));
76    /// assert_eq!(Some(3), vec.index_of(&vec[3]));
77    ///
78    /// // the following does not compile since vec[4] is out of bounds
79    /// // assert_eq!(Some(3), vec.index_of(&vec[4]));
80    ///
81    /// // num certainly does not belong to `vec`
82    /// let num = 42;
83    /// assert_eq!(None, vec.index_of(&num));
84    ///
85    /// // even if its value belongs
86    /// let num = 20;
87    /// assert_eq!(None, vec.index_of(&num));
88    ///
89    /// // as expected, querying elements of another vector will also fail
90    /// let eq_vec = vec![0, 10, 20, 30];
91    /// for i in 0..4 {
92    ///     assert_eq!(None, vec.index_of(&eq_vec[i]));
93    /// }
94    /// ```
95    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    /// Returns the index of the element of the vector that the `element_ptr` points to.
108    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
109    ///
110    /// Note that `T: Eq` is not required; reference equality is used.
111    ///
112    /// # Safety
113    ///
114    /// Since `SplitVec` implements `PinnedVec`, the underlying memory
115    /// of the vector stays pinned; i.e., is not carried to different memory
116    /// locations.
117    /// Therefore, it is possible and safe to compare an element's reference
118    /// to find its position in the vector.
119    fn index_of_ptr(&self, element_ptr: *const T) -> Option<usize> {
120        // TODO! # examples in docs
121        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                //
144                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    /// Returns whether or not the `element` with the given reference belongs to the vector.
166    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
167    ///
168    /// Note that `T: Eq` is not required; memory address is used.
169    ///
170    /// # Safety
171    ///
172    /// Since `FixedVec` implements `PinnedVec`, the underlying memory
173    /// of the vector stays pinned; i.e., is not carried to different memory
174    /// locations.
175    /// Therefore, it is possible and safe to compare an element's reference
176    /// to find its position in the vector.
177    ///
178    /// # Examples
179    ///
180    /// ```
181    /// use orx_split_vec::*;
182    ///
183    /// let mut vec = SplitVec::new();
184    /// for i in 0..4 {
185    ///     vec.push(10 * i);
186    /// }
187    ///
188    /// assert!(vec.contains_reference(&vec[0]));
189    /// assert!(vec.contains_reference(&vec[1]));
190    /// assert!(vec.contains_reference(&vec[2]));
191    /// assert!(vec.contains_reference(&vec[3]));
192    ///
193    /// // num certainly does not belong to `vec`
194    /// let num = 42;
195    /// assert!(!vec.contains_reference(&num));
196    ///
197    /// // even if its value belongs
198    /// let num = 20;
199    /// assert!(!vec.contains_reference(&num));
200    ///
201    /// // as expected, querying elements of another vector will also fail
202    /// let eq_vec = vec![0, 10, 20, 30];
203    /// for i in 0..4 {
204    ///     assert!(!vec.contains_reference(&eq_vec[i]));
205    /// }
206    /// ```
207    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    /// Returns whether or not the element with the given pointer belongs to the vector.
214    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
215    ///
216    /// Note that `T: Eq` is not required; memory address is used.
217    ///
218    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    /// Returns the total number of elements the split vector can hold without
225    /// reallocating.
226    ///
227    /// See `FragmentGrowth` for details of capacity growth policies.
228    ///
229    /// # Examples
230    ///
231    /// ```
232    /// use orx_split_vec::*;
233    ///
234    /// // default growth starting with 4, and doubling at each new fragment.
235    /// let mut vec = SplitVec::with_doubling_growth();
236    /// assert_eq!(4, vec.capacity());
237    ///
238    /// for i in 0..4 {
239    ///     vec.push(i);
240    /// }
241    /// assert_eq!(4, vec.capacity());
242    ///
243    /// vec.push(4);
244    /// assert_eq!(4 + 8, vec.capacity());
245    ///
246    /// ```
247    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    /// Clears the vector, removing all values.
259    ///
260    /// This method:
261    /// * drops all fragments except for the first one, and
262    /// * clears the first fragment.
263    ///
264    /// # Examples
265    ///
266    /// ```
267    /// use orx_split_vec::*;
268    ///
269    /// let mut vec = SplitVec::with_linear_growth(5);
270    /// for _ in 0..10 {
271    ///     vec.push(4.2);
272    /// }
273    ///
274    /// vec.clear();
275    ///
276    /// assert!(vec.is_empty());
277    /// ```
278    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    /// Clones and appends all elements in a slice to the vec.
287    ///
288    /// Iterates over the slice `other`, clones each element, and then appends
289    /// it to this vector. The `other` slice is traversed in-order.
290    ///
291    /// # Examples
292    ///
293    /// ```
294    /// use orx_split_vec::*;
295    ///
296    /// let mut vec = SplitVec::with_linear_growth(4);
297    /// vec.push(1);
298    /// vec.push(2);
299    /// vec.push(3);
300    /// assert_eq!(vec, [1, 2, 3]);
301    ///
302    /// vec.extend_from_slice(&[4, 5, 6, 7]);
303    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6, 7]);
304    /// ```
305    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    /// Returns a reference to the element with the given `index`;
371    /// None if index is out of bounds.
372    ///
373    /// # Examples
374    ///
375    /// ```
376    /// use orx_split_vec::*;
377    ///
378    /// let mut vec = SplitVec::with_linear_growth(5);
379    /// vec.extend_from_slice(&[10, 40, 30]);
380    /// assert_eq!(Some(&40), vec.get(1));
381    /// assert_eq!(None, vec.get(3));
382    /// ```
383    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    /// Returns a mutable reference to the element with the given `index`;
389    /// None if index is out of bounds.
390    ///
391    /// # Examples
392    ///
393    /// ```
394    /// use orx_split_vec::*;
395    ///
396    /// let mut vec = SplitVec::with_linear_growth(5);
397    /// vec.extend_from_slice(&[0, 1, 2]);
398    ///
399    /// if let Some(elem) = vec.get_mut(1) {
400    ///     *elem = 42;
401    /// }
402    ///
403    /// assert_eq!(vec, &[0, 42, 2]);
404    /// ```
405    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    /// Returns a reference to an element or sub-slice, without doing bounds checking.
411    ///
412    /// For a safe alternative see `get`.
413    ///
414    /// # Safety
415    ///
416    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
417    /// even if the resulting reference is not used.
418    unsafe fn get_unchecked(&self, index: usize) -> &T {
419        self.get(index).expect("out-of-bounds")
420    }
421
422    /// Returns a mutable reference to an element or sub-slice, without doing bounds checking.
423    ///
424    /// For a safe alternative see `get_mut`.
425    ///
426    /// # Safety
427    ///
428    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
429    /// even if the resulting reference is not used.
430    unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
431        self.get_mut(index).expect("out-of-bounds")
432    }
433
434    /// Returns a reference to the first element of the vector; returns None if the vector is empty.
435    ///
436    /// # Examples
437    ///
438    /// ```
439    /// use orx_split_vec::*;
440    ///
441    /// let mut vec = SplitVec::new();
442    /// assert!(vec.first().is_none());
443    ///
444    /// vec.push(42);
445    /// assert_eq!(Some(&42), vec.first());
446    ///
447    /// vec.push(864121);
448    /// assert_eq!(Some(&42), vec.first());
449    ///
450    /// vec.insert(0, 7);
451    /// assert_eq!(Some(&7), vec.first());
452    /// ```
453    #[inline(always)]
454    fn first(&self) -> Option<&T> {
455        self.fragments.first().and_then(|x| x.first())
456    }
457
458    /// Returns a reference to the last element of the vector; returns None if the vector is empty.
459    ///
460    /// # Examples
461    ///
462    /// ```
463    /// use orx_split_vec::*;
464    ///
465    /// let mut vec = SplitVec::new();
466    /// assert!(vec.last().is_none());
467    ///
468    /// vec.push(42);
469    /// assert_eq!(Some(&42), vec.last());
470    ///
471    /// vec.push(7);
472    /// assert_eq!(Some(&7), vec.last());
473    ///
474    /// vec.insert(0, 684321);
475    /// assert_eq!(Some(&7), vec.last());
476    /// ```
477    #[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            // make room for one
498            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    /// Returns `true` if the vector contains no elements.
530    ///
531    /// # Examples
532    ///
533    /// ```
534    /// use orx_split_vec::*;
535    ///
536    /// let mut vec = SplitVec::with_linear_growth(2);
537    /// assert!(vec.is_empty());
538    /// vec.push(1);
539    /// assert!(!vec.is_empty());
540    /// ```
541    fn is_empty(&self) -> bool {
542        self.len == 0
543    }
544
545    /// Returns the number of elements in the vector, also referred to
546    /// as its 'length'.
547    ///
548    /// # Examples
549    ///
550    /// ```
551    /// use orx_split_vec::*;
552    ///
553    /// let mut vec =  SplitVec::with_linear_growth(8);
554    /// assert_eq!(0, vec.len());
555    /// vec.push(1);
556    /// vec.push(2);
557    /// vec.push(3);
558    /// assert_eq!(3, vec.len());
559    /// ```
560    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    /// Appends an element to the back of a collection.
589    ///
590    /// # Examples
591    ///
592    /// ```
593    /// use orx_split_vec::*;
594    ///
595    /// let mut vec = SplitVec::with_linear_growth(16);
596    /// vec.push(1);
597    /// vec.push(2);
598    /// vec.push(3);
599    /// assert_eq!(vec, [1, 2, 3]);
600    /// ```
601    fn push(&mut self, value: T) {
602        if !self.has_capacity_for_one() {
603            self.add_fragment(); // may panic; self.len is unchanged on unwind
604        }
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.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    /// Returns the view on the required `range` as a vector of slices:
670    ///
671    /// * returns an empty iterator if the range is out of bounds;
672    /// * returns an iterator with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
673    /// * returns an ordered iterator of slices when chained forms the required range.
674    ///
675    /// # Examples
676    ///
677    /// ```
678    /// use orx_split_vec::prelude::*;
679    ///
680    /// let mut vec = SplitVec::with_linear_growth(2);
681    ///
682    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
683    ///
684    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
685    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
686    /// assert_eq!(vec.fragments()[2], &[8, 9]);
687    ///
688    /// // single fragment
689    /// assert_eq!(vec![&[0, 1, 2, 3]], vec.slices(0..4).collect::<Vec<_>>());
690    /// assert_eq!(vec![&[5, 6]], vec.slices(5..7).collect::<Vec<_>>());
691    /// assert_eq!(vec![&[8, 9]], vec.slices(8..10).collect::<Vec<_>>());
692    ///
693    /// // Fragmented
694    /// assert_eq!(vec![&vec![3], &vec![4, 5]], vec.slices(3..6).collect::<Vec<_>>());
695    /// assert_eq!(vec![&vec![3], &vec![4, 5, 6, 7], &vec![8]], vec.slices(3..9).collect::<Vec<_>>());
696    /// assert_eq!(vec![&vec![7], &vec![8]], vec.slices(7..9).collect::<Vec<_>>());
697    ///
698    /// // OutOfBounds
699    /// assert_eq!(vec.slices(5..12).len(), 0);
700    /// assert_eq!(vec.slices(10..11).len(), 0);
701    /// ```
702    fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
703        Self::SliceIter::new(self, range)
704    }
705
706    /// Returns a mutable view on the required `range` as a vector of slices:
707    ///
708    /// * returns an empty iterator if the range is out of bounds;
709    /// * returns an iterator with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
710    /// * returns an ordered iterator of slices when chained forms the required range.
711    ///
712    /// # Examples
713    ///
714    /// ```
715    /// use orx_split_vec::prelude::*;
716    ///
717    /// let mut vec = SplitVec::with_linear_growth(2);
718    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
719    ///
720    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
721    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
722    /// assert_eq!(vec.fragments()[2], &[8, 9]);
723    ///
724    /// // single fragment
725    /// let mut slices = vec.slices_mut(0..4);
726    /// assert_eq!(slices.len(), 1);
727    /// let slice = slices.next().unwrap();
728    /// assert_eq!(slice, &[0, 1, 2, 3]);
729    /// slice[1] *= 10;
730    /// assert_eq!(vec.fragments()[0], &[0, 10, 2, 3]);
731    ///
732    /// // single fragment - partially
733    /// let mut slices = vec.slices_mut(5..7);
734    /// assert_eq!(slices.len(), 1);
735    /// let slice = slices.next().unwrap();
736    /// assert_eq!(slice, &[5, 6]);
737    /// slice[1] *= 10;
738    /// assert_eq!(vec.fragments()[1], &[4, 5, 60, 7]);
739    ///
740    /// // multiple fragments
741    /// let slices = vec.slices_mut(2..6);
742    /// assert_eq!(slices.len(), 2); // [2, 3] & [4, 5]
743    /// for s in slices {
744    ///     for x in s {
745    ///         *x *= 10;
746    ///     }
747    /// }
748    ///
749    /// assert_eq!(vec.fragments()[0], &[0, 10, 20, 30]);
750    /// assert_eq!(vec.fragments()[1], &[40, 50, 60, 7]);
751    /// assert_eq!(vec.fragments()[2], &[8, 9]);
752    ///
753    /// // out of bounds
754    /// assert_eq!(vec.slices_mut(5..12).len(), 0);
755    /// assert_eq!(vec.slices_mut(10..11).len(), 0);
756    /// ```
757    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    /// Returns a pointer to the `index`-th element of the vector.
782    ///
783    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
784    ///
785    /// Time complexity of the method is:
786    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
787    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
788    ///
789    /// # Safety
790    ///
791    /// This method allows to write to a memory which is greater than the vector's length.
792    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
793    ///
794    #[inline(always)]
795    fn get_ptr(&self, index: usize) -> Option<*const T> {
796        self.growth_get_ptr(index)
797    }
798
799    /// Returns a mutable pointer to the `index`-th element of the vector.
800    ///
801    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
802    ///
803    /// Time complexity of the method is:
804    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
805    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
806    ///
807    /// # Safety
808    ///
809    /// This method allows to write to a memory which is greater than the vector's length.
810    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
811    ///
812    #[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
1361    #[test]
1362    fn extend_from_slice_panic_safety() {
1363        use alloc::string::ToString;
1364
1365        struct PanicOnClone(String);
1366
1367        impl Clone for PanicOnClone {
1368            fn clone(&self) -> Self {
1369                assert_eq!(self.0, 42.to_string()); // panics
1370                Self(self.0.clone())
1371            }
1372        }
1373
1374        let mut vec = SplitVec::new();
1375        let src = alloc::vec![
1376            PanicOnClone(42.to_string()),
1377            PanicOnClone(42.to_string()),
1378            PanicOnClone(7.to_string()), // will cause the panic
1379            PanicOnClone(42.to_string())
1380        ];
1381
1382        // Catch the panic but keep `vec` alive afterwards.
1383        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
1384            vec.extend_from_slice(&src);
1385        }));
1386        assert!(result.is_err());
1387
1388        // `len` was incremented before the clone panicked, so it now counts a slot
1389        // that was never initialized. This safe `get` reads that slot.
1390        if let Some(v) = vec.get(0) {
1391            let _ = v.0.len(); // touch the uninitialized String to force the read
1392        }
1393    }
1394}