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}