1#![allow(unsafe_code)]
2
3use core::ops::Range;
4use core::slice;
5
6pub const fn advance<T>(s: &[T], count: usize) -> &[T] {
7 let len = s.len();
8 assert!(count <= len);
9
10 let base = s.as_ptr();
11 unsafe { slice::from_raw_parts(base.add(count), len - count) }
12}
13
14pub const fn subslice<T>(s: &[T], range: Range<usize>) -> &[T] {
15 let len = s.len();
16 assert!(range.start <= range.end && range.end <= len);
17
18 let base = s.as_ptr();
19 unsafe { slice::from_raw_parts(base.add(range.start), range.end - range.start) }
20}
21
22#[cfg(test)]
23mod tests {
24 use super::*;
25
26 #[test]
27 fn test_subslice() {
28 let buf = b"abcdefgh";
29
30 assert_eq!(subslice(buf, 0..0), &[]);
31 assert_eq!(subslice(buf, 0..1), b"a");
32 assert_eq!(subslice(buf, 1..3), b"bc");
33 assert_eq!(subslice(buf, 7..8), b"h");
34
35 assert_eq!(subslice::<u8>(&[], 0..0), &[]);
36 }
37}