1use core::{
107 hint::unreachable_unchecked,
108 ops::{
109 Bound, Range, RangeBounds, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive,
110 },
111};
112
113use crate::{ImplBound, Ref};
114
115pub trait SliceByValue {
118 type Value;
120 fn len(&self) -> usize;
122
123 fn is_empty(&self) -> bool {
125 self.len() == 0
126 }
127}
128
129impl<S: SliceByValue + ?Sized> SliceByValue for &S {
130 type Value = S::Value;
131 #[inline]
132 fn len(&self) -> usize {
133 (**self).len()
134 }
135}
136
137impl<S: SliceByValue + ?Sized> SliceByValue for &mut S {
138 type Value = S::Value;
139 #[inline]
140 fn len(&self) -> usize {
141 (**self).len()
142 }
143}
144
145#[inline(always)]
146fn assert_index(index: usize, len: usize) {
147 assert!(
148 index < len,
149 "index out of bounds: the len is {len} but the index is {index}",
150 );
151}
152
153#[inline(always)]
154fn assert_range(range: &impl RangeCheck, len: usize) {
155 assert!(
156 range.is_valid(len),
157 "range {range:?} out of range for slice of length {len}: ",
158 );
159}
160
161pub trait SliceByValueGet: SliceByValue {
166 fn index_value(&self, index: usize) -> Self::Value {
168 assert_index(index, self.len());
169 unsafe { self.get_value_unchecked(index) }
171 }
172
173 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value;
182
183 fn get_value(&self, index: usize) -> Option<Self::Value> {
185 if index < self.len() {
186 unsafe { Some(self.get_value_unchecked(index)) }
188 } else {
189 None
190 }
191 }
192}
193
194impl<S: SliceByValueGet + ?Sized> SliceByValueGet for &S {
195 fn get_value(&self, index: usize) -> Option<Self::Value> {
196 (**self).get_value(index)
197 }
198 fn index_value(&self, index: usize) -> Self::Value {
199 (**self).index_value(index)
200 }
201 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
202 unsafe { (**self).get_value_unchecked(index) }
203 }
204}
205
206impl<S: SliceByValueGet + ?Sized> SliceByValueGet for &mut S {
207 fn get_value(&self, index: usize) -> Option<Self::Value> {
208 (**self).get_value(index)
209 }
210 fn index_value(&self, index: usize) -> Self::Value {
211 (**self).index_value(index)
212 }
213 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
214 unsafe { (**self).get_value_unchecked(index) }
215 }
216}
217
218pub trait SliceByValueSet: SliceByValue {
226 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value);
235
236 fn set_value(&mut self, index: usize, value: Self::Value) {
242 assert_index(index, self.len());
243 unsafe {
245 self.set_value_unchecked(index, value);
246 }
247 }
248}
249
250impl<S: SliceByValueSet + ?Sized> SliceByValueSet for &mut S {
251 fn set_value(&mut self, index: usize, value: Self::Value) {
252 (**self).set_value(index, value);
253 }
254 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
255 (**self).set_value_unchecked(index, value);
256 }
257}
258
259pub trait SliceByValueRepl: SliceByValue {
263 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value;
272
273 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
280 assert_index(index, self.len());
281 unsafe { self.replace_value_unchecked(index, value) }
283 }
284}
285
286impl<S: SliceByValueRepl + ?Sized> SliceByValueRepl for &mut S {
287 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
288 (**self).replace_value(index, value)
289 }
290 unsafe fn replace_value_unchecked(&mut self, index: usize, value: Self::Value) -> Self::Value {
291 (**self).replace_value_unchecked(index, value)
292 }
293}
294
295pub trait RangeCheck: RangeBounds<usize> + core::fmt::Debug {
301 fn is_valid(&self, len: usize) -> bool;
304}
305
306impl RangeCheck for Range<usize> {
307 fn is_valid(&self, len: usize) -> bool {
308 self.start <= len && self.end <= len && self.start <= self.end
309 }
310}
311
312impl RangeCheck for RangeFrom<usize> {
313 fn is_valid(&self, len: usize) -> bool {
314 self.start <= len
315 }
316}
317
318impl RangeCheck for RangeFull {
319 fn is_valid(&self, _len: usize) -> bool {
320 true
321 }
322}
323
324impl RangeCheck for RangeInclusive<usize> {
325 fn is_valid(&self, len: usize) -> bool {
326 let start = match self.start_bound() {
329 Bound::Included(s) => *s,
330 _ => unsafe { unreachable_unchecked() },
332 };
333 let end = match self.end_bound() {
334 Bound::Included(s) => *s,
335 _ => unsafe { unreachable_unchecked() },
337 };
338 start < len && end < len && start <= end
339 }
340}
341
342impl RangeCheck for RangeTo<usize> {
343 fn is_valid(&self, len: usize) -> bool {
344 self.end <= len
345 }
346}
347
348impl RangeCheck for RangeToInclusive<usize> {
349 fn is_valid(&self, len: usize) -> bool {
350 self.end < len
351 }
352}
353
354pub trait SliceByValueSubsliceGat<'a, __Implicit: ImplBound = Ref<'a, Self>>:
377 SliceByValueGet
378{
379 type Subslice: 'a + SliceByValueGet<Value = Self::Value> + SliceByValueSubslice;
380}
381
382impl<'a, T: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for &T {
383 type Subslice = <T as SliceByValueSubsliceGat<'a>>::Subslice;
384}
385
386impl<'a, T: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for &mut T {
387 type Subslice = <T as SliceByValueSubsliceGat<'a>>::Subslice;
388}
389
390#[allow(type_alias_bounds)] pub type Subslice<'a, T: SliceByValueSubsliceGat<'a>> =
394 <T as SliceByValueSubsliceGat<'a>>::Subslice;
395
396pub trait SliceByValueSubsliceRange<R: RangeCheck>: for<'a> SliceByValueSubsliceGat<'a> {
405 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
407 assert_range(&range, self.len());
408 unsafe {
409 self.get_subslice_unchecked(range)
411 }
412 }
413
414 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self>;
424
425 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
427 if range.is_valid(self.len()) {
428 unsafe { Some(self.get_subslice_unchecked(range)) }
430 } else {
431 None
432 }
433 }
434}
435
436impl<R: RangeCheck, S: SliceByValueSubsliceRange<R> + ?Sized> SliceByValueSubsliceRange<R> for &S {
437 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
438 (**self).get_subslice(range)
439 }
440 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
441 (**self).index_subslice(range)
442 }
443 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self> {
444 unsafe { (**self).get_subslice_unchecked(range) }
445 }
446}
447impl<R: RangeCheck, S: SliceByValueSubsliceRange<R> + ?Sized> SliceByValueSubsliceRange<R>
448 for &mut S
449{
450 fn get_subslice(&self, range: R) -> Option<Subslice<'_, Self>> {
451 (**self).get_subslice(range)
452 }
453 fn index_subslice(&self, range: R) -> Subslice<'_, Self> {
454 (**self).index_subslice(range)
455 }
456 unsafe fn get_subslice_unchecked(&self, range: R) -> Subslice<'_, Self> {
457 unsafe { (**self).get_subslice_unchecked(range) }
458 }
459}
460
461pub trait SliceByValueSubsliceGatMut<'a, __Implicit = &'a Self>:
468 SliceByValueSet + SliceByValueRepl
469{
470 type Subslice: 'a
471 + SliceByValueSet<Value = Self::Value>
472 + SliceByValueRepl<Value = Self::Value>
473 + SliceByValueSubsliceGatMut<'a, Subslice = Self::Subslice> + SliceByValueSubsliceMut;
475}
476
477impl<'a, T: SliceByValueSubsliceGatMut<'a> + ?Sized> SliceByValueSubsliceGatMut<'a> for &mut T {
478 type Subslice = <T as SliceByValueSubsliceGatMut<'a>>::Subslice;
479}
480
481#[allow(type_alias_bounds)] pub type SubsliceMut<'a, T: SliceByValueSubsliceGatMut<'a>> =
485 <T as SliceByValueSubsliceGatMut<'a>>::Subslice;
486
487pub trait SliceByValueSubsliceRangeMut<R: RangeCheck>:
496 for<'a> SliceByValueSubsliceGatMut<'a>
497{
498 fn index_subslice_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
500 assert_range(&range, self.len());
501 unsafe {
502 self.get_subslice_unchecked_mut(range)
504 }
505 }
506
507 unsafe fn get_subslice_unchecked_mut(&mut self, range: R) -> SubsliceMut<'_, Self>;
517
518 fn get_subslice_mut(&mut self, range: R) -> Option<SubsliceMut<'_, Self>> {
520 if range.is_valid(self.len()) {
521 unsafe { Some(self.get_subslice_unchecked_mut(range)) }
523 } else {
524 None
525 }
526 }
527}
528
529impl<R: RangeCheck, S: SliceByValueSubsliceRangeMut<R> + ?Sized> SliceByValueSubsliceRangeMut<R>
530 for &mut S
531{
532 fn get_subslice_mut(&mut self, range: R) -> Option<SubsliceMut<'_, Self>> {
533 (**self).get_subslice_mut(range)
534 }
535 fn index_subslice_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
536 (**self).index_subslice_mut(range)
537 }
538 unsafe fn get_subslice_unchecked_mut(&mut self, range: R) -> SubsliceMut<'_, Self> {
539 (**self).get_subslice_unchecked_mut(range)
540 }
541}
542
543pub trait SliceByValueSubslice:
550 SliceByValueSubsliceRange<Range<usize>>
551 + SliceByValueSubsliceRange<RangeFrom<usize>>
552 + SliceByValueSubsliceRange<RangeFull>
553 + SliceByValueSubsliceRange<RangeInclusive<usize>>
554 + SliceByValueSubsliceRange<RangeTo<usize>>
555 + SliceByValueSubsliceRange<RangeToInclusive<usize>>
556{
557}
558
559impl<U> SliceByValueSubslice for U
560where
561 U: SliceByValueSubsliceRange<Range<usize>>,
562 U: SliceByValueSubsliceRange<RangeFrom<usize>>,
563 U: SliceByValueSubsliceRange<RangeFull>,
564 U: SliceByValueSubsliceRange<RangeInclusive<usize>>,
565 U: SliceByValueSubsliceRange<RangeTo<usize>>,
566 U: SliceByValueSubsliceRange<RangeToInclusive<usize>>,
567{
568}
569
570pub trait SliceByValueSubsliceMut:
577 SliceByValueSubsliceRangeMut<Range<usize>>
578 + SliceByValueSubsliceRangeMut<RangeFrom<usize>>
579 + SliceByValueSubsliceRangeMut<RangeFull>
580 + SliceByValueSubsliceRangeMut<RangeInclusive<usize>>
581 + SliceByValueSubsliceRangeMut<RangeTo<usize>>
582 + SliceByValueSubsliceRangeMut<RangeToInclusive<usize>>
583{
584}
585
586impl<U> SliceByValueSubsliceMut for U
587where
588 U: SliceByValueSubsliceRangeMut<Range<usize>>,
589 U: SliceByValueSubsliceRangeMut<RangeFrom<usize>>,
590 U: SliceByValueSubsliceRangeMut<RangeFull>,
591 U: SliceByValueSubsliceRangeMut<RangeInclusive<usize>>,
592 U: SliceByValueSubsliceRangeMut<RangeTo<usize>>,
593 U: SliceByValueSubsliceRangeMut<RangeToInclusive<usize>>,
594{
595}
596
597#[cfg(feature = "alloc")]
598mod alloc_impls {
599 use super::*;
600 #[cfg(all(feature = "alloc", not(feature = "std")))]
601 use alloc::boxed::Box;
602
603 impl<S: SliceByValue + ?Sized> SliceByValue for Box<S> {
604 type Value = S::Value;
605 #[inline]
606 fn len(&self) -> usize {
607 (**self).len()
608 }
609 }
610
611 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Box<S> {
612 fn get_value(&self, index: usize) -> Option<Self::Value> {
613 (**self).get_value(index)
614 }
615 fn index_value(&self, index: usize) -> Self::Value {
616 (**self).index_value(index)
617 }
618 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
619 unsafe { (**self).get_value_unchecked(index) }
620 }
621 }
622
623 impl<S: SliceByValueSet + ?Sized> SliceByValueSet for Box<S> {
624 fn set_value(&mut self, index: usize, value: Self::Value) {
625 (**self).set_value(index, value);
626 }
627 unsafe fn set_value_unchecked(&mut self, index: usize, value: Self::Value) {
628 unsafe {
629 (**self).set_value_unchecked(index, value);
630 }
631 }
632 }
633
634 impl<S: SliceByValueRepl + ?Sized> SliceByValueRepl for Box<S> {
635 fn replace_value(&mut self, index: usize, value: Self::Value) -> Self::Value {
636 (**self).replace_value(index, value)
637 }
638 unsafe fn replace_value_unchecked(
639 &mut self,
640 index: usize,
641 value: Self::Value,
642 ) -> Self::Value {
643 unsafe { (**self).replace_value_unchecked(index, value) }
644 }
645 }
646
647 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Box<S> {
648 type Subslice = S::Subslice;
649 }
650 impl<'a, S: SliceByValueSubsliceGatMut<'a> + ?Sized> SliceByValueSubsliceGatMut<'a> for Box<S> {
651 type Subslice = S::Subslice;
652 }
653
654 macro_rules! impl_range_alloc {
655 ($range:ty) => {
656 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
657 for Box<S>
658 {
659 #[inline]
660 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
661 (**self).get_subslice(index)
662 }
663
664 #[inline]
665 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
666 (**self).index_subslice(index)
667 }
668
669 #[inline]
670 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
671 unsafe { (**self).get_subslice_unchecked(index) }
672 }
673 }
674 impl<S: SliceByValueSubsliceRangeMut<$range> + ?Sized>
675 SliceByValueSubsliceRangeMut<$range> for Box<S>
676 {
677 #[inline]
678 fn get_subslice_mut(&mut self, index: $range) -> Option<SubsliceMut<'_, Self>> {
679 (**self).get_subslice_mut(index)
680 }
681
682 #[inline]
683 fn index_subslice_mut(&mut self, index: $range) -> SubsliceMut<'_, Self> {
684 (**self).index_subslice_mut(index)
685 }
686
687 #[inline]
688 unsafe fn get_subslice_unchecked_mut(
689 &mut self,
690 index: $range,
691 ) -> SubsliceMut<'_, Self> {
692 unsafe { (**self).get_subslice_unchecked_mut(index) }
693 }
694 }
695 };
696 }
697
698 impl_range_alloc!(RangeFull);
699 impl_range_alloc!(RangeFrom<usize>);
700 impl_range_alloc!(RangeTo<usize>);
701 impl_range_alloc!(Range<usize>);
702 impl_range_alloc!(RangeInclusive<usize>);
703 impl_range_alloc!(RangeToInclusive<usize>);
704}
705
706#[cfg(feature = "std")]
707mod std_impls {
708 use super::*;
709 use std::{rc::Rc, sync::Arc};
710
711 impl<S: SliceByValue + ?Sized> SliceByValue for Arc<S> {
712 type Value = S::Value;
713 #[inline]
714 fn len(&self) -> usize {
715 (**self).len()
716 }
717 }
718
719 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Arc<S> {
720 fn get_value(&self, index: usize) -> Option<Self::Value> {
721 (**self).get_value(index)
722 }
723 fn index_value(&self, index: usize) -> Self::Value {
724 (**self).index_value(index)
725 }
726 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
727 (**self).get_value_unchecked(index)
728 }
729 }
730 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Arc<S> {
731 type Subslice = S::Subslice;
732 }
733
734 impl<S: SliceByValue + ?Sized> SliceByValue for Rc<S> {
735 type Value = S::Value;
736 #[inline]
737 fn len(&self) -> usize {
738 (**self).len()
739 }
740 }
741
742 impl<S: SliceByValueGet + ?Sized> SliceByValueGet for Rc<S> {
743 fn get_value(&self, index: usize) -> Option<Self::Value> {
744 (**self).get_value(index)
745 }
746 fn index_value(&self, index: usize) -> Self::Value {
747 (**self).index_value(index)
748 }
749 unsafe fn get_value_unchecked(&self, index: usize) -> Self::Value {
750 (**self).get_value_unchecked(index)
751 }
752 }
753
754 impl<'a, S: SliceByValueSubsliceGat<'a> + ?Sized> SliceByValueSubsliceGat<'a> for Rc<S> {
755 type Subslice = S::Subslice;
756 }
757
758 macro_rules! impl_range_arc_and_rc {
759 ($range:ty) => {
760 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
761 for Rc<S>
762 {
763 #[inline]
764 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
765 (**self).get_subslice(index)
766 }
767
768 #[inline]
769 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
770 (**self).index_subslice(index)
771 }
772
773 #[inline]
774 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
775 unsafe { (**self).get_subslice_unchecked(index) }
776 }
777 }
778 impl<S: SliceByValueSubsliceRange<$range> + ?Sized> SliceByValueSubsliceRange<$range>
779 for Arc<S>
780 {
781 #[inline]
782 fn get_subslice(&self, index: $range) -> Option<Subslice<'_, Self>> {
783 (**self).get_subslice(index)
784 }
785
786 #[inline]
787 fn index_subslice(&self, index: $range) -> Subslice<'_, Self> {
788 (**self).index_subslice(index)
789 }
790
791 #[inline]
792 unsafe fn get_subslice_unchecked(&self, index: $range) -> Subslice<'_, Self> {
793 unsafe { (**self).get_subslice_unchecked(index) }
794 }
795 }
796 };
797 }
798
799 impl_range_arc_and_rc!(RangeFull);
800 impl_range_arc_and_rc!(RangeFrom<usize>);
801 impl_range_arc_and_rc!(RangeTo<usize>);
802 impl_range_arc_and_rc!(Range<usize>);
803 impl_range_arc_and_rc!(RangeInclusive<usize>);
804 impl_range_arc_and_rc!(RangeToInclusive<usize>);
805}
806
807#[cfg(test)]
808mod tests {
809
810 use super::*;
811
812 #[test]
813 #[allow(clippy::reversed_empty_ranges)]
814 fn test_good_ranges() {
815 assert!((0..1).is_valid(1));
817 assert!(!(1..0).is_valid(1));
818 assert!(!(0..1).is_valid(0));
819
820 assert!((0..).is_valid(1));
822 assert!((1..).is_valid(1));
823 assert!(!(2..).is_valid(1));
824
825 assert!((..).is_valid(0));
827 assert!((..).is_valid(1));
828
829 assert!((0..=1).is_valid(2));
831 assert!(!(1..=0).is_valid(2));
832 assert!(!(0..=1).is_valid(1));
833
834 assert!((..0).is_valid(1));
836 assert!((..1).is_valid(1));
837 assert!(!(..2).is_valid(1));
838
839 assert!((..=0).is_valid(2));
841 assert!((..=1).is_valid(2));
842 assert!(!(..=2).is_valid(2));
843 }
844}