71372a62ca56eafc14942d0d321fd533de2e164f
[platform/upstream/libphonenumber.git] / cpp / src / phonenumbers / regex_based_matcher.cc
1 #include "phonenumbers/regex_based_matcher.h"
2
3 #include <memory>
4 #include <string>
5
6 #include "phonenumbers/base/memory/scoped_ptr.h"
7 #include "phonenumbers/phonemetadata.pb.h"
8 #include "phonenumbers/regexp_adapter.h"
9 #include "phonenumbers/regexp_cache.h"
10 #include "phonenumbers/regexp_factory.h"
11
12 namespace i18n {
13 namespace phonenumbers {
14
15 using std::string;
16
17 // Same implementations of AbstractRegExpFactory and RegExpCache in
18 // PhoneNumberUtil (copy from phonenumberutil.cc).
19 RegexBasedMatcher::RegexBasedMatcher()
20     : regexp_factory_(new RegExpFactory()),
21       regexp_cache_(new RegExpCache(*regexp_factory_, 128)) {}
22
23 RegexBasedMatcher::~RegexBasedMatcher() {}
24
25 bool RegexBasedMatcher::MatchesNationalNumber(
26     const string& national_number, const PhoneNumberDesc& number_desc,
27     bool allow_prefix_match) const {
28   return Match(national_number, number_desc.national_number_pattern(),
29                allow_prefix_match);
30 }
31
32 bool RegexBasedMatcher::MatchesPossibleNumber(
33     const string& national_number, const PhoneNumberDesc& number_desc) const {
34   return Match(national_number, number_desc.possible_number_pattern(), false);
35 }
36
37 bool RegexBasedMatcher::Match(const string& national_number,
38                               const string& number_pattern,
39                               bool allow_prefix_match) const {
40   const RegExp& regexp(regexp_cache_->GetRegExp(number_pattern));
41
42   if (allow_prefix_match) {
43     const scoped_ptr<RegExpInput> normalized_number_input(
44         regexp_factory_->CreateInput(national_number));
45     return regexp.Consume(normalized_number_input.get());
46   } else {
47     return regexp.FullMatch(national_number);
48   }
49 }
50
51 }  // namespace phonenumbers
52 }  // namespace i18n