fm_index/
converter.rs

1use crate::character::Character;
2
3use serde::{Deserialize, Serialize};
4
5pub trait Converter<T> {
6    fn convert(&self, c: T) -> T;
7    fn convert_inv(&self, c: T) -> T;
8    fn len(&self) -> u64;
9}
10
11#[derive(Serialize, Deserialize)]
12pub struct RangeConverter<T> {
13    min: T,
14    max: T,
15}
16
17impl<T> RangeConverter<T>
18where
19    T: Character,
20{
21    pub fn new(min: T, max: T) -> Self {
22        debug_assert!(!T::is_zero(&min), "min should not be zero");
23        RangeConverter { min, max }
24    }
25}
26
27impl<T> Converter<T> for RangeConverter<T>
28where
29    T: Character,
30{
31    fn convert(&self, c: T) -> T {
32        if c == T::zero() {
33            c
34        } else {
35            c - self.min + T::one()
36        }
37    }
38
39    fn convert_inv(&self, c: T) -> T {
40        if c == T::zero() {
41            c
42        } else {
43            c + self.min - T::one()
44        }
45    }
46
47    fn len(&self) -> u64 {
48        // [min, max] + sentinel
49        (self.max - self.min).into() + 2
50    }
51}
52
53pub struct IdConverter {
54    size: u64,
55}
56
57impl IdConverter {
58    pub fn new(size: u64) -> Self {
59        IdConverter { size }
60    }
61}
62
63impl<T> Converter<T> for IdConverter {
64    fn convert(&self, c: T) -> T {
65        c
66    }
67    fn convert_inv(&self, c: T) -> T {
68        c
69    }
70    fn len(&self) -> u64 {
71        self.size
72    }
73}
74
75pub trait IndexWithConverter<T> {
76    type C: Converter<T>;
77    fn get_converter(&self) -> &Self::C;
78}