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 }