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(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.data, 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.data, element_ptr) {
124                return Some(count + index);
125            } else {
126                count += fragment.len()
127            }
128        }
129        None
130    }
131
132    fn push_get_ptr(&mut self, value: T) -> *const T {
133        self.len += 1;
134        match self.has_capacity_for_one() {
135            true => {
136                let f = self.fragments.len() - 1;
137                let fragment = &mut self.fragments[f];
138                let idx = fragment.len();
139                fragment.push(value);
140                unsafe { fragment.as_ptr().add(idx) }
141            }
142            false => {
143                //
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        self.len += other.len();
310        let mut slice = other;
311        while !slice.is_empty() {
312            if !self.has_capacity_for_one() {
313                self.add_fragment();
314            }
315            let f = self.fragments.len() - 1;
316
317            let last = &mut self.fragments[f];
318            let available = last.room();
319
320            match available < slice.len() {
321                true => {
322                    last.extend_from_slice(&slice[0..available]);
323                    slice = &slice[available..];
324                    self.add_fragment();
325                }
326                false => {
327                    last.extend_from_slice(slice);
328                    break;
329                }
330            }
331        }
332    }
333
334    unsafe fn extend_from_nonoverlapping(&mut self, mut src: *const T, count: usize) {
335        self.len += count;
336        let mut left = count;
337        while left > 0 {
338            if !self.has_capacity_for_one() {
339                self.add_fragment();
340            }
341            let f = self.fragments.len() - 1;
342
343            let last = &mut self.fragments[f];
344            let last_len = last.len();
345            let last_available = last.room();
346
347            let dst = unsafe { last.as_mut_ptr().add(last.len()) };
348            match last_available < left {
349                true => {
350                    unsafe { dst.copy_from_nonoverlapping(src, last_available) };
351                    unsafe { last.set_len(last_len + last_available) };
352                    debug_assert_eq!(last.len(), last.capacity());
353
354                    src = unsafe { src.add(last_available) };
355                    left -= last_available;
356
357                    self.add_fragment();
358                }
359                false => {
360                    unsafe { dst.copy_from_nonoverlapping(src, left) };
361                    unsafe { last.set_len(last_len + left) };
362                    break;
363                }
364            }
365        }
366    }
367
368    /// Returns a reference to the element with the given `index`;
369    /// None if index is out of bounds.
370    ///
371    /// # Examples
372    ///
373    /// ```
374    /// use orx_split_vec::*;
375    ///
376    /// let mut vec = SplitVec::with_linear_growth(5);
377    /// vec.extend_from_slice(&[10, 40, 30]);
378    /// assert_eq!(Some(&40), vec.get(1));
379    /// assert_eq!(None, vec.get(3));
380    /// ```
381    fn get(&self, index: usize) -> Option<&T> {
382        self.get_fragment_and_inner_indices(index)
383            .map(|(f, i)| unsafe { self.fragments.get_unchecked(f).get_unchecked(i) })
384    }
385
386    /// Returns a mutable reference to the element with the given `index`;
387    /// None if index is out of bounds.
388    ///
389    /// # Examples
390    ///
391    /// ```
392    /// use orx_split_vec::*;
393    ///
394    /// let mut vec = SplitVec::with_linear_growth(5);
395    /// vec.extend_from_slice(&[0, 1, 2]);
396    ///
397    /// if let Some(elem) = vec.get_mut(1) {
398    ///     *elem = 42;
399    /// }
400    ///
401    /// assert_eq!(vec, &[0, 42, 2]);
402    /// ```
403    fn get_mut(&mut self, index: usize) -> Option<&mut T> {
404        self.get_fragment_and_inner_indices(index)
405            .map(|(f, i)| unsafe { self.fragments.get_unchecked_mut(f).get_unchecked_mut(i) })
406    }
407
408    /// Returns a reference to an element or sub-slice, without doing bounds checking.
409    ///
410    /// For a safe alternative see `get`.
411    ///
412    /// # Safety
413    ///
414    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
415    /// even if the resulting reference is not used.
416    unsafe fn get_unchecked(&self, index: usize) -> &T {
417        self.get(index).expect("out-of-bounds")
418    }
419
420    /// Returns a mutable reference to an element or sub-slice, without doing bounds checking.
421    ///
422    /// For a safe alternative see `get_mut`.
423    ///
424    /// # Safety
425    ///
426    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
427    /// even if the resulting reference is not used.
428    unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
429        self.get_mut(index).expect("out-of-bounds")
430    }
431
432    /// Returns a reference to the first element of the vector; returns None if the vector is empty.
433    ///
434    /// # Examples
435    ///
436    /// ```
437    /// use orx_split_vec::*;
438    ///
439    /// let mut vec = SplitVec::new();
440    /// assert!(vec.first().is_none());
441    ///
442    /// vec.push(42);
443    /// assert_eq!(Some(&42), vec.first());
444    ///
445    /// vec.push(864121);
446    /// assert_eq!(Some(&42), vec.first());
447    ///
448    /// vec.insert(0, 7);
449    /// assert_eq!(Some(&7), vec.first());
450    /// ```
451    #[inline(always)]
452    fn first(&self) -> Option<&T> {
453        self.fragments.first().and_then(|x| x.first())
454    }
455
456    /// Returns a reference to the last element of the vector; returns None if the vector is empty.
457    ///
458    /// # Examples
459    ///
460    /// ```
461    /// use orx_split_vec::*;
462    ///
463    /// let mut vec = SplitVec::new();
464    /// assert!(vec.last().is_none());
465    ///
466    /// vec.push(42);
467    /// assert_eq!(Some(&42), vec.last());
468    ///
469    /// vec.push(7);
470    /// assert_eq!(Some(&7), vec.last());
471    ///
472    /// vec.insert(0, 684321);
473    /// assert_eq!(Some(&7), vec.last());
474    /// ```
475    #[inline(always)]
476    fn last(&self) -> Option<&T> {
477        self.fragments.last().and_then(|x| x.last())
478    }
479
480    #[inline(always)]
481    unsafe fn first_unchecked(&self) -> &T {
482        unsafe { self.fragments.get_unchecked(0).get_unchecked(0) }
483    }
484
485    #[inline(always)]
486    unsafe fn last_unchecked(&self) -> &T {
487        let fragment = unsafe { self.fragments.get_unchecked(self.fragments.len() - 1) };
488        unsafe { fragment.get_unchecked(fragment.len() - 1) }
489    }
490
491    fn insert(&mut self, index: usize, value: T) {
492        if index == self.len {
493            self.push(value);
494        } else {
495            // make room for one
496            if !self.has_capacity_for_one() {
497                self.add_fragment();
498            }
499
500            let (f, i) = self
501                .get_fragment_and_inner_indices(index)
502                .expect("out-of-bounds");
503
504            if self.fragments[f].has_capacity_for_one() {
505                self.fragments[f].insert(i, value);
506            } else {
507                let mut popped = self.fragments[f].pop().expect("no-way!");
508                self.fragments[f].insert(i, value);
509                let mut f = f;
510                loop {
511                    f += 1;
512
513                    if self.fragments[f].has_capacity_for_one() {
514                        self.fragments[f].insert(0, popped);
515                        break;
516                    } else {
517                        let new_popped = self.fragments[f].pop().expect("no-way");
518                        self.fragments[f].insert(0, popped);
519                        popped = new_popped;
520                    }
521                }
522            }
523            self.len += 1;
524        }
525    }
526
527    /// Returns `true` if the vector contains no elements.
528    ///
529    /// # Examples
530    ///
531    /// ```
532    /// use orx_split_vec::*;
533    ///
534    /// let mut vec = SplitVec::with_linear_growth(2);
535    /// assert!(vec.is_empty());
536    /// vec.push(1);
537    /// assert!(!vec.is_empty());
538    /// ```
539    fn is_empty(&self) -> bool {
540        self.len == 0
541    }
542
543    /// Returns the number of elements in the vector, also referred to
544    /// as its 'length'.
545    ///
546    /// # Examples
547    ///
548    /// ```
549    /// use orx_split_vec::*;
550    ///
551    /// let mut vec =  SplitVec::with_linear_growth(8);
552    /// assert_eq!(0, vec.len());
553    /// vec.push(1);
554    /// vec.push(2);
555    /// vec.push(3);
556    /// assert_eq!(3, vec.len());
557    /// ```
558    fn len(&self) -> usize {
559        self.len
560    }
561
562    fn pop(&mut self) -> Option<T> {
563        if self.fragments.is_empty() {
564            None
565        } else {
566            let f = self.fragments.len() - 1;
567            if self.fragments[f].is_empty() {
568                if f == 0 {
569                    None
570                } else {
571                    self.len -= 1;
572                    self.fragments.pop();
573                    self.fragments[f - 1].pop()
574                }
575            } else {
576                self.len -= 1;
577                let popped = self.fragments[f].pop();
578                if self.fragments[f].is_empty() {
579                    self.fragments.pop();
580                }
581                popped
582            }
583        }
584    }
585
586    /// Appends an element to the back of a collection.
587    ///
588    /// # Examples
589    ///
590    /// ```
591    /// use orx_split_vec::*;
592    ///
593    /// let mut vec = SplitVec::with_linear_growth(16);
594    /// vec.push(1);
595    /// vec.push(2);
596    /// vec.push(3);
597    /// assert_eq!(vec, [1, 2, 3]);
598    /// ```
599    fn push(&mut self, value: T) {
600        self.len += 1;
601        match self.has_capacity_for_one() {
602            true => {
603                let last_f = self.fragments.len() - 1;
604                self.fragments[last_f].push(value);
605            }
606            false => self.add_fragment_with_first_value(value),
607        }
608    }
609
610    fn remove(&mut self, index: usize) -> T {
611        self.drop_last_empty_fragment();
612
613        let (f, i) = self
614            .get_fragment_and_inner_indices(index)
615            .expect("out-of-bounds");
616
617        let value = self.fragments[f].remove(i);
618
619        for f2 in f + 1..self.fragments.len() {
620            let x = self.fragments[f2].remove(0);
621            self.fragments[f2 - 1].push(x);
622            if self.fragments[f2].is_empty() {
623                self.fragments.remove(f2);
624                break;
625            }
626        }
627
628        self.drop_last_empty_fragment();
629
630        self.len -= 1;
631        value
632    }
633
634    fn swap(&mut self, a: usize, b: usize) {
635        let (af, ai) = self
636            .get_fragment_and_inner_indices(a)
637            .expect("first index is out-of-bounds");
638        let (bf, bi) = self
639            .get_fragment_and_inner_indices(b)
640            .expect("second index out-of-bounds");
641        if af == bf {
642            self.fragments[af].swap(ai, bi);
643        } else {
644            let ptr_a = unsafe { self.fragments[af].as_mut_ptr().add(ai) };
645            let ref_a = unsafe { &mut *ptr_a };
646            let ref_b = &mut self.fragments[bf][bi];
647            core::mem::swap(ref_a, ref_b);
648        }
649    }
650
651    fn truncate(&mut self, len: usize) {
652        if let Some((f, i)) = self.get_fragment_and_inner_indices(len) {
653            self.fragments.truncate(f + 1);
654            self.fragments[f].truncate(i);
655            self.len = len;
656
657            self.drop_last_empty_fragment();
658        }
659    }
660
661    fn iter_rev(&self) -> Self::IterRev<'_> {
662        Self::IterRev::new(&self.fragments)
663    }
664
665    fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
666        Self::IterMutRev::new(&mut self.fragments)
667    }
668
669    /// 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}