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            if available < slice.len() {
321                last.extend_from_slice(&slice[0..available]);
322                slice = &slice[available..];
323                self.add_fragment();
324            } else {
325                last.extend_from_slice(slice);
326                break;
327            }
328        }
329    }
330
331    /// Returns a reference to the element with the given `index`;
332    /// None if index is out of bounds.
333    ///
334    /// # Examples
335    ///
336    /// ```
337    /// use orx_split_vec::*;
338    ///
339    /// let mut vec = SplitVec::with_linear_growth(5);
340    /// vec.extend_from_slice(&[10, 40, 30]);
341    /// assert_eq!(Some(&40), vec.get(1));
342    /// assert_eq!(None, vec.get(3));
343    /// ```
344    fn get(&self, index: usize) -> Option<&T> {
345        self.get_fragment_and_inner_indices(index)
346            .map(|(f, i)| unsafe { self.fragments.get_unchecked(f).get_unchecked(i) })
347    }
348
349    /// Returns a mutable reference to the element with the given `index`;
350    /// None if index is out of bounds.
351    ///
352    /// # Examples
353    ///
354    /// ```
355    /// use orx_split_vec::*;
356    ///
357    /// let mut vec = SplitVec::with_linear_growth(5);
358    /// vec.extend_from_slice(&[0, 1, 2]);
359    ///
360    /// if let Some(elem) = vec.get_mut(1) {
361    ///     *elem = 42;
362    /// }
363    ///
364    /// assert_eq!(vec, &[0, 42, 2]);
365    /// ```
366    fn get_mut(&mut self, index: usize) -> Option<&mut T> {
367        self.get_fragment_and_inner_indices(index)
368            .map(|(f, i)| unsafe { self.fragments.get_unchecked_mut(f).get_unchecked_mut(i) })
369    }
370
371    /// Returns a reference to an element or sub-slice, without doing bounds checking.
372    ///
373    /// For a safe alternative see `get`.
374    ///
375    /// # Safety
376    ///
377    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
378    /// even if the resulting reference is not used.
379    unsafe fn get_unchecked(&self, index: usize) -> &T {
380        self.get(index).expect("out-of-bounds")
381    }
382
383    /// Returns a mutable reference to an element or sub-slice, without doing bounds checking.
384    ///
385    /// For a safe alternative see `get_mut`.
386    ///
387    /// # Safety
388    ///
389    /// Calling this method with an out-of-bounds index is *[undefined behavior]*
390    /// even if the resulting reference is not used.
391    unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
392        self.get_mut(index).expect("out-of-bounds")
393    }
394
395    /// Returns a reference to the first element of the vector; returns None if the vector is empty.
396    ///
397    /// # Examples
398    ///
399    /// ```
400    /// use orx_split_vec::*;
401    ///
402    /// let mut vec = SplitVec::new();
403    /// assert!(vec.first().is_none());
404    ///
405    /// vec.push(42);
406    /// assert_eq!(Some(&42), vec.first());
407    ///
408    /// vec.push(864121);
409    /// assert_eq!(Some(&42), vec.first());
410    ///
411    /// vec.insert(0, 7);
412    /// assert_eq!(Some(&7), vec.first());
413    /// ```
414    #[inline(always)]
415    fn first(&self) -> Option<&T> {
416        self.fragments.first().and_then(|x| x.first())
417    }
418
419    /// Returns a reference to the last element of the vector; returns None if the vector is empty.
420    ///
421    /// # Examples
422    ///
423    /// ```
424    /// use orx_split_vec::*;
425    ///
426    /// let mut vec = SplitVec::new();
427    /// assert!(vec.last().is_none());
428    ///
429    /// vec.push(42);
430    /// assert_eq!(Some(&42), vec.last());
431    ///
432    /// vec.push(7);
433    /// assert_eq!(Some(&7), vec.last());
434    ///
435    /// vec.insert(0, 684321);
436    /// assert_eq!(Some(&7), vec.last());
437    /// ```
438    #[inline(always)]
439    fn last(&self) -> Option<&T> {
440        self.fragments.last().and_then(|x| x.last())
441    }
442
443    #[inline(always)]
444    unsafe fn first_unchecked(&self) -> &T {
445        unsafe { self.fragments.get_unchecked(0).get_unchecked(0) }
446    }
447
448    #[inline(always)]
449    unsafe fn last_unchecked(&self) -> &T {
450        let fragment = unsafe { self.fragments.get_unchecked(self.fragments.len() - 1) };
451        unsafe { fragment.get_unchecked(fragment.len() - 1) }
452    }
453
454    fn insert(&mut self, index: usize, value: T) {
455        if index == self.len {
456            self.push(value);
457        } else {
458            // make room for one
459            if !self.has_capacity_for_one() {
460                self.add_fragment();
461            }
462
463            let (f, i) = self
464                .get_fragment_and_inner_indices(index)
465                .expect("out-of-bounds");
466
467            if self.fragments[f].has_capacity_for_one() {
468                self.fragments[f].insert(i, value);
469            } else {
470                let mut popped = self.fragments[f].pop().expect("no-way!");
471                self.fragments[f].insert(i, value);
472                let mut f = f;
473                loop {
474                    f += 1;
475
476                    if self.fragments[f].has_capacity_for_one() {
477                        self.fragments[f].insert(0, popped);
478                        break;
479                    } else {
480                        let new_popped = self.fragments[f].pop().expect("no-way");
481                        self.fragments[f].insert(0, popped);
482                        popped = new_popped;
483                    }
484                }
485            }
486            self.len += 1;
487        }
488    }
489
490    /// Returns `true` if the vector contains no elements.
491    ///
492    /// # Examples
493    ///
494    /// ```
495    /// use orx_split_vec::*;
496    ///
497    /// let mut vec = SplitVec::with_linear_growth(2);
498    /// assert!(vec.is_empty());
499    /// vec.push(1);
500    /// assert!(!vec.is_empty());
501    /// ```
502    fn is_empty(&self) -> bool {
503        self.len == 0
504    }
505
506    /// Returns the number of elements in the vector, also referred to
507    /// as its 'length'.
508    ///
509    /// # Examples
510    ///
511    /// ```
512    /// use orx_split_vec::*;
513    ///
514    /// let mut vec =  SplitVec::with_linear_growth(8);
515    /// assert_eq!(0, vec.len());
516    /// vec.push(1);
517    /// vec.push(2);
518    /// vec.push(3);
519    /// assert_eq!(3, vec.len());
520    /// ```
521    fn len(&self) -> usize {
522        self.len
523    }
524
525    fn pop(&mut self) -> Option<T> {
526        if self.fragments.is_empty() {
527            None
528        } else {
529            let f = self.fragments.len() - 1;
530            if self.fragments[f].is_empty() {
531                if f == 0 {
532                    None
533                } else {
534                    self.len -= 1;
535                    self.fragments.pop();
536                    self.fragments[f - 1].pop()
537                }
538            } else {
539                self.len -= 1;
540                let popped = self.fragments[f].pop();
541                if self.fragments[f].is_empty() {
542                    self.fragments.pop();
543                }
544                popped
545            }
546        }
547    }
548
549    /// Appends an element to the back of a collection.
550    ///
551    /// # Examples
552    ///
553    /// ```
554    /// use orx_split_vec::*;
555    ///
556    /// let mut vec = SplitVec::with_linear_growth(16);
557    /// vec.push(1);
558    /// vec.push(2);
559    /// vec.push(3);
560    /// assert_eq!(vec, [1, 2, 3]);
561    /// ```
562    fn push(&mut self, value: T) {
563        self.len += 1;
564        match self.has_capacity_for_one() {
565            true => {
566                let last_f = self.fragments.len() - 1;
567                self.fragments[last_f].push(value);
568            }
569            false => self.add_fragment_with_first_value(value),
570        }
571    }
572
573    fn remove(&mut self, index: usize) -> T {
574        self.drop_last_empty_fragment();
575
576        let (f, i) = self
577            .get_fragment_and_inner_indices(index)
578            .expect("out-of-bounds");
579
580        let value = self.fragments[f].remove(i);
581
582        for f2 in f + 1..self.fragments.len() {
583            let x = self.fragments[f2].remove(0);
584            self.fragments[f2 - 1].push(x);
585            if self.fragments[f2].is_empty() {
586                self.fragments.remove(f2);
587                break;
588            }
589        }
590
591        self.drop_last_empty_fragment();
592
593        self.len -= 1;
594        value
595    }
596
597    fn swap(&mut self, a: usize, b: usize) {
598        let (af, ai) = self
599            .get_fragment_and_inner_indices(a)
600            .expect("first index is out-of-bounds");
601        let (bf, bi) = self
602            .get_fragment_and_inner_indices(b)
603            .expect("second index out-of-bounds");
604        if af == bf {
605            self.fragments[af].swap(ai, bi);
606        } else {
607            let ptr_a = unsafe { self.fragments[af].as_mut_ptr().add(ai) };
608            let ref_a = unsafe { &mut *ptr_a };
609            let ref_b = &mut self.fragments[bf][bi];
610            core::mem::swap(ref_a, ref_b);
611        }
612    }
613
614    fn truncate(&mut self, len: usize) {
615        if let Some((f, i)) = self.get_fragment_and_inner_indices(len) {
616            self.fragments.truncate(f + 1);
617            self.fragments[f].truncate(i);
618            self.len = len;
619
620            self.drop_last_empty_fragment();
621        }
622    }
623
624    fn iter_rev(&self) -> Self::IterRev<'_> {
625        Self::IterRev::new(&self.fragments)
626    }
627
628    fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
629        Self::IterMutRev::new(&mut self.fragments)
630    }
631
632    /// Returns the view on the required `range` as a vector of slices:
633    ///
634    /// * returns an empty iterator if the range is out of bounds;
635    /// * returns an iterator with one slice if the range completely belongs to one fragment (in this case `try_get_slice` would return Ok),
636    /// * returns an ordered iterator of slices when chained forms the required range.
637    ///
638    /// # Examples
639    ///
640    /// ```
641    /// use orx_split_vec::prelude::*;
642    ///
643    /// let mut vec = SplitVec::with_linear_growth(2);
644    ///
645    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
646    ///
647    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
648    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
649    /// assert_eq!(vec.fragments()[2], &[8, 9]);
650    ///
651    /// // single fragment
652    /// assert_eq!(vec![&[0, 1, 2, 3]], vec.slices(0..4).collect::<Vec<_>>());
653    /// assert_eq!(vec![&[5, 6]], vec.slices(5..7).collect::<Vec<_>>());
654    /// assert_eq!(vec![&[8, 9]], vec.slices(8..10).collect::<Vec<_>>());
655    ///
656    /// // Fragmented
657    /// assert_eq!(vec![&vec![3], &vec![4, 5]], vec.slices(3..6).collect::<Vec<_>>());
658    /// assert_eq!(vec![&vec![3], &vec![4, 5, 6, 7], &vec![8]], vec.slices(3..9).collect::<Vec<_>>());
659    /// assert_eq!(vec![&vec![7], &vec![8]], vec.slices(7..9).collect::<Vec<_>>());
660    ///
661    /// // OutOfBounds
662    /// assert_eq!(vec.slices(5..12).len(), 0);
663    /// assert_eq!(vec.slices(10..11).len(), 0);
664    /// ```
665    fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
666        Self::SliceIter::new(self, range)
667    }
668
669    /// Returns a mutable 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    /// vec.extend_from_slice(&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
682    ///
683    /// assert_eq!(vec.fragments()[0], &[0, 1, 2, 3]);
684    /// assert_eq!(vec.fragments()[1], &[4, 5, 6, 7]);
685    /// assert_eq!(vec.fragments()[2], &[8, 9]);
686    ///
687    /// // single fragment
688    /// let mut slices = vec.slices_mut(0..4);
689    /// assert_eq!(slices.len(), 1);
690    /// let slice = slices.next().unwrap();
691    /// assert_eq!(slice, &[0, 1, 2, 3]);
692    /// slice[1] *= 10;
693    /// assert_eq!(vec.fragments()[0], &[0, 10, 2, 3]);
694    ///
695    /// // single fragment - partially
696    /// let mut slices = vec.slices_mut(5..7);
697    /// assert_eq!(slices.len(), 1);
698    /// let slice = slices.next().unwrap();
699    /// assert_eq!(slice, &[5, 6]);
700    /// slice[1] *= 10;
701    /// assert_eq!(vec.fragments()[1], &[4, 5, 60, 7]);
702    ///
703    /// // multiple fragments
704    /// let slices = vec.slices_mut(2..6);
705    /// assert_eq!(slices.len(), 2); // [2, 3] & [4, 5]
706    /// for s in slices {
707    ///     for x in s {
708    ///         *x *= 10;
709    ///     }
710    /// }
711    ///
712    /// assert_eq!(vec.fragments()[0], &[0, 10, 20, 30]);
713    /// assert_eq!(vec.fragments()[1], &[40, 50, 60, 7]);
714    /// assert_eq!(vec.fragments()[2], &[8, 9]);
715    ///
716    /// // out of bounds
717    /// assert_eq!(vec.slices_mut(5..12).len(), 0);
718    /// assert_eq!(vec.slices_mut(10..11).len(), 0);
719    /// ```
720    fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_> {
721        Self::SliceMutIter::new(self, range)
722    }
723
724    fn iter_over<'a>(
725        &'a self,
726        range: impl RangeBounds<usize>,
727    ) -> impl ExactSizeIterator<Item = &'a T>
728    where
729        T: 'a,
730    {
731        FlattenedIterOfSlices::<_, SliceBorrowAsRef>::new(self, range)
732    }
733
734    fn iter_mut_over<'a>(
735        &'a mut self,
736        range: impl RangeBounds<usize>,
737    ) -> impl ExactSizeIterator<Item = &'a mut T>
738    where
739        T: 'a,
740    {
741        FlattenedIterOfSlices::<_, SliceBorrowAsMut>::new(self, range)
742    }
743
744    /// Returns a pointer to the `index`-th element of the vector.
745    ///
746    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
747    ///
748    /// Time complexity of the method is:
749    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
750    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
751    ///
752    /// # Safety
753    ///
754    /// This method allows to write to a memory which is greater than the vector's length.
755    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
756    ///
757    #[inline(always)]
758    fn get_ptr(&self, index: usize) -> Option<*const T> {
759        self.growth_get_ptr(index)
760    }
761
762    /// Returns a mutable pointer to the `index`-th element of the vector.
763    ///
764    /// Returns `None` if `index`-th position does not belong to the vector; i.e., if `index` is out of `capacity`.
765    ///
766    /// Time complexity of the method is:
767    /// * ***O(1)*** when `G: GrowthWithConstantTimeAccess`,
768    /// * ***O(f)*** for the general case `G: Growth` where `f` is the number of fragments in the split vector.
769    ///
770    /// # Safety
771    ///
772    /// This method allows to write to a memory which is greater than the vector's length.
773    /// On the other hand, it will never return a pointer to a memory location that the vector does not own.
774    ///
775    #[inline(always)]
776    fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T> {
777        self.growth_get_ptr_mut(index)
778    }
779
780    unsafe fn set_len(&mut self, new_len: usize) {
781        unsafe { set_fragments_len(&mut self.fragments, new_len) };
782        self.len = new_len;
783    }
784
785    fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
786    where
787        F: FnMut(&T) -> Ordering,
788    {
789        algorithms::binary_search::binary_search_by(&self.fragments, f)
790    }
791
792    fn sort(&mut self)
793    where
794        T: Ord,
795    {
796        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, T::cmp)
797    }
798
799    fn sort_by<F>(&mut self, compare: F)
800    where
801        F: FnMut(&T, &T) -> Ordering,
802    {
803        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
804    }
805
806    fn sort_by_key<K, F>(&mut self, mut f: F)
807    where
808        F: FnMut(&T) -> K,
809        K: Ord,
810    {
811        let compare = |a: &T, b: &T| f(a).cmp(&f(b));
812        algorithms::in_place_sort::in_place_sort_by(&mut self.fragments, compare)
813    }
814
815    fn capacity_bound(&self) -> usize {
816        self.growth
817            .maximum_concurrent_capacity_bound(&self.fragments, self.fragments.capacity())
818    }
819}
820
821#[cfg(test)]
822mod tests {
823    use crate::test::macros::Num;
824    use crate::test_all_growth_types;
825    use crate::*;
826    use alloc::string::String;
827    use alloc::vec::Vec;
828    use orx_pinned_vec::*;
829    use orx_pseudo_default::PseudoDefault;
830
831    #[test]
832    fn pinned_vec_tests() {
833        fn test<G: Growth>(vec: SplitVec<usize, G>) {
834            #[cfg(not(miri))]
835            let capacities = [0, 10, 124, 5421];
836            #[cfg(miri)]
837            let capacities = [0, 34];
838
839            for cap in capacities {
840                test_pinned_vec(vec.clone(), cap);
841            }
842        }
843        test_all_growth_types!(test);
844    }
845
846    #[test]
847    fn index_of_and_contains() {
848        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
849            #[cfg(not(miri))]
850            const TARGET_LEN: usize = 157;
851            #[cfg(miri)]
852            const TARGET_LEN: usize = 37;
853
854            let mut another_vec = Vec::new();
855            for i in 0..TARGET_LEN {
856                vec.push(i);
857                another_vec.push(i);
858            }
859            for i in 0..vec.len() {
860                assert_eq!(Some(i), vec.index_of(&vec[i]));
861                assert!(vec.contains_reference(&vec[i]));
862
863                assert_eq!(None, vec.index_of(&another_vec[i]));
864                assert!(!vec.contains_reference(&another_vec[i]));
865
866                let scalar = another_vec[i];
867                assert_eq!(None, vec.index_of(&scalar));
868                assert!(!vec.contains_reference(&scalar));
869            }
870        }
871        test_all_growth_types!(test);
872    }
873
874    #[test]
875    fn capacity_state() {
876        fn test<G: Growth>(vec: SplitVec<usize, G>) {
877            match vec.capacity_state() {
878                CapacityState::DynamicCapacity {
879                    current_capacity,
880                    maximum_concurrent_capacity,
881                } => {
882                    assert!(maximum_concurrent_capacity >= current_capacity);
883                    assert_eq!(current_capacity, vec.capacity());
884                    assert_eq!(
885                        maximum_concurrent_capacity,
886                        vec.growth()
887                            .maximum_concurrent_capacity(vec.fragments(), vec.fragments.capacity())
888                    );
889                }
890                #[allow(clippy::panic)]
891                _ => panic!("must have dynamic capacity"),
892            }
893        }
894        test_all_growth_types!(test);
895    }
896
897    #[test]
898    fn len_and_is_empty() {
899        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
900            for i in 0..42 {
901                assert_eq!(i, vec.len());
902                vec.push(i);
903            }
904            assert_eq!(42, vec.len());
905
906            vec.clear();
907            assert_eq!(0, vec.len());
908
909            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
910            assert_eq!(42, vec.len());
911
912            for i in 0..42 {
913                assert_eq!(42 - i, vec.len());
914                vec.pop();
915            }
916            assert_eq!(0, vec.len());
917
918            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
919            for i in 0..42 {
920                assert_eq!(42 - i, vec.len());
921                vec.remove(vec.len() / 2);
922            }
923            assert_eq!(0, vec.len());
924
925            vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
926            for i in 0..42 {
927                assert_eq!(42 - i, vec.len());
928                vec.remove(0);
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() - 1);
936            }
937            assert_eq!(0, vec.len());
938
939            vec.clear();
940            for i in 0..42 {
941                assert_eq!(i, vec.len());
942                vec.insert(i, i);
943                assert_eq!(i + 1, vec.len());
944            }
945            assert_eq!(42, vec.len());
946
947            vec.clear();
948            for i in 0..42 {
949                assert_eq!(i, vec.len());
950                vec.insert(0, i);
951            }
952            assert_eq!(42, vec.len());
953        }
954
955        test_all_growth_types!(test);
956    }
957
958    #[test]
959    fn clear() {
960        fn clear_is_empty<G: Growth>(mut vec: SplitVec<usize, G>) {
961            vec.clear();
962            assert!(vec.is_empty());
963            assert_eq!(0, vec.len());
964
965            vec.push(1);
966            assert!(!vec.is_empty());
967            for i in 0..42 {
968                vec.push(i);
969            }
970            assert!(!vec.is_empty());
971
972            vec.clear();
973            assert!(vec.is_empty());
974            assert_eq!(0, vec.len());
975        }
976        test_all_growth_types!(clear_is_empty);
977    }
978
979    #[test]
980    fn get() {
981        fn test_get<G: Growth>(mut vec: SplitVec<usize, G>) {
982            assert!(vec.is_empty());
983
984            for i in 0..53 {
985                vec.push(i);
986
987                assert_eq!(vec.get(i), Some(&i));
988                assert_eq!(vec.get(i + 1), None);
989
990                *vec.get_mut(i).expect("is-some") += 100;
991            }
992
993            for i in 0..53 {
994                assert_eq!(vec.get(i), Some(&(100 + i)));
995            }
996        }
997        test_all_growth_types!(test_get);
998    }
999
1000    #[test]
1001    fn first_last() {
1002        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1003            assert!(vec.first().is_none());
1004            assert!(vec.last().is_none());
1005
1006            vec.push(42);
1007
1008            assert_eq!(vec.first(), Some(&42));
1009            assert_eq!(vec.last(), Some(&42));
1010
1011            unsafe {
1012                assert_eq!(vec.first_unchecked(), &42);
1013                assert_eq!(vec.last_unchecked(), &42);
1014            }
1015
1016            vec.push(7);
1017
1018            assert_eq!(vec.first(), Some(&42));
1019            assert_eq!(vec.last(), Some(&7));
1020
1021            unsafe {
1022                assert_eq!(vec.first_unchecked(), &42);
1023                assert_eq!(vec.last_unchecked(), &7);
1024            }
1025
1026            #[cfg(not(miri))]
1027            const TARGET_LEN: usize = 800;
1028            #[cfg(miri)]
1029            const TARGET_LEN: usize = 37;
1030
1031            for _ in 0..TARGET_LEN {
1032                vec.insert(1, 56421);
1033            }
1034
1035            assert_eq!(vec.first(), Some(&42));
1036            assert_eq!(vec.last(), Some(&7));
1037
1038            unsafe {
1039                assert_eq!(vec.first_unchecked(), &42);
1040                assert_eq!(vec.last_unchecked(), &7);
1041            }
1042
1043            vec.clear();
1044
1045            assert!(vec.first().is_none());
1046            assert!(vec.last().is_none());
1047        }
1048
1049        test_all_growth_types!(test);
1050    }
1051
1052    #[test]
1053    fn extend_from_slice() {
1054        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1055            vec.extend_from_slice(&(0..21).collect::<Vec<_>>());
1056            vec.extend_from_slice(&(21..35).collect::<Vec<_>>());
1057            vec.extend_from_slice(&(35..49).collect::<Vec<_>>());
1058
1059            assert_eq!(49, vec.len());
1060            for i in 0..49 {
1061                assert_eq!(i, vec[i]);
1062            }
1063        }
1064        test_all_growth_types!(test);
1065    }
1066
1067    #[test]
1068    fn grow() {
1069        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1070            for i in 0..42 {
1071                vec.push(i);
1072            }
1073            for i in 0..42 {
1074                vec.insert(i, 100 + i);
1075            }
1076
1077            for i in 0..42 {
1078                assert_eq!(i, vec[42 + i]);
1079                assert_eq!(100 + i, vec[i]);
1080            }
1081        }
1082        test_all_growth_types!(test);
1083    }
1084
1085    #[test]
1086    fn shrink() {
1087        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1088            for i in 0..42 {
1089                vec.push(i);
1090                assert_eq!(i, vec.remove(0));
1091                assert!(vec.is_empty());
1092            }
1093
1094            for i in 0..42 {
1095                vec.push(i);
1096            }
1097            for i in 0..42 {
1098                assert_eq!(i, vec.remove(0));
1099            }
1100            assert!(vec.is_empty());
1101
1102            for i in 0..42 {
1103                vec.push(i);
1104            }
1105            for _ in 0..42 {
1106                vec.remove(vec.len() / 2);
1107            }
1108            assert!(vec.is_empty());
1109        }
1110        test_all_growth_types!(test);
1111    }
1112
1113    #[test]
1114    fn swap() {
1115        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1116            for i in 0..42 {
1117                vec.push(i);
1118            }
1119
1120            for i in 0..21 {
1121                vec.swap(i, 21 + i);
1122            }
1123
1124            for i in 0..21 {
1125                assert_eq!(21 + i, vec[i]);
1126            }
1127            for i in 21..42 {
1128                assert_eq!(i - 21, vec[i]);
1129            }
1130        }
1131        test_all_growth_types!(test);
1132    }
1133
1134    #[test]
1135    fn truncate() {
1136        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1137            let std_vec: Vec<_> = (0..42).collect();
1138            for i in 0..42 {
1139                vec.push(i);
1140            }
1141
1142            vec.truncate(100);
1143            assert_eq!(vec, std_vec);
1144
1145            for i in (0..42).rev() {
1146                vec.truncate(i);
1147                assert_eq!(vec, &std_vec[0..i]);
1148            }
1149        }
1150        test_all_growth_types!(test);
1151    }
1152
1153    #[test]
1154    fn insert() {
1155        fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1156            for i in 0..42 {
1157                vec.push(Num::new(i));
1158            }
1159            for i in 0..42 {
1160                vec.insert(i, Num::new(100 + i));
1161            }
1162
1163            for i in 0..42 {
1164                assert_eq!(Some(&Num::new(i)), vec.get(42 + i));
1165                assert_eq!(Some(&Num::new(100 + i)), vec.get(i));
1166            }
1167        }
1168        test_all_growth_types!(test);
1169    }
1170
1171    #[test]
1172    fn clone() {
1173        fn test<G: Growth>(mut vec: SplitVec<Num, G>) {
1174            assert!(vec.is_empty());
1175
1176            for i in 0..53 {
1177                vec.push(Num::new(i));
1178            }
1179
1180            let clone = vec.clone();
1181            assert_eq!(vec, clone);
1182        }
1183        test_all_growth_types!(test);
1184    }
1185
1186    #[test]
1187    fn slices() {
1188        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1189            #[cfg(not(miri))]
1190            const TARGET_LEN: usize = 184;
1191            #[cfg(miri)]
1192            const TARGET_LEN: usize = 41;
1193
1194            for i in 0..TARGET_LEN {
1195                assert_eq!(vec.slices(i..i + 1).len(), 0);
1196                assert_eq!(vec.slices(0..i + 1).len(), 0);
1197                vec.push(i);
1198            }
1199
1200            let slice = vec.slices(0..vec.len());
1201            let mut combined = Vec::new();
1202            for s in slice {
1203                combined.extend_from_slice(s);
1204            }
1205            for i in 0..TARGET_LEN {
1206                assert_eq!(i, vec[i]);
1207                assert_eq!(i, combined[i]);
1208            }
1209
1210            let begin = vec.len() / 4;
1211            let end = 3 * vec.len() / 4;
1212            let slice = vec.slices(begin..end);
1213            let mut combined = Vec::new();
1214            for s in slice {
1215                combined.extend_from_slice(s);
1216            }
1217            for i in begin..end {
1218                assert_eq!(i, vec[i]);
1219                assert_eq!(i, combined[i - begin]);
1220            }
1221        }
1222        test_all_growth_types!(test);
1223    }
1224
1225    #[test]
1226    fn slices_mut() {
1227        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
1228            for i in 0..84 {
1229                assert_eq!(vec.slices_mut(i..i + 1).len(), 0);
1230                assert_eq!(vec.slices_mut(0..i + 1).len(), 0);
1231                vec.push(i);
1232            }
1233
1234            let slice = vec.slices_mut(0..vec.len());
1235            let mut combined = Vec::new();
1236            for s in slice {
1237                combined.extend_from_slice(s);
1238            }
1239            for i in 0..84 {
1240                assert_eq!(i, vec[i]);
1241                assert_eq!(i, combined[i]);
1242            }
1243
1244            let begin = vec.len() / 4;
1245            let end = 3 * vec.len() / 4;
1246            let slice = vec.slices_mut(begin..end);
1247            let mut combined = Vec::new();
1248            for s in slice {
1249                combined.extend_from_slice(s);
1250            }
1251            for i in begin..end {
1252                assert_eq!(i, vec[i]);
1253                assert_eq!(i, combined[i - begin]);
1254            }
1255
1256            vec.clear();
1257
1258            for _ in 0..84 {
1259                vec.push(0);
1260            }
1261
1262            fn update<'a>(slice: impl Iterator<Item = &'a mut [usize]>, begin: usize) {
1263                let mut val = begin;
1264                for s in slice {
1265                    for x in s {
1266                        *x = val;
1267                        val += 1;
1268                    }
1269                }
1270            }
1271            let mut fill = |begin: usize, end: usize| {
1272                let range = begin..end;
1273                update(vec.slices_mut(range), begin);
1274            };
1275
1276            fill(0, 7);
1277            fill(7, 14);
1278            fill(14, 33);
1279            fill(33, 61);
1280            fill(61, 72);
1281            fill(72, 84);
1282            for i in 0..84 {
1283                assert_eq!(vec.get(i), Some(&i));
1284            }
1285        }
1286        test_all_growth_types!(test);
1287    }
1288
1289    #[test]
1290    fn set_len_get_ptr_mut() {
1291        let mut vec = SplitVec::with_doubling_growth();
1292        vec.push(0);
1293        vec.push(1);
1294        vec.push(2);
1295        vec.push(3);
1296        vec.push(4);
1297
1298        assert_eq!(vec.capacity(), 12);
1299
1300        for i in vec.len()..vec.capacity() {
1301            unsafe { *(vec.get_ptr_mut(i).expect("is-some")) = i };
1302            unsafe { vec.set_len(i + 1) };
1303
1304            assert_eq!(vec.get(i), Some(&i));
1305        }
1306
1307        for i in vec.capacity()..(vec.capacity() + 100) {
1308            assert!(vec.get_ptr_mut(i).is_none());
1309        }
1310    }
1311
1312    #[test]
1313    fn pseudo_default() {
1314        let vec = SplitVec::<String, Doubling>::pseudo_default();
1315        assert_eq!(vec.len(), 0);
1316
1317        let vec = SplitVec::<String, Recursive>::pseudo_default();
1318        assert_eq!(vec.len(), 0);
1319
1320        let vec = SplitVec::<String, Linear>::pseudo_default();
1321        assert_eq!(vec.len(), 0);
1322    }
1323}