1use crate::helpers::range::{range_end, range_start};
2use crate::FixedVec;
3use core::cmp::Ordering;
4use core::iter::Rev;
5use core::ops::RangeBounds;
6use orx_iterable::Collection;
7use orx_pinned_vec::utils::slice;
8use orx_pinned_vec::{CapacityState, PinnedVec};
9use orx_pseudo_default::PseudoDefault;
10
11impl<T> PseudoDefault for FixedVec<T> {
12 fn pseudo_default() -> Self {
13 Self {
14 data: Default::default(),
15 }
16 }
17}
18
19impl<T> PinnedVec<T> for FixedVec<T> {
20 type IterRev<'a>
21 = Rev<core::slice::Iter<'a, T>>
22 where
23 T: 'a,
24 Self: 'a;
25 type IterMutRev<'a>
26 = Rev<core::slice::IterMut<'a, T>>
27 where
28 T: 'a,
29 Self: 'a;
30 type SliceIter<'a>
31 = Option<&'a [T]>
32 where
33 T: 'a,
34 Self: 'a;
35 type SliceMutIter<'a>
36 = Option<&'a mut [T]>
37 where
38 T: 'a,
39 Self: 'a;
40
41 #[inline(always)]
84 fn index_of(&self, element: &T) -> Option<usize> {
85 slice::index_of(&self.data, element)
86 }
87
88 fn index_of_ptr(&self, element_ptr: *const T) -> Option<usize> {
89 slice::index_of_ptr(&self.data, element_ptr)
90 }
91
92 fn push_get_ptr(&mut self, value: T) -> *const T {
93 let idx = self.data.len();
94 self.data.push(value);
95 unsafe { self.data.as_ptr().add(idx) }
96 }
97
98 unsafe fn iter_ptr<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
99 where
100 T: 'i,
101 {
102 let ptr = self.data.as_ptr();
103 (0..self.data.len()).map(move |i| unsafe { ptr.add(i) })
104 }
105
106 unsafe fn iter_ptr_rev<'v, 'i>(&'v self) -> impl Iterator<Item = *const T> + 'i
107 where
108 T: 'i,
109 {
110 let ptr = self.data.as_ptr();
111 (0..self.data.len())
112 .rev()
113 .map(move |i| unsafe { ptr.add(i) })
114 }
115
116 #[inline(always)]
159 fn contains_reference(&self, element: &T) -> bool {
160 slice::contains_reference(self.data.as_slice(), element)
161 }
162
163 #[inline(always)]
176 fn contains_ptr(&self, element_ptr: *const T) -> bool {
177 slice::contains_ptr(self.data.as_slice(), element_ptr)
178 }
179
180 fn clear(&mut self) {
181 self.data.clear();
182 }
183
184 fn capacity(&self) -> usize {
185 self.data.capacity()
186 }
187
188 fn capacity_state(&self) -> CapacityState {
189 CapacityState::FixedCapacity(self.capacity())
190 }
191
192 fn extend_from_slice(&mut self, other: &[T])
203 where
204 T: Clone,
205 {
206 self.panic_if_not_enough_room_for(other.len());
207 self.data.extend_from_slice(other);
208 }
209
210 #[inline(always)]
211 fn get(&self, index: usize) -> Option<&T> {
212 self.data.get(index)
213 }
214
215 #[inline(always)]
216 fn get_mut(&mut self, index: usize) -> Option<&mut T> {
217 self.data.get_mut(index)
218 }
219
220 #[inline(always)]
221 unsafe fn get_unchecked(&self, index: usize) -> &T {
222 self.data.get_unchecked(index)
223 }
224
225 #[inline(always)]
226 unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
227 self.data.get_unchecked_mut(index)
228 }
229
230 #[inline(always)]
231 fn first(&self) -> Option<&T> {
232 self.data.first()
233 }
234
235 #[inline(always)]
236 fn last(&self) -> Option<&T> {
237 self.data.last()
238 }
239
240 #[inline(always)]
241 unsafe fn first_unchecked(&self) -> &T {
242 self.data.get_unchecked(0)
243 }
244
245 #[inline(always)]
246 unsafe fn last_unchecked(&self) -> &T {
247 self.data.get_unchecked(self.data.len() - 1)
248 }
249
250 #[inline(always)]
251 fn is_empty(&self) -> bool {
252 self.data.is_empty()
253 }
254
255 #[inline(always)]
256 fn len(&self) -> usize {
257 self.data.len()
258 }
259
260 #[inline(always)]
267 fn push(&mut self, value: T) {
268 self.push_or_panic(value)
269 }
270
271 #[inline(always)]
279 fn insert(&mut self, index: usize, element: T) {
280 self.panic_if_not_enough_room_for(1);
281 self.data.insert(index, element)
282 }
283
284 #[inline(always)]
285 fn remove(&mut self, index: usize) -> T {
286 self.data.remove(index)
287 }
288
289 #[inline(always)]
290 fn pop(&mut self) -> Option<T> {
291 self.data.pop()
292 }
293
294 #[inline(always)]
295 fn swap(&mut self, a: usize, b: usize) {
296 self.data.swap(a, b)
297 }
298
299 #[inline(always)]
300 fn truncate(&mut self, len: usize) {
301 self.data.truncate(len)
302 }
303
304 #[inline(always)]
305 fn iter_rev(&self) -> Self::IterRev<'_> {
306 self.data.iter().rev()
307 }
308
309 #[inline(always)]
310 fn iter_mut_rev(&mut self) -> Self::IterMutRev<'_> {
311 self.data.iter_mut().rev()
312 }
313
314 fn slices<R: RangeBounds<usize>>(&self, range: R) -> Self::SliceIter<'_> {
340 let a = range_start(&range);
341 let b = range_end(&range, self.len());
342
343 match b.saturating_sub(a) {
344 0 => Some(&[]),
345 _ => match (a.cmp(&self.len()), b.cmp(&self.len())) {
346 (Ordering::Equal | Ordering::Greater, _) => None,
347 (_, Ordering::Greater) => None,
348 _ => Some(&self.data[a..b]),
349 },
350 }
351 }
352
353 #[inline(always)]
386 fn slices_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Self::SliceMutIter<'_> {
387 let a = range_start(&range);
388 let b = range_end(&range, self.len());
389
390 match b.saturating_sub(a) {
391 0 => Some(&mut []),
392 _ => match (a.cmp(&self.len()), b.cmp(&self.len())) {
393 (Ordering::Equal | Ordering::Greater, _) => None,
394 (_, Ordering::Greater) => None,
395 _ => Some(&mut self.data[a..b]),
396 },
397 }
398 }
399
400 #[inline(always)]
401 fn get_ptr(&self, index: usize) -> Option<*const T> {
402 (index < self.data.capacity()).then(|| unsafe { self.data.as_ptr().add(index) })
403 }
404
405 #[inline(always)]
406 fn get_ptr_mut(&mut self, index: usize) -> Option<*mut T> {
407 (index < self.data.capacity()).then(|| unsafe { self.data.as_mut_ptr().add(index) })
408 }
409
410 #[inline(always)]
411 unsafe fn set_len(&mut self, new_len: usize) {
412 self.data.set_len(new_len)
413 }
414
415 fn binary_search_by<F>(&self, f: F) -> Result<usize, usize>
416 where
417 F: FnMut(&T) -> Ordering,
418 {
419 self.data.binary_search_by(f)
420 }
421
422 fn sort(&mut self)
423 where
424 T: Ord,
425 {
426 self.data.sort();
427 }
428
429 fn sort_by<F>(&mut self, compare: F)
430 where
431 F: FnMut(&T, &T) -> Ordering,
432 {
433 self.data.sort_by(compare)
434 }
435
436 fn sort_by_key<K, F>(&mut self, f: F)
437 where
438 F: FnMut(&T) -> K,
439 K: Ord,
440 {
441 self.data.sort_by_key(f)
442 }
443}
444
445#[cfg(test)]
446mod tests {
447 use crate::prelude::*;
448 use alloc::string::String;
449 use alloc::vec::Vec;
450 use orx_pinned_vec::*;
451 use orx_pseudo_default::PseudoDefault;
452
453 #[test]
454 fn pinned_vec_exact_capacity() {
455 for cap in [0, 124, 5421] {
456 test_pinned_vec(FixedVec::new(cap), cap);
457 }
458 }
459
460 #[test]
461 fn pinned_vec_loose_capacity() {
462 for cap in [0, 124, 5421] {
463 test_pinned_vec(FixedVec::new(cap * 2), cap);
464 }
465 }
466
467 #[test]
468 fn into_inner() {
469 let fixed: FixedVec<_> = (0..16).collect();
470 let vec = fixed.into_inner();
471 assert_eq!(vec, (0..16).collect::<Vec<_>>())
472 }
473
474 #[test]
475 fn index_of_and_contains() {
476 fn test(mut vec: FixedVec<usize>) {
477 let mut another_vec = Vec::new();
478 for i in 0..42 {
479 vec.push(i);
480 another_vec.push(i);
481 }
482 for i in 0..vec.len() {
483 assert_eq!(Some(i), vec.index_of(&vec[i]));
484 assert!(vec.contains_reference(&vec[i]));
485
486 assert_eq!(None, vec.index_of(&another_vec[i]));
487 assert!(!vec.contains_reference(&another_vec[i]));
488
489 let scalar = another_vec[i];
490 assert_eq!(None, vec.index_of(&scalar));
491 assert!(!vec.contains_reference(&scalar));
492 }
493 }
494 test(FixedVec::new(42));
495 test(FixedVec::new(1000));
496 }
497
498 #[test]
499 fn len_and_is_empty() {
500 fn test_len(mut vec: FixedVec<usize>) {
501 for i in 0..42 {
502 assert_eq!(i, vec.len());
503 vec.push(i);
504 }
505 assert_eq!(42, vec.len());
506
507 vec.clear();
508 assert_eq!(0, vec.len());
509
510 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
511 assert_eq!(42, vec.len());
512
513 for i in 0..42 {
514 assert_eq!(42 - i, vec.len());
515 vec.pop();
516 }
517 assert_eq!(0, vec.len());
518
519 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
520 for i in 0..42 {
521 assert_eq!(42 - i, vec.len());
522 vec.remove(vec.len() / 2);
523 }
524 assert_eq!(0, vec.len());
525
526 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
527 for i in 0..42 {
528 assert_eq!(42 - i, vec.len());
529 vec.remove(0);
530 }
531 assert_eq!(0, vec.len());
532
533 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
534 for i in 0..42 {
535 assert_eq!(42 - i, vec.len());
536 vec.remove(vec.len() - 1);
537 }
538 assert_eq!(0, vec.len());
539
540 vec.clear();
541 for i in 0..42 {
542 assert_eq!(i, vec.len());
543 vec.insert(i, i);
544 }
545 assert_eq!(42, vec.len());
546
547 vec.clear();
548 for i in 0..42 {
549 assert_eq!(i, vec.len());
550 vec.insert(0, i);
551 }
552 assert_eq!(42, vec.len());
553 }
554
555 test_len(FixedVec::new(42));
556 test_len(FixedVec::new(1_000));
557 }
558
559 #[test]
560 fn capacity() {
561 let vec: FixedVec<char> = FixedVec::new(44);
562 assert_eq!(44, vec.capacity());
563 assert_eq!(CapacityState::FixedCapacity(44), vec.capacity_state());
564 }
565
566 #[test]
567 fn clear() {
568 fn clear_is_empty(mut vec: FixedVec<usize>) {
569 vec.clear();
570 assert!(vec.is_empty());
571 assert_eq!(0, vec.len());
572
573 vec.push(1);
574 assert!(!vec.is_empty());
575 for i in 0..42 {
576 vec.push(i);
577 }
578 assert!(!vec.is_empty());
579
580 vec.clear();
581 assert!(vec.is_empty());
582 assert_eq!(0, vec.len());
583 }
584 clear_is_empty(FixedVec::new(43));
585 clear_is_empty(FixedVec::new(1000));
586 }
587
588 #[test]
589 fn get() {
590 fn test_get(mut vec: FixedVec<usize>) {
591 assert!(vec.is_empty());
592
593 for i in 0..53 {
594 vec.push(i);
595
596 assert_eq!(vec.get(i), Some(&i));
597 assert_eq!(vec.get(i + 1), None);
598
599 *vec.get_mut(i).expect("is-some") += 100;
600 *unsafe { vec.get_unchecked_mut(i) } += 10;
601 }
602
603 for i in 0..53 {
604 assert_eq!(vec.get(i), Some(&(110 + i)));
605 assert_eq!(unsafe { vec.get_unchecked(i) }, &(110 + i));
606 }
607 }
608 test_get(FixedVec::new(53));
609 test_get(FixedVec::new(1000));
610 }
611
612 #[test]
613 fn first_last() {
614 let mut vec = FixedVec::new(6);
615
616 assert!(vec.first().is_none());
617 assert!(vec.last().is_none());
618
619 vec.push(42);
620
621 assert_eq!(vec.first(), Some(&42));
622 assert_eq!(vec.last(), Some(&42));
623
624 unsafe {
625 assert_eq!(vec.first_unchecked(), &42);
626 assert_eq!(vec.last_unchecked(), &42);
627 }
628
629 vec.push(7);
630
631 assert_eq!(vec.first(), Some(&42));
632 assert_eq!(vec.last(), Some(&7));
633
634 unsafe {
635 assert_eq!(vec.first_unchecked(), &42);
636 assert_eq!(vec.last_unchecked(), &7);
637 }
638
639 vec.insert(1, 56421);
640
641 assert_eq!(vec.first(), Some(&42));
642 assert_eq!(vec.last(), Some(&7));
643
644 unsafe {
645 assert_eq!(vec.first_unchecked(), &42);
646 assert_eq!(vec.last_unchecked(), &7);
647 }
648
649 vec.clear();
650
651 assert!(vec.first().is_none());
652 assert!(vec.last().is_none());
653 }
654
655 #[test]
656 fn extend_from_slice() {
657 fn test(mut vec: FixedVec<usize>) {
658 vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
659 vec.extend_from_slice(&(42..63).collect::<Vec<_>>());
660 vec.extend_from_slice(&(63..100).collect::<Vec<_>>());
661
662 assert_eq!(100, vec.len());
663 for i in 0..100 {
664 assert_eq!(Some(&i), vec.get(i));
665 }
666 }
667 test(FixedVec::new(100));
668 test(FixedVec::new(1000));
669 }
670
671 #[test]
672 fn grow() {
673 fn test(mut vec: FixedVec<usize>) {
674 for i in 0..42 {
675 vec.push(i);
676 }
677 for i in 0..42 {
678 vec.insert(i, 100 + i);
679 }
680
681 for i in 0..42 {
682 assert_eq!(Some(&i), vec.get(42 + i));
683 assert_eq!(Some(&(100 + i)), vec.get(i));
684 }
685 }
686 test(FixedVec::new(84));
687 test(FixedVec::new(1000));
688 }
689
690 #[test]
691 fn shrink() {
692 fn test(mut vec: FixedVec<usize>) {
693 for i in 0..42 {
694 vec.push(i);
695 assert_eq!(i, vec.remove(0));
696 assert!(vec.is_empty());
697 }
698
699 for i in 0..42 {
700 vec.push(i);
701 }
702 for i in 0..42 {
703 assert_eq!(i, vec.remove(0));
704 }
705 assert!(vec.is_empty());
706
707 for i in 0..42 {
708 vec.push(i);
709 }
710 for i in (0..42).rev() {
711 assert_eq!(Some(i), vec.pop());
712 }
713 assert_eq!(None, vec.pop());
714 assert!(vec.is_empty());
715
716 for i in 0..42 {
717 vec.push(i);
718 }
719 for _ in 0..42 {
720 vec.remove(vec.len() / 2);
721 }
722 assert!(vec.is_empty());
723 }
724 test(FixedVec::new(42));
725 test(FixedVec::new(1000));
726 }
727
728 #[test]
729 fn swap() {
730 fn test(mut vec: FixedVec<usize>) {
731 for i in 0..42 {
732 vec.push(i);
733 }
734
735 for i in 0..21 {
736 vec.swap(i, 21 + i);
737 }
738
739 for i in 0..21 {
740 assert_eq!(21 + i, vec[i]);
741 }
742 for i in 21..42 {
743 assert_eq!(i - 21, vec[i]);
744 }
745 }
746 test(FixedVec::new(42));
747 test(FixedVec::new(1000));
748 }
749 #[test]
750 fn truncate() {
751 fn test(mut vec: FixedVec<usize>) {
752 for i in 0..42 {
753 vec.push(i);
754 }
755
756 vec.truncate(100);
757 assert_eq!(vec, (0..42).collect::<Vec<_>>());
758
759 vec.truncate(21);
760 assert_eq!(vec, (0..21).collect::<Vec<_>>());
761 }
762 test(FixedVec::new(42));
763 test(FixedVec::new(1000));
764 }
765
766 #[test]
767 fn eq() {
768 fn test(mut vec: FixedVec<usize>) {
769 let slice = &(0..42).collect::<Vec<usize>>();
770 for i in 0..42 {
771 vec.push(i);
772 }
773 assert!(vec.eq(slice));
774
775 vec.remove(7);
776 assert!(!vec.eq(slice));
777 }
778
779 test(FixedVec::new(142));
780 test(FixedVec::new(1000));
781 }
782
783 #[test]
784 fn clone() {
785 fn test(mut vec: FixedVec<usize>) {
786 assert!(vec.is_empty());
787
788 for i in 0..53 {
789 vec.push(i);
790 }
791
792 let clone = vec.clone();
793 assert_eq!(vec, clone);
794 }
795
796 test(FixedVec::new(53));
797 test(FixedVec::new(1000));
798 }
799
800 #[test]
801 fn slices() {
802 #![allow(for_loops_over_fallibles)]
803 let mut vec = FixedVec::new(184);
804
805 for i in 0..184 {
806 assert!(vec.slices(i..i + 1).is_none());
807 assert!(vec.slices(0..i + 1).is_none());
808 vec.push(i);
809 }
810
811 let slice = vec.slices(0..vec.len());
812 let mut combined = Vec::new();
813 for s in slice {
814 combined.extend_from_slice(s);
815 }
816 for i in 0..184 {
817 assert_eq!(i, vec[i]);
818 assert_eq!(i, combined[i]);
819 }
820
821 let begin = vec.len() / 4;
822 let end = 3 * vec.len() / 4;
823 let slice = vec.slices(begin..end);
824 let mut combined = Vec::new();
825 for s in slice {
826 combined.extend_from_slice(s);
827 }
828 for i in begin..end {
829 assert_eq!(i, vec[i]);
830 assert_eq!(i, combined[i - begin]);
831 }
832 }
833
834 #[test]
835 fn slices_mut() {
836 #![allow(for_loops_over_fallibles)]
837 let mut vec = FixedVec::new(184);
838
839 for i in 0..184 {
840 assert!(vec.slices_mut(i..i + 1).is_none());
841 assert!(vec.slices_mut(0..i + 1).is_none());
842 vec.push(i);
843 }
844
845 let slice = vec.slices_mut(0..vec.len());
846 let mut combined = Vec::new();
847 for s in slice {
848 combined.extend_from_slice(s);
849 }
850 for i in 0..184 {
851 assert_eq!(i, vec[i]);
852 assert_eq!(i, combined[i]);
853 }
854
855 let begin = vec.len() / 4;
856 let end = 3 * vec.len() / 4;
857 let slice = vec.slices_mut(begin..end);
858 let mut combined = Vec::new();
859 for s in slice {
860 combined.extend_from_slice(s);
861 }
862 for i in begin..end {
863 assert_eq!(i, vec[i]);
864 assert_eq!(i, combined[i - begin]);
865 }
866
867 vec.clear();
868
869 for _ in 0..184 {
870 vec.push(0);
871 }
872
873 fn update(slice: Option<&mut [usize]>, begin: usize) {
874 let mut val = begin;
875 for s in slice {
876 for x in s {
877 *x = val;
878 val += 1;
879 }
880 }
881 }
882 let mut fill = |begin: usize, end: usize| {
883 let range = begin..end;
884 update(vec.slices_mut(range), begin);
885 };
886
887 fill(0, 14);
888 fill(14, 56);
889 fill(56, 77);
890 fill(77, 149);
891 fill(149, 182);
892 fill(182, 184);
893 for i in 0..184 {
894 assert_eq!(vec.get(i), Some(&i));
895 }
896 }
897
898 #[test]
899 fn iter_iter_mut() {
900 let mut vec = FixedVec::new(4);
901 vec.push('a');
902 vec.push('b');
903
904 let mut iter = vec.iter();
905 assert_eq!(Some(&'a'), iter.next());
906 assert_eq!(Some(&'b'), iter.next());
907 assert_eq!(None, iter.next());
908
909 for x in vec.iter_mut() {
910 *x = 'x';
911 }
912
913 let mut iter = vec.iter();
914 assert_eq!(Some(&'x'), iter.next());
915 assert_eq!(Some(&'x'), iter.next());
916 assert_eq!(None, iter.next());
917 }
918
919 #[test]
920 fn rev_iter_iter_mut() {
921 let mut vec = FixedVec::new(4);
922 vec.push('a');
923 vec.push('b');
924
925 let mut iter = vec.iter_rev();
926 assert_eq!(Some(&'b'), iter.next());
927 assert_eq!(Some(&'a'), iter.next());
928 assert_eq!(None, iter.next());
929
930 for x in vec.iter_mut_rev() {
931 *x = 'x';
932 }
933
934 let mut iter = vec.iter_rev();
935 assert_eq!(Some(&'x'), iter.next());
936 assert_eq!(Some(&'x'), iter.next());
937 assert_eq!(None, iter.next());
938 }
939
940 #[derive(Debug, PartialEq, Clone)]
941 struct Num(usize);
942 #[test]
943 fn insert() {
944 fn test(mut vec: FixedVec<Num>) {
945 for i in 0..42 {
946 vec.push(Num(i));
947 }
948 for i in 0..42 {
949 vec.insert(i, Num(100 + i));
950 }
951
952 for i in 0..42 {
953 assert_eq!(Some(&Num(i)), vec.get(42 + i));
954 assert_eq!(Some(&Num(100 + i)), vec.get(i));
955 }
956 }
957 test(FixedVec::new(84));
958 test(FixedVec::new(1000));
959 }
960
961 #[test]
962 fn pseudo_default() {
963 let vec = FixedVec::<String>::pseudo_default();
964 assert_eq!(0, vec.capacity());
965 assert_eq!(0, vec.len());
966 }
967}