|
1 | 1 | //! Indexing implementations for `[T]`. |
2 | 2 |
|
3 | | -use crate::ops::{self, Bound, Range, RangeBounds}; |
| 3 | +use crate::ops; |
4 | 4 | use crate::ptr; |
5 | 5 |
|
6 | 6 | #[stable(feature = "rust1", since = "1.0.0")] |
@@ -37,104 +37,31 @@ fn slice_start_index_len_fail(index: usize, len: usize) -> ! { |
37 | 37 | #[inline(never)] |
38 | 38 | #[cold] |
39 | 39 | #[track_caller] |
40 | | -pub(super) fn slice_end_index_len_fail(index: usize, len: usize) -> ! { |
| 40 | +pub(crate) fn slice_end_index_len_fail(index: usize, len: usize) -> ! { |
41 | 41 | panic!("range end index {} out of range for slice of length {}", index, len); |
42 | 42 | } |
43 | 43 |
|
44 | 44 | #[inline(never)] |
45 | 45 | #[cold] |
46 | 46 | #[track_caller] |
47 | | -pub(super) fn slice_index_order_fail(index: usize, end: usize) -> ! { |
| 47 | +pub(crate) fn slice_index_order_fail(index: usize, end: usize) -> ! { |
48 | 48 | panic!("slice index starts at {} but ends at {}", index, end); |
49 | 49 | } |
50 | 50 |
|
51 | 51 | #[inline(never)] |
52 | 52 | #[cold] |
53 | 53 | #[track_caller] |
54 | | -pub(super) fn slice_start_index_overflow_fail() -> ! { |
| 54 | +pub(crate) fn slice_start_index_overflow_fail() -> ! { |
55 | 55 | panic!("attempted to index slice from after maximum usize"); |
56 | 56 | } |
57 | 57 |
|
58 | 58 | #[inline(never)] |
59 | 59 | #[cold] |
60 | 60 | #[track_caller] |
61 | | -pub(super) fn slice_end_index_overflow_fail() -> ! { |
| 61 | +pub(crate) fn slice_end_index_overflow_fail() -> ! { |
62 | 62 | panic!("attempted to index slice up to maximum usize"); |
63 | 63 | } |
64 | 64 |
|
65 | | -/// Performs bounds-checking of the given range. |
66 | | -/// The returned [`Range`] is safe to pass to [`get_unchecked`] and [`get_unchecked_mut`] |
67 | | -/// for slices of the given length. |
68 | | -/// |
69 | | -/// [`get_unchecked`]: ../../std/primitive.slice.html#method.get_unchecked |
70 | | -/// [`get_unchecked_mut`]: ../../std/primitive.slice.html#method.get_unchecked_mut |
71 | | -/// |
72 | | -/// # Panics |
73 | | -/// |
74 | | -/// Panics if the range is out of bounds. |
75 | | -/// |
76 | | -/// # Examples |
77 | | -/// |
78 | | -/// ``` |
79 | | -/// #![feature(slice_check_range)] |
80 | | -/// use std::slice; |
81 | | -/// |
82 | | -/// let v = [10, 40, 30]; |
83 | | -/// assert_eq!(1..2, slice::check_range(v.len(), 1..2)); |
84 | | -/// assert_eq!(0..2, slice::check_range(v.len(), ..2)); |
85 | | -/// assert_eq!(1..3, slice::check_range(v.len(), 1..)); |
86 | | -/// ``` |
87 | | -/// |
88 | | -/// Panics when [`Index::index`] would panic: |
89 | | -/// |
90 | | -/// ```should_panic |
91 | | -/// #![feature(slice_check_range)] |
92 | | -/// |
93 | | -/// std::slice::check_range(3, 2..1); |
94 | | -/// ``` |
95 | | -/// |
96 | | -/// ```should_panic |
97 | | -/// #![feature(slice_check_range)] |
98 | | -/// |
99 | | -/// std::slice::check_range(3, 1..4); |
100 | | -/// ``` |
101 | | -/// |
102 | | -/// ```should_panic |
103 | | -/// #![feature(slice_check_range)] |
104 | | -/// |
105 | | -/// std::slice::check_range(3, 1..=usize::MAX); |
106 | | -/// ``` |
107 | | -/// |
108 | | -/// [`Index::index`]: ops::Index::index |
109 | | -#[track_caller] |
110 | | -#[unstable(feature = "slice_check_range", issue = "76393")] |
111 | | -pub fn check_range<R: RangeBounds<usize>>(len: usize, range: R) -> Range<usize> { |
112 | | - let start = match range.start_bound() { |
113 | | - Bound::Included(&start) => start, |
114 | | - Bound::Excluded(start) => { |
115 | | - start.checked_add(1).unwrap_or_else(|| slice_start_index_overflow_fail()) |
116 | | - } |
117 | | - Bound::Unbounded => 0, |
118 | | - }; |
119 | | - |
120 | | - let end = match range.end_bound() { |
121 | | - Bound::Included(end) => { |
122 | | - end.checked_add(1).unwrap_or_else(|| slice_end_index_overflow_fail()) |
123 | | - } |
124 | | - Bound::Excluded(&end) => end, |
125 | | - Bound::Unbounded => len, |
126 | | - }; |
127 | | - |
128 | | - if start > end { |
129 | | - slice_index_order_fail(start, end); |
130 | | - } |
131 | | - if end > len { |
132 | | - slice_end_index_len_fail(end, len); |
133 | | - } |
134 | | - |
135 | | - Range { start, end } |
136 | | -} |
137 | | - |
138 | 65 | mod private_slice_index { |
139 | 66 | use super::ops; |
140 | 67 | #[stable(feature = "slice_get_slice", since = "1.28.0")] |
|
0 commit comments