1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
use hyphenation_commons::dictionary::extended::*;
use hyphenation_commons::dictionary::*;
pub trait Score<'d> {
type Value;
fn score(&'d self, word : &str) -> Vec<Self::Value>;
fn denotes_opportunity(value : Self::Value) -> bool;
}
impl<'d> Score<'d> for Standard {
type Value = u8;
#[inline]
fn denotes_opportunity(v : Self::Value) -> bool { v % 2 != 0 }
fn score(&'d self, word : &str) -> Vec<u8> {
let match_str = [".", word, "."].concat();
let hyphenable_length = word.len();
let mut values : Vec<u8> = vec![0; hyphenable_length.saturating_sub(1)];
for i in 0 .. match_str.len() - 1 {
let substring = &match_str.as_bytes()[i ..];
for tally in self.prefix_tallies(substring) {
for &Locus { index, value } in tally {
let k = i + index as usize;
if k > 1 && k <= hyphenable_length && value > values[k - 2] {
values[k - 2] = value;
}
}
}
}
values
}
}
impl<'d> Score<'d> for Extended {
type Value = (u8, Option<&'d Subregion>);
#[inline]
fn denotes_opportunity((v, _) : Self::Value) -> bool { v % 2 != 0 }
fn score(&'d self, word : &str) -> Vec<Self::Value> {
let match_str = [".", word, "."].concat();
let hyphenable_length = word.len();
let mut values : Vec<u8> = vec![0; hyphenable_length.saturating_sub(1)];
let mut regions : Vec<Option<&Subregion>> = vec![None; values.len()];
for i in 0 .. match_str.len() - 1 {
let substring = &match_str.as_bytes()[i ..];
for tally in self.prefix_tallies(substring) {
for &(Locus { index, value }, ref r) in tally.subregion.iter() {
let k = i + index as usize;
if k > 1 && k <= hyphenable_length && value > values[k - 2] {
values[k - 2] = value;
regions[k - 2] = Some(r);
}
}
for &Locus { index, value } in tally.standard.iter() {
let k = i + index as usize;
if k > 1 && k <= hyphenable_length && value > values[k - 2] {
values[k - 2] = value;
regions[k - 2] = None;
}
}
}
}
values.into_iter().zip(regions).collect()
}
}