1use core::ops::{Index, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
2use core::ptr;
3
4use crate::Bs;
5use crate::codec::Codec;
6use crate::seq::SeqSlice;
7
8impl<A: Codec> Index<Range<usize>> for SeqSlice<A> {
9 type Output = SeqSlice<A>;
10
11 fn index(&self, range: Range<usize>) -> &Self::Output {
12 let s = range.start * A::BITS as usize;
13 let e = range.end * A::BITS as usize;
14 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[s..e]);
15 unsafe { &*(bs as *const SeqSlice<A>) }
16 }
17}
18
19impl<A: Codec> Index<RangeTo<usize>> for SeqSlice<A> {
20 type Output = SeqSlice<A>;
21
22 fn index(&self, range: RangeTo<usize>) -> &Self::Output {
23 let e = range.end * A::BITS as usize;
24 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[..e]);
25 unsafe { &*(bs as *const SeqSlice<A>) }
26 }
27}
28
29impl<A: Codec> Index<RangeToInclusive<usize>> for SeqSlice<A> {
30 type Output = SeqSlice<A>;
31
32 fn index(&self, range: RangeToInclusive<usize>) -> &Self::Output {
33 let e = (range.end + 1) * A::BITS as usize;
34 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[..e]);
35 unsafe { &*(bs as *const SeqSlice<A>) }
36 }
37}
38
39impl<A: Codec> Index<RangeInclusive<usize>> for SeqSlice<A> {
40 type Output = SeqSlice<A>;
41
42 fn index(&self, range: RangeInclusive<usize>) -> &Self::Output {
43 let s = range.start() * A::BITS as usize;
44 let e = (range.end() + 1) * A::BITS as usize;
45
46 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[s..e]);
47 unsafe { &*(bs as *const SeqSlice<A>) }
48 }
49}
50
51impl<A: Codec> Index<RangeFrom<usize>> for SeqSlice<A> {
52 type Output = SeqSlice<A>;
53
54 fn index(&self, range: RangeFrom<usize>) -> &Self::Output {
55 let s = range.start * A::BITS as usize;
56 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[s..]);
57 unsafe { &*(bs as *const SeqSlice<A>) }
58 }
59}
60
61impl<A: Codec> Index<RangeFull> for SeqSlice<A> {
62 type Output = SeqSlice<A>;
63
64 fn index(&self, _range: RangeFull) -> &Self::Output {
65 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[..]);
66 unsafe { &*(bs as *const SeqSlice<A>) }
67 }
68}
69
70impl<A: Codec> Index<usize> for SeqSlice<A> {
71 type Output = SeqSlice<A>;
72
73 fn index(&self, i: usize) -> &Self::Output {
74 let s = i * A::BITS as usize;
75 let e = s + A::BITS as usize;
76 let bs: *const Bs = ptr::from_ref::<Bs>(&self.bs[s..e]);
77 unsafe { &*(bs as *const SeqSlice<A>) }
78 }
79}