index_from_end/
into_index.rs1use crate::*;
2
3pub trait IntoIndex<I> {
4 fn into_index(self, len: I) -> I;
5}
6
7impl IntoIndex<usize> for usize {
8 fn into_index(self, _: Self) -> Self {
9 self
10 }
11}
12
13impl<I> IntoIndex<I> for Len {
14
15 fn into_index(self, len: I) -> I {
16 len
17 }
18}
19
20impl IntoIndex<usize> for FromEnd {
21
22 fn into_index(self, len: usize) -> usize {
23 len - self.dist
24 }
25}
26
27impl IntoIndex<usize> for LenFrac {
28
29 fn into_index(self, len: usize) -> usize {
30 len * self.numer / self.denom
31 }
32}
33
34impl IntoIndex<usize> for FromFrac {
35
36 fn into_index(self, len: usize) -> usize {
37 let frac = len * self.numer / self.denom;
38 if self.offset > 0 {
39 frac + self.offset as usize
40 } else {
41 frac - (-self.offset) as usize
42 }
43 }
44}