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        self.len = 0;
280        if !self.fragments.is_empty() {
281            self.fragments.truncate(1);
282            self.fragments[0].clear();
283        }
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.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    /// Returns the view on the required `range` as a vector of slices:
671    ///
672    /// * returns an empty iterator if the range is out of bounds;
673    /// * returns an iterator with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
674    /// * returns an ordered iterator of slices when chained forms the required range.
675    ///
676    /// # Examples
677    ///
678    /// ```
679    /// use orx_split_vec::prelude::*;
680    ///
681    /// let mut vec = SplitVec::with_linear_growth(2);
682    ///
683    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
684    ///
685    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
686    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
687    /// assert_eq!(vec.fragments()[2], &[8, 9]);
688    ///
689    /// // single fragment
690    /// assert_eq!(vec![&[0, 1, 2, 3]], vec.slices(0..4).collect::<Vec<_>>());
691    /// assert_eq!(vec![&[5, 6]], vec.slices(5..7).collect::<Vec<_>>());
692    /// assert_eq!(vec![&[8, 9]], vec.slices(8..10).collect::<Vec<_>>());
693    ///
694    /// // Fragmented
695    /// assert_eq!(vec![&vec![3], &vec![4, 5]], vec.slices(3..6).collect::<Vec<_>>());
696    /// assert_eq!(vec![&vec![3], &vec![4, 5, 6, 7], &vec![8]], vec.slices(3..9).collect::<Vec<_>>());
697    /// assert_eq!(vec![&vec![7], &vec![8]], vec.slices(7..9).collect::<Vec<_>>());
698    ///
699    /// // OutOfBounds
700    /// assert_eq!(vec.slices(5..12).len(), 0);
701    /// assert_eq!(vec.slices(10..11).len(), 0);
702    /// ```
703    fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
704        Self::SliceIter::new(self, range)
705    }
706
707    /// Returns a mutable view on the required `range` as a vector of slices:
708    ///
709    /// * returns an empty iterator if the range is out of bounds;
710    /// * returns an iterator with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
711    /// * returns an ordered iterator of slices when chained forms the required range.
712    ///
713    /// # Examples
714    ///
715    /// ```
716    /// use orx_split_vec::prelude::*;
717    ///
718    /// let mut vec = SplitVec::with_linear_growth(2);
719    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
720    ///
721    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
722    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
723    /// assert_eq!(vec.fragments()[2], &[8, 9]);
724    ///
725    /// // single fragment
726    /// let mut slices = vec.slices_mut(0..4);
727    /// assert_eq!(slices.len(), 1);
728    /// let slice = slices.next().unwrap();
729    /// assert_eq!(slice, &[0, 1, 2, 3]);
730    /// slice[1] *= 10;
731    /// assert_eq!(vec.fragments()[0], &[0, 10, 2, 3]);
732    ///
733    /// // single fragment - partially
734    /// let mut slices = vec.slices_mut(5..7);
735    /// assert_eq!(slices.len(), 1);
736    /// let slice = slices.next().unwrap();
737    /// assert_eq!(slice, &[5, 6]);
738    /// slice[1] *= 10;
739    /// assert_eq!(vec.fragments()[1], &[4, 5, 60, 7]);
740    ///
741    /// // multiple fragments
742    /// let slices = vec.slices_mut(2..6);
743    /// assert_eq!(slices.len(), 2); // [2, 3] & [4, 5]
744    /// for s in slices {
745    ///     for x in s {
746    ///         *x *= 10;
747    ///     }
748    /// }
749    ///
750    /// assert_eq!(vec.fragments()[0], &[0, 10, 20, 30]);
751    /// assert_eq!(vec.fragments()[1], &[40, 50, 60, 7]);
752    /// assert_eq!(vec.fragments()[2], &[8, 9]);
753    ///
754    /// // out of bounds
755    /// assert_eq!(vec.slices_mut(5..12).len(), 0);
756    /// assert_eq!(vec.slices_mut(10..11).len(), 0);
757    /// ```
758    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    /// Returns a pointer to the `index`-th element of the vector.
783    ///
784    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
785    ///
786    /// Time complexity of the method is:
787    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
788    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
789    ///
790    /// # Safety
791    ///
792    /// This method allows to write to a memory which is greater than the vector's length.
793    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
794    ///
795    #[inline(always)]
796    fn get_ptr(&self, index: usize) -> Option<*const T> {
797        self.growth_get_ptr(index)
798    }
799
800    /// Returns a mutable pointer to the `index`-th element of the vector.
801    ///
802    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
803    ///
804    /// Time complexity of the method is:
805    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
806    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
807    ///
808    /// # Safety
809    ///
810    /// This method allows to write to a memory which is greater than the vector's length.
811    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
812    ///
813    #[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()); // panics
1371                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()), // will cause the panic
1380            PanicOnClone(42.to_string())
1381        ];
1382
1383        // Catch the panic but keep `vec` alive afterwards.
1384        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
1385            vec.extend_from_slice(&src);
1386        }));
1387        assert!(result.is_err());
1388
1389        // `len` was incremented before the clone panicked, so it now counts a slot
1390        // that was never initialized. This safe `get` reads that slot.
1391        if let Some(v) = vec.get(0) {
1392            let _ = v.0.len(); // touch the uninitialized String to force the read
1393        }
1394    }
1395}