1use core::ops::{
107 Range, RangeBounds, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive,
108};
109
110use crate::{ImplBound, Ref};
111
112pub trait SliceByValue {
115 type Value;
117 fn len(&self) -> usize;
119
120 fn is_empty(&self) -> bool {
122 self.len() == 0
123 }
124}
125
126impl<S: SliceByValue + ?Sized> SliceByValue for &S {
127 type Value = S::Value;
128 #[inline]
129 fn len(&self) -> usize {
130 (**self).len()
131 }
132}
133
134impl<S: SliceByValue + ?Sized> SliceByValue for &mut S {
135 type Value = S::Value;
136 #[inline]
137 fn len(&self) -> usize {
138 (**self).len()
139 }
140}
141
142#[inline(always)]
143fn assert_index(index: usize, len: usize) {
144 assert!(
145 index < len,
146 "index out of bounds: the len is {len} but the index is {index}",
147 );
148}
149
150#[inline(always)]
151fn assert_range(range: &impl ComposeRange, len: usize) {
152 assert!(
153 range.is_valid(len),
154 "range {range:?} out of range for slice of length {len}: ",
155 );
156}
157
158pub trait SliceByValueGet: SliceByValue {
163 fn index_value(&self, index: usize) -> Self::Value {
165 assert_index(index, self.len());
166 unsafe { self.get_value_unchecked(index) }
168 }
169
170 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value;
179
180 fn get_value(&self, index: usize) -> Option<Self::Value> {
182 if index < self.len() {
183 let value = unsafe { self.get_value_unchecked(index) };
185 Some(value)
186 } else {
187 None
188 }
189 }
190}
191
192impl<S: SliceByValueGet + ?Sized> SliceByValueGet for &S {
193 fn get_value(&self, index: usize) -> Option<Self::Value> {
194 (**self).get_value(index)
195 }
196 fn index_value(&self, index: usize) -> Self::Value {
197 (**self).index_value(index)
198 }
199 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
200 unsafe { (**self).get_value_unchecked(index) }
201 }
202}
203
204impl<S: SliceByValueGet + ?Sized> SliceByValueGet for &mut S {
205 fn get_value(&self, index: usize) -> Option<Self::Value> {
206 (**self).get_value(index)
207 }
208 fn index_value(&self, index: usize) -> Self::Value {
209 (**self).index_value(index)
210 }
211 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
212 unsafe { (**self).get_value_unchecked(index) }
213 }
214}
215
216pub trait SliceByValueSet: SliceByValue {
224 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value);
233
234 fn set_value(&mut self, index: usize, value: Self::Value) {
240 assert_index(index, self.len());
241 unsafe {
243 self.set_value_unchecked(index, value);
244 }
245 }
246}
247
248impl<S: SliceByValueSet + ?Sized> SliceByValueSet for &mut S {
249 fn set_value(&mut self, index: usize, value: Self::Value) {
250 (**self).set_value(index, value);
251 }
252 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
253 (**self).set_value_unchecked(index, value);
254 }
255}
256
257pub trait SliceByValueRepl: SliceByValue {
261 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value;
270
271 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
278 assert_index(index, self.len());
279 unsafe { self.replace_value_unchecked(index, value) }
281 }
282}
283
284impl<S: SliceByValueRepl + ?Sized> SliceByValueRepl for &mut S {
285 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
286 (**self).replace_value(index, value)
287 }
288 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value {
289 (**self).replace_value_unchecked(index, value)
290 }
291}
292
293pub trait ComposeRange: RangeBounds<usize> + core::fmt::Debug {
300 fn is_valid(&self, len: usize) -> bool;
303
304 fn compose(&self, base: Range<usize>) -> Range<usize>;
320}
321
322impl ComposeRange for Range<usize> {
323 fn is_valid(&self, len: usize) -> bool {
324 self.start <= len && self.end <= len && self.start <= self.end
325 }
326
327 fn compose(&self, base: Range<usize>) -> Range<usize> {
328 (base.start + self.start)..(base.start + self.end)
329 }
330}
331
332impl ComposeRange for RangeFrom<usize> {
333 fn is_valid(&self, len: usize) -> bool {
334 self.start <= len
335 }
336
337 fn compose(&self, base: Range<usize>) -> Range<usize> {
338 (base.start + self.start)..base.end
339 }
340}
341
342impl ComposeRange for RangeFull {
343 fn is_valid(&self, _len: usize) -> bool {
344 true
345 }
346
347 fn compose(&self, base: Range<usize>) -> Range<usize> {
348 base
349 }
350}
351
352impl ComposeRange for RangeInclusive<usize> {
353 fn is_valid(&self, len: usize) -> bool {
354 *self.start() < len && *self.end() < len && self.start() <= self.end()
355 }
356
357 fn compose(&self, base: Range<usize>) -> Range<usize> {
358 (base.start + self.start())..(base.start + self.end() + 1)
359 }
360}
361
362impl ComposeRange for RangeTo<usize> {
363 fn is_valid(&self, len: usize) -> bool {
364 self.end <= len
365 }
366
367 fn compose(&self, base: Range<usize>) -> Range<usize> {
368 base.start..(base.start + self.end)
369 }
370}
371
372impl ComposeRange for RangeToInclusive<usize> {
373 fn is_valid(&self, len: usize) -> bool {
374 self.end < len
375 }
376
377 fn compose(&self, base: Range<usize>) -> Range<usize> {
378 base.start..(base.start + self.end + 1)
379 }
380}
381
382pub trait SliceByValueSubsliceGat<'a, __Implicit: ImplBound = Ref<'a, Self>>:
405 SliceByValueGet
406{
407 type Subslice: 'a + SliceByValueGet<Value = Self::Value> + SliceByValueSubslice;
409}
410
411#[allow(type_alias_bounds)] pub type Subslice<'a, T: SliceByValueSubsliceGat<'a>> =
415 <T as SliceByValueSubsliceGat<'a>>::Subslice;
416
417impl<'a, T: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for &T {
418 type Subslice = T::Subslice;
419}
420
421impl<'a, T: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for &mut T {
422 type Subslice = T::Subslice;
423}
424
425pub trait SliceByValueSubsliceRange<R: ComposeRange>: for<'a> SliceByValueSubsliceGat<'a> {
434 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
436 assert_range(&range, self.len());
437 unsafe {
438 self.get_subslice_unchecked(range)
440 }
441 }
442
443 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self>;
453
454 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
456 if range.is_valid(self.len()) {
457 let subslice = unsafe { self.get_subslice_unchecked(range) };
458 Some(subslice)
459 } else {
460 None
461 }
462 }
463}
464
465impl<R: ComposeRange, S: SliceByValueSubsliceRange<R> + ?Sized> SliceByValueSubsliceRange<R>
466 for &S
467{
468 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
469 (**self).get_subslice(range)
470 }
471 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
472 (**self).index_subslice(range)
473 }
474 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self> {
475 unsafe { (**self).get_subslice_unchecked(range) }
476 }
477}
478impl<R: ComposeRange, S: SliceByValueSubsliceRange<R> + ?Sized> SliceByValueSubsliceRange<R>
479 for &mut S
480{
481 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
482 (**self).get_subslice(range)
483 }
484 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
485 (**self).index_subslice(range)
486 }
487 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self> {
488 unsafe { (**self).get_subslice_unchecked(range) }
489 }
490}
491
492pub trait SliceByValueSubsliceGatMut<'a, __Implicit = &'a Self>:
496 SliceByValueSet + SliceByValueRepl
497{
498 type SubsliceMut: 'a
500 + SliceByValueSet<Value = Self::Value>
501 + SliceByValueRepl<Value = Self::Value>
502 + SliceByValueSubsliceGatMut<'a, SubsliceMut = Self::SubsliceMut> + SliceByValueSubsliceMut;
504}
505
506#[allow(type_alias_bounds)] pub type SubsliceMut<'a, T: SliceByValueSubsliceGatMut<'a>> =
510 <T as SliceByValueSubsliceGatMut<'a>>::SubsliceMut;
511
512impl<'a, T: SliceByValueSubsliceGatMut<'a> + ?Sized> SliceByValueSubsliceGatMut<'a> for &mut T {
513 type SubsliceMut = T::SubsliceMut;
514}
515
516pub trait SliceByValueSubsliceRangeMut<R: ComposeRange>:
525 for<'a> SliceByValueSubsliceGatMut<'a>
526{
527 fn index_subslice_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
529 assert_range(&range, self.len());
530 unsafe {
531 self.get_subslice_unchecked_mut(range)
533 }
534 }
535
536 unsafe fn get_subslice_unchecked_mut(&mut self, range: R) -> SubsliceMut<'_, Self>;
546
547 fn get_subslice_mut(&mut self, range: R) -> Option<SubsliceMut<'_, Self>> {
549 if range.is_valid(self.len()) {
550 let subslice_mut = unsafe { self.get_subslice_unchecked_mut(range) };
552 Some(subslice_mut)
553 } else {
554 None
555 }
556 }
557}
558
559impl<R: ComposeRange, S: SliceByValueSubsliceRangeMut<R> + ?Sized> SliceByValueSubsliceRangeMut<R>
560 for &mut S
561{
562 fn get_subslice_mut(&mut self, range: R) -> Option<SubsliceMut<'_, Self>> {
563 (**self).get_subslice_mut(range)
564 }
565 fn index_subslice_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
566 (**self).index_subslice_mut(range)
567 }
568 unsafe fn get_subslice_unchecked_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
569 (**self).get_subslice_unchecked_mut(range)
570 }
571}
572
573pub trait SliceByValueSubslice:
623 SliceByValueSubsliceRange<Range<usize>>
624 + SliceByValueSubsliceRange<RangeFrom<usize>>
625 + SliceByValueSubsliceRange<RangeFull>
626 + SliceByValueSubsliceRange<RangeInclusive<usize>>
627 + SliceByValueSubsliceRange<RangeTo<usize>>
628 + SliceByValueSubsliceRange<RangeToInclusive<usize>>
629{
630}
631
632impl<U> SliceByValueSubslice for U
633where
634 U: SliceByValueSubsliceRange<Range<usize>>,
635 U: SliceByValueSubsliceRange<RangeFrom<usize>>,
636 U: SliceByValueSubsliceRange<RangeFull>,
637 U: SliceByValueSubsliceRange<RangeInclusive<usize>>,
638 U: SliceByValueSubsliceRange<RangeTo<usize>>,
639 U: SliceByValueSubsliceRange<RangeToInclusive<usize>>,
640{
641}
642
643pub trait SliceByValueSubsliceMut:
693 SliceByValueSubsliceRangeMut<Range<usize>>
694 + SliceByValueSubsliceRangeMut<RangeFrom<usize>>
695 + SliceByValueSubsliceRangeMut<RangeFull>
696 + SliceByValueSubsliceRangeMut<RangeInclusive<usize>>
697 + SliceByValueSubsliceRangeMut<RangeTo<usize>>
698 + SliceByValueSubsliceRangeMut<RangeToInclusive<usize>>
699{
700}
701
702impl<U> SliceByValueSubsliceMut for U
703where
704 U: SliceByValueSubsliceRangeMut<Range<usize>>,
705 U: SliceByValueSubsliceRangeMut<RangeFrom<usize>>,
706 U: SliceByValueSubsliceRangeMut<RangeFull>,
707 U: SliceByValueSubsliceRangeMut<RangeInclusive<usize>>,
708 U: SliceByValueSubsliceRangeMut<RangeTo<usize>>,
709 U: SliceByValueSubsliceRangeMut<RangeToInclusive<usize>>,
710{
711}
712
713#[cfg(feature = "alloc")]
714mod alloc_impls {
715 use super::*;
716 #[cfg(all(feature = "alloc", not(feature = "std")))]
717 use alloc::boxed::Box;
718
719 impl<S: SliceByValue + ?Sized> SliceByValue for Box<S> {
720 type Value = S::Value;
721 #[inline]
722 fn len(&self) -> usize {
723 (**self).len()
724 }
725 }
726
727 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Box<S> {
728 fn get_value(&self, index: usize) -> Option<Self::Value> {
729 (**self).get_value(index)
730 }
731 fn index_value(&self, index: usize) -> Self::Value {
732 (**self).index_value(index)
733 }
734 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
735 unsafe { (**self).get_value_unchecked(index) }
736 }
737 }
738
739 impl<S: SliceByValueSet + ?Sized> SliceByValueSet for Box<S> {
740 fn set_value(&mut self, index: usize, value: Self::Value) {
741 (**self).set_value(index, value);
742 }
743 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
744 unsafe {
745 (**self).set_value_unchecked(index, value);
746 }
747 }
748 }
749
750 impl<S: SliceByValueRepl + ?Sized> SliceByValueRepl for Box<S> {
751 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
752 (**self).replace_value(index, value)
753 }
754 unsafe fn replace_value_unchecked(
755 &mut self,
756 index: usize,
757 value: Self::Value,
758 ) -> Self::Value {
759 unsafe { (**self).replace_value_unchecked(index, value) }
760 }
761 }
762
763 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Box<S> {
764 type Subslice = S::Subslice;
765 }
766 impl<'a, S: SliceByValueSubsliceGatMut<'a> + ?Sized> SliceByValueSubsliceGatMut<'a> for Box<S> {
767 type SubsliceMut = S::SubsliceMut;
768 }
769
770 macro_rules! impl_range_alloc {
771 ($range:ty) => {
772 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
773 for Box<S>
774 {
775 #[inline]
776 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
777 (**self).get_subslice(index)
778 }
779
780 #[inline]
781 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
782 (**self).index_subslice(index)
783 }
784
785 #[inline]
786 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
787 unsafe { (**self).get_subslice_unchecked(index) }
788 }
789 }
790 impl<S: SliceByValueSubsliceRangeMut<$range> + ?Sized>
791 SliceByValueSubsliceRangeMut<$range> for Box<S>
792 {
793 #[inline]
794 fn get_subslice_mut(&mut self, index: $range) -> Option<SubsliceMut<'_, Self>> {
795 (**self).get_subslice_mut(index)
796 }
797
798 #[inline]
799 fn index_subslice_mut(&mut self, index: $range) -> SubsliceMut<'_, Self> {
800 (**self).index_subslice_mut(index)
801 }
802
803 #[inline]
804 unsafe fn get_subslice_unchecked_mut(
805 &mut self,
806 index: $range,
807 ) -> SubsliceMut<'_, Self> {
808 unsafe { (**self).get_subslice_unchecked_mut(index) }
809 }
810 }
811 };
812 }
813
814 impl_range_alloc!(RangeFull);
815 impl_range_alloc!(RangeFrom<usize>);
816 impl_range_alloc!(RangeTo<usize>);
817 impl_range_alloc!(Range<usize>);
818 impl_range_alloc!(RangeInclusive<usize>);
819 impl_range_alloc!(RangeToInclusive<usize>);
820}
821
822#[cfg(feature = "std")]
823mod std_impls {
824 use super::*;
825 use std::{rc::Rc, sync::Arc};
826
827 impl<S: SliceByValue + ?Sized> SliceByValue for Arc<S> {
828 type Value = S::Value;
829 #[inline]
830 fn len(&self) -> usize {
831 (**self).len()
832 }
833 }
834
835 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Arc<S> {
836 fn get_value(&self, index: usize) -> Option<Self::Value> {
837 (**self).get_value(index)
838 }
839 fn index_value(&self, index: usize) -> Self::Value {
840 (**self).index_value(index)
841 }
842 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
843 (**self).get_value_unchecked(index)
844 }
845 }
846 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Arc<S> {
847 type Subslice = S::Subslice;
848 }
849
850 impl<S: SliceByValue + ?Sized> SliceByValue for Rc<S> {
851 type Value = S::Value;
852 #[inline]
853 fn len(&self) -> usize {
854 (**self).len()
855 }
856 }
857
858 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Rc<S> {
859 fn get_value(&self, index: usize) -> Option<Self::Value> {
860 (**self).get_value(index)
861 }
862 fn index_value(&self, index: usize) -> Self::Value {
863 (**self).index_value(index)
864 }
865 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
866 (**self).get_value_unchecked(index)
867 }
868 }
869
870 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Rc<S> {
871 type Subslice = S::Subslice;
872 }
873
874 macro_rules! impl_range_arc_and_rc {
875 ($range:ty) => {
876 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
877 for Rc<S>
878 {
879 #[inline]
880 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
881 (**self).get_subslice(index)
882 }
883
884 #[inline]
885 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
886 (**self).index_subslice(index)
887 }
888
889 #[inline]
890 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
891 unsafe { (**self).get_subslice_unchecked(index) }
892 }
893 }
894 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
895 for Arc<S>
896 {
897 #[inline]
898 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
899 (**self).get_subslice(index)
900 }
901
902 #[inline]
903 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
904 (**self).index_subslice(index)
905 }
906
907 #[inline]
908 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
909 unsafe { (**self).get_subslice_unchecked(index) }
910 }
911 }
912 };
913 }
914
915 impl_range_arc_and_rc!(RangeFull);
916 impl_range_arc_and_rc!(RangeFrom<usize>);
917 impl_range_arc_and_rc!(RangeTo<usize>);
918 impl_range_arc_and_rc!(Range<usize>);
919 impl_range_arc_and_rc!(RangeInclusive<usize>);
920 impl_range_arc_and_rc!(RangeToInclusive<usize>);
921}
922
923#[cfg(test)]
924mod tests {
925
926 use super::*;
927
928 #[test]
929 #[allow(clippy::reversed_empty_ranges)]
930 fn test_good_ranges() {
931 assert!((0..1).is_valid(1));
933 assert!(!(1..0).is_valid(1));
934 assert!(!(0..1).is_valid(0));
935
936 assert!((0..).is_valid(1));
938 assert!((1..).is_valid(1));
939 assert!(!(2..).is_valid(1));
940
941 assert!((..).is_valid(0));
943 assert!((..).is_valid(1));
944
945 assert!((0..=1).is_valid(2));
947 assert!(!(1..=0).is_valid(2));
948 assert!(!(0..=1).is_valid(1));
949
950 assert!((..0).is_valid(1));
952 assert!((..1).is_valid(1));
953 assert!(!(..2).is_valid(1));
954
955 assert!((..=0).is_valid(2));
957 assert!((..=1).is_valid(2));
958 assert!(!(..=2).is_valid(2));
959 }
960}