1 module miao..string.brute_force; 2 3 @trusted: 4 5 import miao.common.check; 6 import miao.common.util; 7 8 struct Brute_force_searcher(PatRange, CorpusRange = PatRange) 9 if (isValidParam!(PatRange, CorpusRange)) { 10 public: 11 this(in PatRange pattern) 12 { 13 pattern_ = pattern; 14 } 15 16 int search(in CorpusRange corpus) const 17 out(result) { 18 assert(result == -1 || (0 <= result && result < corpus.length)); 19 } 20 body { 21 if (corpus.length == 0 || pattern_.length == 0) return -1; 22 if (corpus.length < pattern_.length) return -1; 23 24 return search_(corpus); 25 } 26 27 private: 28 int search_(in CorpusRange corpus) const 29 { 30 immutable compare_length = corpus.length - pattern_.length; 31 32 auto window_pos = 0; 33 34 for (; window_pos <= compare_length; ++window_pos) { 35 const window = corpus[window_pos .. window_pos + pattern_.length]; 36 auto cursor = 0; 37 38 for (; cursor < pattern_.length && window[cursor] == pattern_[cursor]; ++cursor) { 39 /* empty */ 40 } 41 42 if (cursor == pattern_.length) return window_pos; 43 } 44 45 return -1; 46 } 47 48 private: 49 const PatRange pattern_; 50 } 51 52 alias brute_force_search = GenerateFunction!Brute_force_searcher; 53 54 unittest { 55 import miao.string.test; 56 57 testAll!(Brute_force_searcher, brute_force_search)(); 58 }