diff --git a/src/string_search.h b/src/string_search.h index b339c355fe168d..3d06f32058f673 100644 --- a/src/string_search.h +++ b/src/string_search.h @@ -100,17 +100,29 @@ class StringSearch : private StringSearchBase { CHECK_GT(pattern_length, 0); if (pattern_length < kBMMinPatternLength) { if (pattern_length == 1) { - strategy_ = &StringSearch::SingleCharSearch; + strategy_ = SearchStrategy::kSingleChar; return; } - strategy_ = &StringSearch::LinearSearch; + strategy_ = SearchStrategy::kLinear; return; } - strategy_ = &StringSearch::InitialSearch; + strategy_ = SearchStrategy::kInitial; } size_t Search(Vector subject, size_t index) { - return (this->*strategy_)(subject, index); + switch (strategy_) { + case kBoyerMooreHorspool: + return BoyerMooreHorspoolSearch(subject, index); + case kBoyerMoore: + return BoyerMooreSearch(subject, index); + case kInitial: + return InitialSearch(subject, index); + case kLinear: + return LinearSearch(subject, index); + case kSingleChar: + return SingleCharSearch(subject, index); + } + UNREACHABLE(); } static inline int AlphabetSize() { @@ -149,10 +161,17 @@ class StringSearch : private StringSearchBase { return bad_char_occurrence[equiv_class]; } + enum SearchStrategy { + kBoyerMooreHorspool, + kBoyerMoore, + kInitial, + kLinear, + kSingleChar, + }; + // The pattern to search for. Vector pattern_; - // Pointer to implementation of the search. - SearchFunction strategy_; + SearchStrategy strategy_; // Cache value of Max(0, pattern_length() - kBMMaxShift) size_t start_; }; @@ -476,7 +495,7 @@ size_t StringSearch::BoyerMooreHorspoolSearch( badness += (pattern_length - j) - last_char_shift; if (badness > 0) { PopulateBoyerMooreTable(); - strategy_ = &StringSearch::BoyerMooreSearch; + strategy_ = SearchStrategy::kBoyerMoore; return BoyerMooreSearch(subject, index); } } @@ -548,7 +567,7 @@ size_t StringSearch::InitialSearch( badness += j; } else { PopulateBoyerMooreHorspoolTable(); - strategy_ = &StringSearch::BoyerMooreHorspoolSearch; + strategy_ = SearchStrategy::kBoyerMooreHorspool; return BoyerMooreHorspoolSearch(subject, i); } }