orx_split_vec/
pinned_vec.rs

1use crate::common_traits::iterator::iter_ptr::IterPtr;
2use crate::common_traits::iterator::iter_ptr_bwd::IterPtrBackward;
3use crate::fragment::fragment_struct::set_fragments_len;
4use crate::range_helpers::{range_end, range_start};
5use crate::{algorithms, Fragment, Growth, SplitVec};
6use alloc::vec::Vec;
7use core::cmp::Ordering;
8use core::ops::RangeBounds;
9use orx_iterable::Collection;
10use orx_pinned_vec::utils::slice;
11use orx_pinned_vec::{CapacityState, PinnedVec};
12use orx_pseudo_default::PseudoDefault;
13
14impl<T, G: Growth> PseudoDefault for SplitVec<T, G> {
15    fn pseudo_default() -> Self {
16        let growth = G::pseudo_default();
17        let capacity = growth.first_fragment_capacity();
18        let fragments = alloc::vec![Fragment::new(capacity)];
19        Self::from_raw_parts(0, fragments, growth)
20    }
21}
22
23impl<T, G: Growth> PinnedVec<T> for SplitVec<T, G> {
24    type IterRev<'a>
25        = crate::common_traits::iterator::iter_rev::IterRev<'a, T>
26    where
27        T: 'a,
28        Self: 'a;
29    type IterMutRev<'a>
30        = crate::common_traits::iterator::iter_mut_rev::IterMutRev<'a, T>
31    where
32        T: 'a,
33        Self: 'a;
34    type SliceIter<'a>
35        = Vec<&'a [T]>
36    where
37        T: 'a,
38        Self: 'a;
39    type SliceMutIter<'a>
40        = Vec<&'a mut [T]>
41    where
42        T: 'a,
43        Self: 'a;
44
45    /// Returns the index of the `element` with the given reference.
46    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
47    ///
48    /// Note that `T: Eq` is not required; reference equality is used.
49    ///
50    /// # Safety
51    ///
52    /// Since `SplitVec` implements `PinnedVec`, the underlying memory
53    /// of the vector stays pinned; i.e., is not carried to different memory
54    /// locations.
55    /// Therefore, it is possible and safe to compare an element's reference
56    /// to find its position in the vector.
57    ///
58    /// # Examples
59    ///
60    /// ```
61    /// use orx_split_vec::*;
62    ///
63    /// let mut vec = SplitVec::with_linear_growth(2);
64    /// for i in 0..4 {
65    ///     vec.push(10 * i);
66    /// }
67    ///
68    /// assert_eq!(Some(0), vec.index_of(&vec[0]));
69    /// assert_eq!(Some(1), vec.index_of(&vec[1]));
70    /// assert_eq!(Some(2), vec.index_of(&vec[2]));
71    /// assert_eq!(Some(3), vec.index_of(&vec[3]));
72    ///
73    /// // the following does not compile since vec[4] is out of bounds
74    /// // assert_eq!(Some(3), vec.index_of(&vec[4]));
75    ///
76    /// // num certainly does not belong to `vec`
77    /// let num = 42;
78    /// assert_eq!(None, vec.index_of(&num));
79    ///
80    /// // even if its value belongs
81    /// let num = 20;
82    /// assert_eq!(None, vec.index_of(&num));
83    ///
84    /// // as expected, querying elements of another vector will also fail
85    /// let eq_vec = vec![0, 10, 20, 30];
86    /// for i in 0..4 {
87    ///     assert_eq!(None, vec.index_of(&eq_vec[i]));
88    /// }
89    /// ```
90    fn index_of(&self, element: &T) -> Option<usize> {
91        let mut count = 0;
92        for fragment in &self.fragments {
93            if let Some(index) = slice::index_of(&fragment.data, element) {
94                return Some(count + index);
95            } else {
96                count += fragment.len()
97            }
98        }
99        None
100    }
101
102    /// Returns the index of the element of the vector that the `element_ptr` points to.
103    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
104    ///
105    /// Note that `T: Eq` is not required; reference equality is used.
106    ///
107    /// # Safety
108    ///
109    /// Since `SplitVec` implements `PinnedVec`, the underlying memory
110    /// of the vector stays pinned; i.e., is not carried to different memory
111    /// locations.
112    /// Therefore, it is possible and safe to compare an element's reference
113    /// to find its position in the vector.
114    fn index_of_ptr(&self, element_ptr: *const T) -> Option<usize> {
115        // TODO! # examples in docs
116        let mut count = 0;
117        for fragment in &self.fragments {
118            if let Some(index) = slice::index_of_ptr(&fragment.data, element_ptr) {
119                return Some(count + index);
120            } else {
121                count += fragment.len()
122            }
123        }
124        None
125    }
126
127    fn push_get_ptr(&mut self, value: T) -> *const T {
128        self.len += 1;
129        match self.has_capacity_for_one() {
130            true => {
131                let f = self.fragments.len() - 1;
132                let fragment = &mut self.fragments[f];
133                let idx = fragment.len();
134                fragment.push(value);
135                unsafe { fragment.as_ptr().add(idx) }
136            }
137            false => {
138                //
139                self.add_fragment_with_first_value(value);
140                let f = self.fragments.len() - 1;
141                self.fragments[f].as_ptr()
142            }
143        }
144    }
145
146    unsafe fn iter_ptr<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
147    where
148        T: 'i,
149    {
150        IterPtr::from(self.fragments.as_slice())
151    }
152
153    unsafe fn iter_ptr_rev<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
154    where
155        T: 'i,
156    {
157        IterPtrBackward::from(self.fragments.as_slice())
158    }
159
160    /// Returns whether or not the `element` with the given reference belongs to the vector.
161    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
162    ///
163    /// Note that `T: Eq` is not required; memory address is used.
164    ///
165    /// # Safety
166    ///
167    /// Since `FixedVec` implements `PinnedVec`, the underlying memory
168    /// of the vector stays pinned; i.e., is not carried to different memory
169    /// locations.
170    /// Therefore, it is possible and safe to compare an element's reference
171    /// to find its position in the vector.
172    ///
173    /// # Examples
174    ///
175    /// ```
176    /// use orx_split_vec::*;
177    ///
178    /// let mut vec = SplitVec::new();
179    /// for i in 0..4 {
180    ///     vec.push(10 * i);
181    /// }
182    ///
183    /// assert!(vec.contains_reference(&vec[0]));
184    /// assert!(vec.contains_reference(&vec[1]));
185    /// assert!(vec.contains_reference(&vec[2]));
186    /// assert!(vec.contains_reference(&vec[3]));
187    ///
188    /// // num certainly does not belong to `vec`
189    /// let num = 42;
190    /// assert!(!vec.contains_reference(&num));
191    ///
192    /// // even if its value belongs
193    /// let num = 20;
194    /// assert!(!vec.contains_reference(&num));
195    ///
196    /// // as expected, querying elements of another vector will also fail
197    /// let eq_vec = vec![0, 10, 20, 30];
198    /// for i in 0..4 {
199    ///     assert!(!vec.contains_reference(&eq_vec[i]));
200    /// }
201    /// ```
202    fn contains_reference(&self, element: &T) -> bool {
203        self.fragments
204            .iter()
205            .any(|fragment| slice::contains_reference(fragment.as_slice(), element))
206    }
207
208    /// Returns whether or not the element with the given pointer belongs to the vector.
209    /// This method has *O(f)* time complexity where `f << vec.len()` is the number of fragments.
210    ///
211    /// Note that `T: Eq` is not required; memory address is used.
212    ///
213    fn contains_ptr(&self, element_ptr: *const T) -> bool {
214        self.fragments
215            .iter()
216            .any(|fragment| slice::contains_ptr(fragment.as_slice(), element_ptr))
217    }
218
219    /// Returns the total number of elements the split vector can hold without
220    /// reallocating.
221    ///
222    /// See `FragmentGrowth` for details of capacity growth policies.
223    ///
224    /// # Examples
225    ///
226    /// ```
227    /// use orx_split_vec::*;
228    ///
229    /// // default growth starting with 4, and doubling at each new fragment.
230    /// let mut vec = SplitVec::with_doubling_growth();
231    /// assert_eq!(4, vec.capacity());
232    ///
233    /// for i in 0..4 {
234    ///     vec.push(i);
235    /// }
236    /// assert_eq!(4, vec.capacity());
237    ///
238    /// vec.push(4);
239    /// assert_eq!(4 + 8, vec.capacity());
240    ///
241    /// ```
242    fn capacity(&self) -> usize {
243        self.fragments.iter().map(|f| f.capacity()).sum()
244    }
245
246    fn capacity_state(&self) -> CapacityState {
247        CapacityState::DynamicCapacity {
248            current_capacity: self.capacity(),
249            maximum_concurrent_capacity: self.maximum_concurrent_capacity(),
250        }
251    }
252
253    /// Clears the vector, removing all values.
254    ///
255    /// This method:
256    /// * drops all fragments except for the first one, and
257    /// * clears the first fragment.
258    ///
259    /// # Examples
260    ///
261    /// ```
262    /// use orx_split_vec::*;
263    ///
264    /// let mut vec = SplitVec::with_linear_growth(5);
265    /// for _ in 0..10 {
266    ///     vec.push(4.2);
267    /// }
268    ///
269    /// vec.clear();
270    ///
271    /// assert!(vec.is_empty());
272    /// ```
273    fn clear(&mut self) {
274        if !self.fragments.is_empty() {
275            self.fragments.truncate(1);
276            self.fragments[0].clear();
277        }
278        self.len = 0;
279    }
280
281    /// Clones and appends all elements in a slice to the vec.
282    ///
283    /// Iterates over the slice `other`, clones each element, and then appends
284    /// it to this vector. The `other` slice is traversed in-order.
285    ///
286    /// # Examples
287    ///
288    /// ```
289    /// use orx_split_vec::*;
290    ///
291    /// let mut vec = SplitVec::with_linear_growth(4);
292    /// vec.push(1);
293    /// vec.push(2);
294    /// vec.push(3);
295    /// assert_eq!(vec, [1, 2, 3]);
296    ///
297    /// vec.extend_from_slice(&[4, 5, 6, 7]);
298    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6, 7]);
299    /// ```
300    fn extend_from_slice(&mut self, other: &[T])
301    where
302        T: Clone,
303    {
304        self.len += other.len();
305        let mut slice = other;
306        while !slice.is_empty() {
307            if !self.has_capacity_for_one() {
308                self.add_fragment();
309            }
310            let f = self.fragments.len() - 1;
311
312            let last = &mut self.fragments[f];
313            let available = last.room();
314
315            if available < slice.len() {
316                last.extend_from_slice(&slice[0..available]);
317                slice = &slice[available..];
318                self.add_fragment();
319            } else {
320                last.extend_from_slice(slice);
321                break;
322            }
323        }
324    }
325
326    /// Returns a reference to the element with the given `index`;
327    /// None if index is out of bounds.
328    ///
329    /// # Examples
330    ///
331    /// ```
332    /// use orx_split_vec::*;
333    ///
334    /// let mut vec = SplitVec::with_linear_growth(5);
335    /// vec.extend_from_slice(&[10, 40, 30]);
336    /// assert_eq!(Some(&40), vec.get(1));
337    /// assert_eq!(None, vec.get(3));
338    /// ```
339    fn get(&self, index: usize) -> Option<&T> {
340        self.get_fragment_and_inner_indices(index)
341            .map(|(f, i)| unsafe { self.fragments.get_unchecked(f).get_unchecked(i) })
342    }
343
344    /// Returns a mutable reference to the element with the given `index`;
345    /// None if index is out of bounds.
346    ///
347    /// # Examples
348    ///
349    /// ```
350    /// use orx_split_vec::*;
351    ///
352    /// let mut vec = SplitVec::with_linear_growth(5);
353    /// vec.extend_from_slice(&[0, 1, 2]);
354    ///
355    /// if let Some(elem) = vec.get_mut(1) {
356    ///     *elem = 42;
357    /// }
358    ///
359    /// assert_eq!(vec, &[0, 42, 2]);
360    /// ```
361    fn get_mut(&mut self, index: usize) -> Option<&mut T> {
362        self.get_fragment_and_inner_indices(index)
363            .map(|(f, i)| unsafe { self.fragments.get_unchecked_mut(f).get_unchecked_mut(i) })
364    }
365
366    /// Returns a reference to an element or sub-slice, without doing bounds checking.
367    ///
368    /// For a safe alternative see `get`.
369    ///
370    /// # Safety
371    ///
372    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
373    /// even if the resulting reference is not used.
374    unsafe fn get_unchecked(&self, index: usize) -> &T {
375        self.get(index).expect("out-of-bounds")
376    }
377
378    /// Returns a mutable reference to an element or sub-slice, without doing bounds checking.
379    ///
380    /// For a safe alternative see `get_mut`.
381    ///
382    /// # Safety
383    ///
384    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
385    /// even if the resulting reference is not used.
386    unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
387        self.get_mut(index).expect("out-of-bounds")
388    }
389
390    /// Returns a reference to the first element of the vector; returns None if the vector is empty.
391    ///
392    /// # Examples
393    ///
394    /// ```
395    /// use orx_split_vec::*;
396    ///
397    /// let mut vec = SplitVec::new();
398    /// assert!(vec.first().is_none());
399    ///
400    /// vec.push(42);
401    /// assert_eq!(Some(&42), vec.first());
402    ///
403    /// vec.push(864121);
404    /// assert_eq!(Some(&42), vec.first());
405    ///
406    /// vec.insert(0, 7);
407    /// assert_eq!(Some(&7), vec.first());
408    /// ```
409    #[inline(always)]
410    fn first(&self) -> Option<&T> {
411        self.fragments.first().and_then(|x| x.first())
412    }
413
414    /// Returns a reference to the last element of the vector; returns None if the vector is empty.
415    ///
416    /// # Examples
417    ///
418    /// ```
419    /// use orx_split_vec::*;
420    ///
421    /// let mut vec = SplitVec::new();
422    /// assert!(vec.last().is_none());
423    ///
424    /// vec.push(42);
425    /// assert_eq!(Some(&42), vec.last());
426    ///
427    /// vec.push(7);
428    /// assert_eq!(Some(&7), vec.last());
429    ///
430    /// vec.insert(0, 684321);
431    /// assert_eq!(Some(&7), vec.last());
432    /// ```
433    #[inline(always)]
434    fn last(&self) -> Option<&T> {
435        self.fragments.last().and_then(|x| x.last())
436    }
437
438    #[inline(always)]
439    unsafe fn first_unchecked(&self) -> &T {
440        self.fragments.get_unchecked(0).get_unchecked(0)
441    }
442
443    #[inline(always)]
444    unsafe fn last_unchecked(&self) -> &T {
445        let fragment = self.fragments.get_unchecked(self.fragments.len() - 1);
446        fragment.get_unchecked(fragment.len() - 1)
447    }
448
449    fn insert(&mut self, index: usize, value: T) {
450        if index == self.len {
451            self.push(value);
452        } else {
453            // make room for one
454            if !self.has_capacity_for_one() {
455                self.add_fragment();
456            }
457
458            let (f, i) = self
459                .get_fragment_and_inner_indices(index)
460                .expect("out-of-bounds");
461
462            if self.fragments[f].has_capacity_for_one() {
463                self.fragments[f].insert(i, value);
464            } else {
465                let mut popped = self.fragments[f].pop().expect("no-way!");
466                self.fragments[f].insert(i, value);
467                let mut f = f;
468                loop {
469                    f += 1;
470
471                    if self.fragments[f].has_capacity_for_one() {
472                        self.fragments[f].insert(0, popped);
473                        break;
474                    } else {
475                        let new_popped = self.fragments[f].pop().expect("no-way");
476                        self.fragments[f].insert(0, popped);
477                        popped = new_popped;
478                    }
479                }
480            }
481            self.len += 1;
482        }
483    }
484
485    /// Returns `true` if the vector contains no elements.
486    ///
487    /// # Examples
488    ///
489    /// ```
490    /// use orx_split_vec::*;
491    ///
492    /// let mut vec = SplitVec::with_linear_growth(2);
493    /// assert!(vec.is_empty());
494    /// vec.push(1);
495    /// assert!(!vec.is_empty());
496    /// ```
497    fn is_empty(&self) -> bool {
498        self.len == 0
499    }
500
501    /// Returns the number of elements in the vector, also referred to
502    /// as its 'length'.
503    ///
504    /// # Examples
505    ///
506    /// ```
507    /// use orx_split_vec::*;
508    ///
509    /// let mut vec =  SplitVec::with_linear_growth(8);
510    /// assert_eq!(0, vec.len());
511    /// vec.push(1);
512    /// vec.push(2);
513    /// vec.push(3);
514    /// assert_eq!(3, vec.len());
515    /// ```
516    fn len(&self) -> usize {
517        self.len
518    }
519
520    fn pop(&mut self) -> Option<T> {
521        if self.fragments.is_empty() {
522            None
523        } else {
524            let f = self.fragments.len() - 1;
525            if self.fragments[f].is_empty() {
526                if f == 0 {
527                    None
528                } else {
529                    self.len -= 1;
530                    self.fragments.pop();
531                    self.fragments[f - 1].pop()
532                }
533            } else {
534                self.len -= 1;
535                let popped = self.fragments[f].pop();
536                if self.fragments[f].is_empty() {
537                    self.fragments.pop();
538                }
539                popped
540            }
541        }
542    }
543
544    /// Appends an element to the back of a collection.
545    ///
546    /// # Examples
547    ///
548    /// ```
549    /// use orx_split_vec::*;
550    ///
551    /// let mut vec = SplitVec::with_linear_growth(16);
552    /// vec.push(1);
553    /// vec.push(2);
554    /// vec.push(3);
555    /// assert_eq!(vec, [1, 2, 3]);
556    /// ```
557    fn push(&mut self, value: T) {
558        self.len += 1;
559        match self.has_capacity_for_one() {
560            true => {
561                let last_f = self.fragments.len() - 1;
562                self.fragments[last_f].push(value);
563            }
564            false => self.add_fragment_with_first_value(value),
565        }
566    }
567
568    fn remove(&mut self, index: usize) -> T {
569        self.drop_last_empty_fragment();
570
571        let (f, i) = self
572            .get_fragment_and_inner_indices(index)
573            .expect("out-of-bounds");
574
575        let value = self.fragments[f].remove(i);
576
577        for f2 in f + 1..self.fragments.len() {
578            let x = self.fragments[f2].remove(0);
579            self.fragments[f2 - 1].push(x);
580            if self.fragments[f2].is_empty() {
581                self.fragments.remove(f2);
582                break;
583            }
584        }
585
586        self.drop_last_empty_fragment();
587
588        self.len -= 1;
589        value
590    }
591
592    fn swap(&mut self, a: usize, b: usize) {
593        let (af, ai) = self
594            .get_fragment_and_inner_indices(a)
595            .expect("first index is out-of-bounds");
596        let (bf, bi) = self
597            .get_fragment_and_inner_indices(b)
598            .expect("second index out-of-bounds");
599        if af == bf {
600            self.fragments[af].swap(ai, bi);
601        } else {
602            let ptr_a = unsafe { self.fragments[af].as_mut_ptr().add(ai) };
603            let ref_a = unsafe { &mut *ptr_a };
604            let ref_b = &mut self.fragments[bf][bi];
605            core::mem::swap(ref_a, ref_b);
606        }
607    }
608
609    fn truncate(&mut self, len: usize) {
610        if let Some((f, i)) = self.get_fragment_and_inner_indices(len) {
611            self.fragments.truncate(f + 1);
612            self.fragments[f].truncate(i);
613            self.len = len;
614
615            self.drop_last_empty_fragment();
616        }
617    }
618
619    fn iter_rev(&self) -> Self::IterRev<'_> {
620        Self::IterRev::new(&self.fragments)
621    }
622
623    fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
624        Self::IterMutRev::new(&mut self.fragments)
625    }
626
627    /// Returns the view on the required `range` as a vector of slices:
628    ///
629    /// * returns an empty vector if the range is out of bounds;
630    /// * returns a vector with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
631    /// * returns an ordered vector of slices when chained forms the required range.
632    ///
633    /// # Examples
634    ///
635    /// ```
636    /// use orx_split_vec::prelude::*;
637    ///
638    /// let mut vec = SplitVec::with_linear_growth(2);
639    ///
640    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
641    ///
642    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
643    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
644    /// assert_eq!(vec.fragments()[2], &[8, 9]);
645    ///
646    /// // single fragment
647    /// assert_eq!(vec![&[0, 1, 2, 3]], vec.slices(0..4));
648    /// assert_eq!(vec![&[5, 6]], vec.slices(5..7));
649    /// assert_eq!(vec![&[8, 9]], vec.slices(8..10));
650    ///
651    /// // Fragmented
652    /// assert_eq!(vec![&vec![3], &vec![4, 5]], vec.slices(3..6));
653    /// assert_eq!(vec![&vec![3], &vec![4, 5, 6, 7], &vec![8]], vec.slices(3..9));
654    /// assert_eq!(vec![&vec![7], &vec![8]], vec.slices(7..9));
655    ///
656    /// // OutOfBounds
657    /// assert!(vec.slices(5..12).is_empty());
658    /// assert!(vec.slices(10..11).is_empty());
659    /// ```
660    fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
661        let a = range_start(&range);
662        let b = range_end(&range, self.len());
663
664        match b.saturating_sub(a) {
665            0 => Vec::new(),
666            _ => match self.get_fragment_and_inner_indices(a) {
667                None => Vec::new(),
668                Some((sf, si)) => match self.get_fragment_and_inner_indices(b - 1) {
669                    None => Vec::new(),
670                    Some((ef, ei)) => match sf.cmp(&ef) {
671                        Ordering::Equal => alloc::vec![&self.fragments[sf][si..=ei]],
672                        _ => {
673                            let mut vec = Vec::with_capacity(ef - sf + 1);
674                            vec.push(&self.fragments[sf][si..]);
675                            for f in sf + 1..ef {
676                                vec.push(&self.fragments[f]);
677                            }
678                            vec.push(&self.fragments[ef][..=ei]);
679                            vec
680                        }
681                    },
682                },
683            },
684        }
685    }
686
687    /// Returns a mutable view on the required `range` as a vector of slices:
688    ///
689    /// * returns an empty vector if the range is out of bounds;
690    /// * returns a vector with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
691    /// * returns an ordered vector of slices when chained forms the required range.
692    ///
693    /// # Examples
694    ///
695    /// ```
696    /// use orx_split_vec::prelude::*;
697    ///
698    /// let mut vec = SplitVec::with_linear_growth(2);
699    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
700    ///
701    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
702    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
703    /// assert_eq!(vec.fragments()[2], &[8, 9]);
704    ///
705    /// // single fragment
706    /// let mut slices = vec.slices_mut(0..4);
707    /// assert_eq!(slices.len(), 1);
708    /// assert_eq!(slices[0], &[0, 1, 2, 3]);
709    /// slices[0][1] *= 10;
710    /// assert_eq!(vec.fragments()[0], &[0, 10, 2, 3]);
711    ///
712    /// // single fragment - partially
713    /// let mut slices = vec.slices_mut(5..7);
714    /// assert_eq!(slices.len(), 1);
715    /// assert_eq!(slices[0], &[5, 6]);
716    /// slices[0][1] *= 10;
717    /// assert_eq!(vec.fragments()[1], &[4, 5, 60, 7]);
718    ///
719    /// // multiple fragments
720    /// let slices = vec.slices_mut(2..6);
721    /// assert_eq!(slices.len(), 2);
722    /// assert_eq!(slices[0], &[2, 3]);
723    /// assert_eq!(slices[1], &[4, 5]);
724    /// for s in slices {
725    ///     for x in s {
726    ///         *x *= 10;
727    ///     }
728    /// }
729    ///
730    /// assert_eq!(vec.fragments()[0], &[0, 10, 20, 30]);
731    /// assert_eq!(vec.fragments()[1], &[40, 50, 60, 7]);
732    /// assert_eq!(vec.fragments()[2], &[8, 9]);
733    ///
734    /// // out of bounds
735    /// assert!(vec.slices_mut(5..12).is_empty());
736    /// assert!(vec.slices_mut(10..11).is_empty());
737    /// ```
738    fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_> {
739        use alloc::vec;
740        use core::slice::from_raw_parts_mut;
741
742        let a = range_start(&range);
743        let b = range_end(&range, self.len());
744
745        match b.saturating_sub(a) {
746            0 => Vec::new(),
747            _ => match self.get_fragment_and_inner_indices(a) {
748                None => Vec::new(),
749                Some((sf, si)) => match self.get_fragment_and_inner_indices(b - 1) {
750                    None => Vec::new(),
751                    Some((ef, ei)) => match sf.cmp(&ef) {
752                        Ordering::Equal => vec![&mut self.fragments[sf][si..=ei]],
753                        _ => {
754                            let mut vec = Vec::with_capacity(ef - sf + 1);
755
756                            let ptr_s = unsafe { self.fragments[sf].as_mut_ptr().add(si) };
757                            let slice_len = self.fragments[sf].capacity() - si;
758                            vec.push(unsafe { from_raw_parts_mut(ptr_s, slice_len) });
759                            for f in sf + 1..ef {
760                                let ptr_s = self.fragments[f].as_mut_ptr();
761                                let slice_len = self.fragments[f].capacity();
762                                vec.push(unsafe { from_raw_parts_mut(ptr_s, slice_len) });
763                            }
764                            vec.push(&mut self.fragments[ef][..=ei]);
765                            vec
766                        }
767                    },
768                },
769            },
770        }
771    }
772
773    /// Returns a pointer to the `index`-th element of the vector.
774    ///
775    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
776    ///
777    /// Time complexity of the method is:
778    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
779    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
780    ///
781    /// # Safety
782    ///
783    /// This method allows to write to a memory which is greater than the vector's length.
784    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
785    ///
786    #[inline(always)]
787    fn get_ptr(&self, index: usize) -> Option<*const T> {
788        self.growth_get_ptr(index)
789    }
790
791    /// Returns a mutable pointer to the `index`-th element of the vector.
792    ///
793    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
794    ///
795    /// Time complexity of the method is:
796    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
797    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
798    ///
799    /// # Safety
800    ///
801    /// This method allows to write to a memory which is greater than the vector's length.
802    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
803    ///
804    #[inline(always)]
805    fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T> {
806        self.growth_get_ptr_mut(index)
807    }
808
809    unsafe fn set_len(&mut self, new_len: usize) {
810        set_fragments_len(&mut self.fragments, new_len);
811        self.len = new_len;
812    }
813
814    fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
815    where
816        F: FnMut(&T) -> Ordering,
817    {
818        algorithms::binary_search::binary_search_by(&self.fragments, f)
819    }
820
821    fn sort(&mut self)
822    where
823        T: Ord,
824    {
825        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, T::cmp)
826    }
827
828    fn sort_by<F>(&mut self, compare: F)
829    where
830        F: FnMut(&T, &T) -> Ordering,
831    {
832        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
833    }
834
835    fn sort_by_key<K, F>(&mut self, mut f: F)
836    where
837        F: FnMut(&T) -> K,
838        K: Ord,
839    {
840        let compare = |a: &T, b: &T| f(a).cmp(&f(b));
841        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
842    }
843}
844
845#[cfg(test)]
846mod tests {
847    use crate::test::macros::Num;
848    use crate::test_all_growth_types;
849    use crate::*;
850    use alloc::string::String;
851    use alloc::vec::Vec;
852    use orx_pinned_vec::*;
853    use orx_pseudo_default::PseudoDefault;
854
855    #[test]
856    fn pinned_vec_tests() {
857        fn test<G: Growth>(vec: SplitVec<usize, G>) {
858            for cap in [0, 10, 124, 5421] {
859                test_pinned_vec(vec.clone(), cap);
860            }
861        }
862        test_all_growth_types!(test);
863    }
864
865    #[test]
866    fn index_of_and_contains() {
867        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
868            let mut another_vec = Vec::new();
869            for i in 0..157 {
870                vec.push(i);
871                another_vec.push(i);
872            }
873            for i in 0..vec.len() {
874                assert_eq!(Some(i), vec.index_of(&vec[i]));
875                assert!(vec.contains_reference(&vec[i]));
876
877                assert_eq!(None, vec.index_of(&another_vec[i]));
878                assert!(!vec.contains_reference(&another_vec[i]));
879
880                let scalar = another_vec[i];
881                assert_eq!(None, vec.index_of(&scalar));
882                assert!(!vec.contains_reference(&scalar));
883            }
884        }
885        test_all_growth_types!(test);
886    }
887
888    #[test]
889    fn capacity_state() {
890        fn test<G: Growth>(vec: SplitVec<usize, G>) {
891            match vec.capacity_state() {
892                CapacityState::DynamicCapacity {
893                    current_capacity,
894                    maximum_concurrent_capacity,
895                } => {
896                    assert!(maximum_concurrent_capacity >= current_capacity);
897                    assert_eq!(current_capacity, vec.capacity());
898                    assert_eq!(
899                        maximum_concurrent_capacity,
900                        vec.growth()
901                            .maximum_concurrent_capacity(vec.fragments(), vec.fragments.capacity())
902                    );
903                }
904                #[allow(clippy::panic)]
905                _ => panic!("must have dynamic capacity"),
906            }
907        }
908        test_all_growth_types!(test);
909    }
910
911    #[test]
912    fn len_and_is_empty() {
913        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
914            for i in 0..42 {
915                assert_eq!(i, vec.len());
916                vec.push(i);
917            }
918            assert_eq!(42, vec.len());
919
920            vec.clear();
921            assert_eq!(0, vec.len());
922
923            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
924            assert_eq!(42, vec.len());
925
926            for i in 0..42 {
927                assert_eq!(42 - i, vec.len());
928                vec.pop();
929            }
930            assert_eq!(0, vec.len());
931
932            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
933            for i in 0..42 {
934                assert_eq!(42 - i, vec.len());
935                vec.remove(vec.len() / 2);
936            }
937            assert_eq!(0, vec.len());
938
939            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
940            for i in 0..42 {
941                assert_eq!(42 - i, vec.len());
942                vec.remove(0);
943            }
944            assert_eq!(0, vec.len());
945
946            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
947            for i in 0..42 {
948                assert_eq!(42 - i, vec.len());
949                vec.remove(vec.len() - 1);
950            }
951            assert_eq!(0, vec.len());
952
953            vec.clear();
954            for i in 0..42 {
955                assert_eq!(i, vec.len());
956                vec.insert(i, i);
957                assert_eq!(i + 1, vec.len());
958            }
959            assert_eq!(42, vec.len());
960
961            vec.clear();
962            for i in 0..42 {
963                assert_eq!(i, vec.len());
964                vec.insert(0, i);
965            }
966            assert_eq!(42, vec.len());
967        }
968
969        test_all_growth_types!(test);
970    }
971
972    #[test]
973    fn clear() {
974        fn clear_is_empty<G: Growth>(mut vec: SplitVec<usize, G>) {
975            vec.clear();
976            assert!(vec.is_empty());
977            assert_eq!(0, vec.len());
978
979            vec.push(1);
980            assert!(!vec.is_empty());
981            for i in 0..42 {
982                vec.push(i);
983            }
984            assert!(!vec.is_empty());
985
986            vec.clear();
987            assert!(vec.is_empty());
988            assert_eq!(0, vec.len());
989        }
990        test_all_growth_types!(clear_is_empty);
991    }
992
993    #[test]
994    fn get() {
995        fn test_get<G: Growth>(mut vec: SplitVec<usize, G>) {
996            assert!(vec.is_empty());
997
998            for i in 0..53 {
999                vec.push(i);
1000
1001                assert_eq!(vec.get(i), Some(&i));
1002                assert_eq!(vec.get(i + 1), None);
1003
1004                *vec.get_mut(i).expect("is-some") += 100;
1005            }
1006
1007            for i in 0..53 {
1008                assert_eq!(vec.get(i), Some(&(100 + i)));
1009            }
1010        }
1011        test_all_growth_types!(test_get);
1012    }
1013
1014    #[test]
1015    fn first_last() {
1016        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1017            assert!(vec.first().is_none());
1018            assert!(vec.last().is_none());
1019
1020            vec.push(42);
1021
1022            assert_eq!(vec.first(), Some(&42));
1023            assert_eq!(vec.last(), Some(&42));
1024
1025            unsafe {
1026                assert_eq!(vec.first_unchecked(), &42);
1027                assert_eq!(vec.last_unchecked(), &42);
1028            }
1029
1030            vec.push(7);
1031
1032            assert_eq!(vec.first(), Some(&42));
1033            assert_eq!(vec.last(), Some(&7));
1034
1035            unsafe {
1036                assert_eq!(vec.first_unchecked(), &42);
1037                assert_eq!(vec.last_unchecked(), &7);
1038            }
1039
1040            for _ in 0..800 {
1041                vec.insert(1, 56421);
1042            }
1043
1044            assert_eq!(vec.first(), Some(&42));
1045            assert_eq!(vec.last(), Some(&7));
1046
1047            unsafe {
1048                assert_eq!(vec.first_unchecked(), &42);
1049                assert_eq!(vec.last_unchecked(), &7);
1050            }
1051
1052            vec.clear();
1053
1054            assert!(vec.first().is_none());
1055            assert!(vec.last().is_none());
1056        }
1057
1058        test_all_growth_types!(test);
1059    }
1060
1061    #[test]
1062    fn extend_from_slice() {
1063        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1064            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
1065            vec.extend_from_slice(&(42..63).collect::<Vec<_>>());
1066            vec.extend_from_slice(&(63..100).collect::<Vec<_>>());
1067
1068            assert_eq!(100, vec.len());
1069            for i in 0..100 {
1070                assert_eq!(i, vec[i]);
1071            }
1072        }
1073        test_all_growth_types!(test);
1074    }
1075
1076    #[test]
1077    fn grow() {
1078        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1079            for i in 0..42 {
1080                vec.push(i);
1081            }
1082            for i in 0..42 {
1083                vec.insert(i, 100 + i);
1084            }
1085
1086            for i in 0..42 {
1087                assert_eq!(i, vec[42 + i]);
1088                assert_eq!(100 + i, vec[i]);
1089            }
1090        }
1091        test_all_growth_types!(test);
1092    }
1093
1094    #[test]
1095    fn shrink() {
1096        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1097            for i in 0..42 {
1098                vec.push(i);
1099                assert_eq!(i, vec.remove(0));
1100                assert!(vec.is_empty());
1101            }
1102
1103            for i in 0..42 {
1104                vec.push(i);
1105            }
1106            for i in 0..42 {
1107                assert_eq!(i, vec.remove(0));
1108            }
1109            assert!(vec.is_empty());
1110
1111            for i in 0..42 {
1112                vec.push(i);
1113            }
1114            for _ in 0..42 {
1115                vec.remove(vec.len() / 2);
1116            }
1117            assert!(vec.is_empty());
1118        }
1119        test_all_growth_types!(test);
1120    }
1121
1122    #[test]
1123    fn swap() {
1124        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1125            for i in 0..42 {
1126                vec.push(i);
1127            }
1128
1129            for i in 0..21 {
1130                vec.swap(i, 21 + i);
1131            }
1132
1133            for i in 0..21 {
1134                assert_eq!(21 + i, vec[i]);
1135            }
1136            for i in 21..42 {
1137                assert_eq!(i - 21, vec[i]);
1138            }
1139        }
1140        test_all_growth_types!(test);
1141    }
1142
1143    #[test]
1144    fn truncate() {
1145        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1146            let std_vec: Vec<_> = (0..42).collect();
1147            for i in 0..42 {
1148                vec.push(i);
1149            }
1150
1151            vec.truncate(100);
1152            assert_eq!(vec, std_vec);
1153
1154            for i in (0..42).rev() {
1155                vec.truncate(i);
1156                assert_eq!(vec, &std_vec[0..i]);
1157            }
1158        }
1159        test_all_growth_types!(test);
1160    }
1161
1162    #[test]
1163    fn insert() {
1164        fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1165            for i in 0..42 {
1166                vec.push(Num::new(i));
1167            }
1168            for i in 0..42 {
1169                vec.insert(i, Num::new(100 + i));
1170            }
1171
1172            for i in 0..42 {
1173                assert_eq!(Some(&Num::new(i)), vec.get(42 + i));
1174                assert_eq!(Some(&Num::new(100 + i)), vec.get(i));
1175            }
1176        }
1177        test_all_growth_types!(test);
1178    }
1179
1180    #[test]
1181    fn clone() {
1182        fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1183            assert!(vec.is_empty());
1184
1185            for i in 0..53 {
1186                vec.push(Num::new(i));
1187            }
1188
1189            let clone = vec.clone();
1190            assert_eq!(vec, clone);
1191        }
1192        test_all_growth_types!(test);
1193    }
1194
1195    #[test]
1196    fn slices() {
1197        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1198            for i in 0..184 {
1199                assert!(vec.slices(i..i + 1).is_empty());
1200                assert!(vec.slices(0..i + 1).is_empty());
1201                vec.push(i);
1202            }
1203
1204            let slice = vec.slices(0..vec.len());
1205            let mut combined = Vec::new();
1206            for s in slice {
1207                combined.extend_from_slice(s);
1208            }
1209            for i in 0..184 {
1210                assert_eq!(i, vec[i]);
1211                assert_eq!(i, combined[i]);
1212            }
1213
1214            let begin = vec.len() / 4;
1215            let end = 3 * vec.len() / 4;
1216            let slice = vec.slices(begin..end);
1217            let mut combined = Vec::new();
1218            for s in slice {
1219                combined.extend_from_slice(s);
1220            }
1221            for i in begin..end {
1222                assert_eq!(i, vec[i]);
1223                assert_eq!(i, combined[i - begin]);
1224            }
1225        }
1226        test_all_growth_types!(test);
1227    }
1228
1229    #[test]
1230    fn slices_mut() {
1231        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1232            for i in 0..184 {
1233                assert!(vec.slices_mut(i..i + 1).is_empty());
1234                assert!(vec.slices_mut(0..i + 1).is_empty());
1235                vec.push(i);
1236            }
1237
1238            let slice = vec.slices_mut(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..184 {
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_mut(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            vec.clear();
1261
1262            for _ in 0..184 {
1263                vec.push(0);
1264            }
1265
1266            fn update(slice: Vec<&mut [usize]>, begin: usize) {
1267                let mut val = begin;
1268                for s in slice {
1269                    for x in s {
1270                        *x = val;
1271                        val += 1;
1272                    }
1273                }
1274            }
1275            let mut fill = |begin: usize, end: usize| {
1276                let range = begin..end;
1277                update(vec.slices_mut(range), begin);
1278            };
1279
1280            fill(0, 14);
1281            fill(14, 56);
1282            fill(56, 77);
1283            fill(77, 149);
1284            fill(149, 182);
1285            fill(182, 184);
1286            for i in 0..184 {
1287                assert_eq!(vec.get(i), Some(&i));
1288            }
1289        }
1290        test_all_growth_types!(test);
1291    }
1292
1293    #[test]
1294    fn set_len_get_ptr_mut() {
1295        let mut vec = SplitVec::with_doubling_growth();
1296        vec.push(0);
1297        vec.push(1);
1298        vec.push(2);
1299        vec.push(3);
1300        vec.push(4);
1301
1302        assert_eq!(vec.capacity(), 12);
1303
1304        for i in vec.len()..vec.capacity() {
1305            unsafe { *(vec.get_ptr_mut(i).expect("is-some")) = i };
1306            unsafe { vec.set_len(i + 1) };
1307
1308            assert_eq!(vec.get(i), Some(&i));
1309        }
1310
1311        for i in vec.capacity()..(vec.capacity() + 100) {
1312            assert!(vec.get_ptr_mut(i).is_none());
1313        }
1314    }
1315
1316    #[test]
1317    fn pseudo_default() {
1318        let vec = SplitVec::<String, Doubling>::pseudo_default();
1319        assert_eq!(vec.len(), 0);
1320
1321        let vec = SplitVec::<String, Recursive>::pseudo_default();
1322        assert_eq!(vec.len(), 0);
1323
1324        let vec = SplitVec::<String, Linear>::pseudo_default();
1325        assert_eq!(vec.len(), 0);
1326    }
1327}