1 module miao.common.skip_table;
2 
3 @trusted:
4 
5 struct Skip_table(KeyType) {
6 public pure nothrow:
7     this(in int default_val)
8     {
9         default_val_ = default_val;
10     }
11 
12     int opIndex(in KeyType idx) const
13     {
14         const ret = idx in skip_table_;
15         return ret? *ret: default_val_;
16     }
17 
18     int opIndexAssign(in int val, in KeyType idx)
19     {
20         return skip_table_[idx] = val;
21     }
22 
23 private:
24     int[KeyType] skip_table_;
25     immutable int default_val_;
26 }
27 
28 import miao.common.util;
29 
30 pure auto build_bm_table(PatRange)(in PatRange pattern) nothrow
31 in {
32     assert(pattern.length > 0);
33 }
34 body {
35     auto table = Skip_table!(ValueType!PatRange)(pattern.length);
36 
37     const last_pos = pattern.length - 1;
38 
39     foreach (const idx, letter; pattern[0 .. last_pos]) {
40         table[letter] = last_pos - idx;
41     }
42 
43     return table;
44 }
45 
46 pure auto build_qs_table(PatRange)(in PatRange pattern) nothrow
47 in {
48     assert(pattern.length > 0);
49 }
50 body {
51     auto table = Skip_table!(ValueType!PatRange)(pattern.length + 1);
52 
53     foreach (const idx, letter; pattern) {
54         table[letter] = pattern.length - idx;
55     }
56 
57     return table;
58 }
59 
60 unittest {
61     auto x = build_bm_table(" ");
62     const y = build_bm_table(" ");
63     immutable z = build_bm_table(" ");
64 
65     auto x1 = build_bm_table([1]);
66     const y1 = build_bm_table([1]);
67     immutable z1 = build_bm_table([1]);
68 }