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 }