bio_seq/seq/
index.rs

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}