diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 20:11:19 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-19 12:49:20 +0900 |
commit | a6a17a4a4ae66ecbdc66ee977131360741bdc5b2 (patch) | |
tree | 0467dcb09ee513faeafaa2b6ccad2e86417956df | |
parent | fdb56dc43bd5976e201585e69384ed66f8215270 (diff) | |
download | android_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.tar.gz android_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.tar.bz2 android_build_kati-a6a17a4a4ae66ecbdc66ee977131360741bdc5b2.zip |
[C++] Refactor pattern functions in strutil
-rw-r--r-- | func.cc | 25 | ||||
-rw-r--r-- | strutil.cc | 48 | ||||
-rw-r--r-- | strutil.h | 19 | ||||
-rw-r--r-- | strutil_test.cc | 2 | ||||
-rw-r--r-- | value.cc | 5 |
5 files changed, 60 insertions, 39 deletions
@@ -20,13 +20,14 @@ namespace { void PatsubstFunc(const vector<Value*>& args, Evaluator* ev, string* s) { - shared_ptr<string> pat = args[0]->Eval(ev); + shared_ptr<string> pat_str = args[0]->Eval(ev); shared_ptr<string> repl = args[1]->Eval(ev); shared_ptr<string> str = args[2]->Eval(ev); WordWriter ww(s); + Pattern pat(*pat_str); for (StringPiece tok : WordScanner(*str)) { ww.MaybeAddWhitespace(); - AppendSubstPattern(tok, *pat, *repl, s); + pat.AppendSubst(tok, *repl, s); } } @@ -64,12 +65,14 @@ void FindstringFunc(const vector<Value*>& args, Evaluator* ev, string* s) { void FilterFunc(const vector<Value*>& args, Evaluator* ev, string* s) { shared_ptr<string> pat_buf = args[0]->Eval(ev); shared_ptr<string> text = args[1]->Eval(ev); - vector<StringPiece> pats; - WordScanner(*pat_buf).Split(&pats); + vector<Pattern> pats; + for (StringPiece pat : WordScanner(*pat_buf)) { + pats.push_back(Pattern(pat)); + } WordWriter ww(s); for (StringPiece tok : WordScanner(*text)) { - for (StringPiece pat : pats) { - if (MatchPattern(tok, pat)) { + for (const Pattern& pat : pats) { + if (pat.Match(tok)) { ww.Write(tok); break; } @@ -80,13 +83,15 @@ void FilterFunc(const vector<Value*>& args, Evaluator* ev, string* s) { void FilterOutFunc(const vector<Value*>& args, Evaluator* ev, string* s) { shared_ptr<string> pat_buf = args[0]->Eval(ev); shared_ptr<string> text = args[1]->Eval(ev); - vector<StringPiece> pats; - WordScanner(*pat_buf).Split(&pats); + vector<Pattern> pats; + for (StringPiece pat : WordScanner(*pat_buf)) { + pats.push_back(Pattern(pat)); + } WordWriter ww(s); for (StringPiece tok : WordScanner(*text)) { bool matched = false; - for (StringPiece pat : pats) { - if (MatchPattern(tok, pat)) { + for (const Pattern& pat : pats) { + if (pat.Match(tok)) { matched = true; break; } @@ -133,11 +133,25 @@ StringPiece TrimSuffix(StringPiece str, StringPiece suffix) { return str.substr(0, size_diff); } -void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst, - string* out) { - size_t pat_percent_index = pat.find('%'); - if (pat_percent_index == string::npos) { - if (str == pat) { +Pattern::Pattern(StringPiece pat) + : pat_(pat), percent_index_(pat.find('%')) { +} + +bool Pattern::Match(StringPiece str) const { + if (percent_index_ == string::npos) + return str == pat_; + return MatchImpl(str); +} + +bool Pattern::MatchImpl(StringPiece str) const { + return (HasPrefix(str, pat_.substr(0, percent_index_)) && + HasSuffix(str, pat_.substr(percent_index_ + 1))); +} + +void Pattern::AppendSubst(StringPiece str, StringPiece subst, + string* out) const { + if (percent_index_ == string::npos) { + if (str == pat_) { AppendString(subst, out); return; } else { @@ -146,16 +160,15 @@ void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst, } } - if (HasPrefix(str, pat.substr(0, pat_percent_index)) && - HasSuffix(str, pat.substr(pat_percent_index + 1))) { + if (MatchImpl(str)) { size_t subst_percent_index = subst.find('%'); if (subst_percent_index == string::npos) { AppendString(subst, out); return; } else { AppendString(subst.substr(0, subst_percent_index), out); - AppendString(str.substr(pat_percent_index, - str.size() - pat.size() + 1), out); + AppendString(str.substr(percent_index_, + str.size() - pat_.size() + 1), out); AppendString(subst.substr(subst_percent_index + 1), out); return; } @@ -163,24 +176,17 @@ void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst, AppendString(str, out); } -void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst, - string* out) { - if (pat.find('%') != string::npos && subst.find('%') != string::npos) { - AppendSubstPattern(str, pat, subst, out); +void Pattern::AppendSubstRef(StringPiece str, StringPiece subst, + string* out) const { + if (percent_index_ != string::npos && subst.find('%') != string::npos) { + AppendSubst(str, subst, out); return; } - StringPiece s = TrimSuffix(str, pat); + StringPiece s = TrimSuffix(str, pat_); out->append(s.begin(), s.end()); out->append(subst.begin(), subst.end()); } -bool MatchPattern(StringPiece str, StringPiece pat) { - size_t i = pat.find('%'); - if (i == string::npos) - return str == pat; - return HasPrefix(str, pat.substr(0, i)) && HasSuffix(str, pat.substr(i+1)); -} - string NoLineBreak(const string& s) { size_t index = s.find('\n'); if (index == string::npos) @@ -79,13 +79,22 @@ bool HasSuffix(StringPiece str, StringPiece suffix); StringPiece TrimSuffix(StringPiece str, StringPiece suffix); -void AppendSubstPattern(StringPiece str, StringPiece pat, StringPiece subst, - string* out); +class Pattern { + public: + explicit Pattern(StringPiece pat); + + bool Match(StringPiece str) const; + + void AppendSubst(StringPiece str, StringPiece subst, string* out) const; -void AppendSubstRef(StringPiece str, StringPiece pat, StringPiece subst, - string* out); + void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const; -bool MatchPattern(StringPiece str, StringPiece pat); + private: + bool MatchImpl(StringPiece str) const; + + StringPiece pat_; + size_t percent_index_; +}; string NoLineBreak(const string& s); diff --git a/strutil_test.cc b/strutil_test.cc index f08c07d..d014c88 100644 --- a/strutil_test.cc +++ b/strutil_test.cc @@ -36,7 +36,7 @@ void TestHasSuffix() { string SubstPattern(StringPiece str, StringPiece pat, StringPiece subst) { string r; - AppendSubstPattern(str, pat, subst, &r); + Pattern(pat).AppendSubst(str, subst, &r); return r; } @@ -148,12 +148,13 @@ class VarSubst : public Value { shared_ptr<string> name = name_->Eval(ev); Var* v = ev->LookupVar(*name); shared_ptr<string> value = v->Eval(ev); - shared_ptr<string> pat = pat_->Eval(ev); + shared_ptr<string> pat_str = pat_->Eval(ev); shared_ptr<string> subst = subst_->Eval(ev); WordWriter ww(s); + Pattern pat(*pat_str); for (StringPiece tok : WordScanner(*value)) { ww.MaybeAddWhitespace(); - AppendSubstRef(tok, *pat, *subst, s); + pat.AppendSubstRef(tok, *subst, s); } } |