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}