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 (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}