const_str/
slice.rs

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}