diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index d84633130..588b97177 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -570,7 +570,7 @@ if (NOT WIN32) list (APPEND TEST_LIBS pthread) endif () -target_link_libraries (libphonenumber_test ${TEST_LIBS}) +target_link_libraries (libphonenumber_test ${TEST_LIBS} absl::node_hash_set) # Unfortunately add_custom_target() can't accept a single command provided as a # list of commands. @@ -677,7 +677,7 @@ if (${BUILD_GEOCODER} STREQUAL "ON") geocoding_test_program "test/phonenumbers/geocoding/geocoding_test_program.cc" ) - target_link_libraries (geocoding_test_program geocoding phonenumber) + target_link_libraries (geocoding_test_program geocoding phonenumber absl::node_hash_set) endif () # Build an RPM diff --git a/cpp/src/phonenumbers/asyoutypeformatter.cc b/cpp/src/phonenumbers/asyoutypeformatter.cc index fe8519559..3fd323fa0 100644 --- a/cpp/src/phonenumbers/asyoutypeformatter.cc +++ b/cpp/src/phonenumbers/asyoutypeformatter.cc @@ -29,8 +29,6 @@ #include "phonenumbers/stringutil.h" #include "phonenumbers/unicodestring.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/str_replace.h" namespace i18n { namespace phonenumbers { @@ -276,7 +274,7 @@ void AsYouTypeFormatter::GetFormattingTemplate( regexp_cache_.GetRegExp(number_pattern).GlobalReplace( &a_phone_number, number_format); // Replaces each digit with character kDigitPlaceholder. - absl::StrReplaceAll({{"9", kDigitPlaceholder}}, &a_phone_number); + GlobalReplaceSubstring("9", kDigitPlaceholder, &a_phone_number); formatting_template->setTo(a_phone_number.c_str(), a_phone_number.size()); } diff --git a/cpp/src/phonenumbers/phonenumbermatcher.cc b/cpp/src/phonenumbers/phonenumbermatcher.cc index 5621c65d3..2d60ceb4d 100644 --- a/cpp/src/phonenumbers/phonenumbermatcher.cc +++ b/cpp/src/phonenumbers/phonenumbermatcher.cc @@ -756,7 +756,7 @@ void PhoneNumberMatcher::GetNationalNumberGroups( size_t start_index = rfc3966_format.find('-') + 1; SplitStringUsing(rfc3966_format.substr(start_index, end_index - start_index), - "-", digit_blocks); + '-', digit_blocks); } void PhoneNumberMatcher::GetNationalNumberGroupsForPattern( @@ -772,7 +772,7 @@ void PhoneNumberMatcher::GetNationalNumberGroupsForPattern( *formatting_pattern, PhoneNumberUtil::RFC3966, &rfc3966_format); - SplitStringUsing(rfc3966_format, "-", digit_blocks); + SplitStringUsing(rfc3966_format, '-', digit_blocks); } bool PhoneNumberMatcher::IsNationalPrefixPresentIfRequired( diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index a4a5173c2..6ec007ccc 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -47,8 +47,6 @@ #include "phonenumbers/utf/unicodetext.h" #include "phonenumbers/utf/utf.h" -#include "absl/strings/str_replace.h" - namespace i18n { namespace phonenumbers { @@ -830,10 +828,10 @@ PhoneNumberUtil::PhoneNumberUtil() reg_exps_(new PhoneNumberRegExpsAndMappings), country_calling_code_to_region_code_map_( new std::vector()), - nanpa_regions_(new std::set()), - region_to_metadata_map_(new std::map()), + nanpa_regions_(new absl::node_hash_set()), + region_to_metadata_map_(new absl::node_hash_map()), country_code_to_non_geographical_metadata_map_( - new std::map) { + new absl::node_hash_map) { Logger::set_logger_impl(logger_.get()); // TODO: Update the java version to put the contents of the init // method inside the constructor as well to keep both in sync. @@ -896,9 +894,10 @@ PhoneNumberUtil::~PhoneNumberUtil() { country_calling_code_to_region_code_map_->end()); } -void PhoneNumberUtil::GetSupportedRegions(std::set* regions) const { +void PhoneNumberUtil::GetSupportedRegions(std::set* regions) + const { DCHECK(regions); - for (std::map::const_iterator it = + for (absl::node_hash_map::const_iterator it = region_to_metadata_map_->begin(); it != region_to_metadata_map_->end(); ++it) { regions->insert(it->first); @@ -908,7 +907,7 @@ void PhoneNumberUtil::GetSupportedRegions(std::set* regions) const { void PhoneNumberUtil::GetSupportedGlobalNetworkCallingCodes( std::set* calling_codes) const { DCHECK(calling_codes); - for (std::map::const_iterator it = + for (absl::node_hash_map::const_iterator it = country_code_to_non_geographical_metadata_map_->begin(); it != country_code_to_non_geographical_metadata_map_->end(); ++it) { calling_codes->insert(it->first); @@ -1065,7 +1064,7 @@ bool PhoneNumberUtil::HasValidCountryCallingCode( // if the region code is invalid or unknown. const PhoneMetadata* PhoneNumberUtil::GetMetadataForRegion( const string& region_code) const { - std::map::const_iterator it = + absl::node_hash_map::const_iterator it = region_to_metadata_map_->find(region_code); if (it != region_to_metadata_map_->end()) { return &it->second; @@ -1075,7 +1074,7 @@ const PhoneMetadata* PhoneNumberUtil::GetMetadataForRegion( const PhoneMetadata* PhoneNumberUtil::GetMetadataForNonGeographicalRegion( int country_calling_code) const { - std::map::const_iterator it = + absl::node_hash_map::const_iterator it = country_code_to_non_geographical_metadata_map_->find( country_calling_code); if (it != country_code_to_non_geographical_metadata_map_->end()) { @@ -1175,9 +1174,9 @@ void PhoneNumberUtil::FormatByPattern( const string& national_prefix = metadata->national_prefix(); if (!national_prefix.empty()) { // Replace $NP with national prefix and $FG with the first group ($1). - absl::StrReplaceAll({{"$NP", national_prefix}}, + GlobalReplaceSubstring("$NP", national_prefix, &national_prefix_formatting_rule); - absl::StrReplaceAll({{"$FG", "$1"}}, &national_prefix_formatting_rule); + GlobalReplaceSubstring("$FG", "$1", &national_prefix_formatting_rule); num_format_copy.set_national_prefix_formatting_rule( national_prefix_formatting_rule); } else { @@ -2026,9 +2025,8 @@ bool PhoneNumberUtil::GetExampleNumberForType( DCHECK(number); std::set regions; GetSupportedRegions(®ions); - for (std::set::const_iterator it = regions.begin(); - it != regions.end(); ++it) { - if (GetExampleNumberForType(*it, type, number)) { + for (const string& region_code : regions) { + if (GetExampleNumberForType(region_code, type, number)) { return true; } } diff --git a/cpp/src/phonenumbers/phonenumberutil.h b/cpp/src/phonenumbers/phonenumberutil.h index 806fe08c6..a7444607b 100644 --- a/cpp/src/phonenumbers/phonenumberutil.h +++ b/cpp/src/phonenumbers/phonenumberutil.h @@ -30,6 +30,9 @@ #include "phonenumbers/base/memory/singleton.h" #include "phonenumbers/phonenumber.pb.h" +#include "absl/container/node_hash_set.h" +#include "absl/container/node_hash_map.h" + class TelephoneNumber; namespace i18n { @@ -805,17 +808,17 @@ class PhoneNumberUtil : public Singleton { country_calling_code_to_region_code_map_; // The set of regions that share country calling code 1. - scoped_ptr > nanpa_regions_; + scoped_ptr > nanpa_regions_; static const int kNanpaCountryCode = 1; // A mapping from a region code to a PhoneMetadata for that region. - scoped_ptr > region_to_metadata_map_; + scoped_ptr > region_to_metadata_map_; // A mapping from a country calling code for a non-geographical entity to the // PhoneMetadata for that country calling code. Examples of the country // calling codes include 800 (International Toll Free Service) and 808 // (International Shared Cost Service). - scoped_ptr > + scoped_ptr > country_code_to_non_geographical_metadata_map_; PhoneNumberUtil(); diff --git a/cpp/src/phonenumbers/regexp_adapter_re2.cc b/cpp/src/phonenumbers/regexp_adapter_re2.cc index ccfd28fd6..e766730ba 100644 --- a/cpp/src/phonenumbers/regexp_adapter_re2.cc +++ b/cpp/src/phonenumbers/regexp_adapter_re2.cc @@ -27,7 +27,6 @@ #include "phonenumbers/base/logging.h" #include "phonenumbers/stringutil.h" -#include "absl/strings/str_replace.h" #include "absl/strings/string_view.h" namespace i18n { namespace phonenumbers { @@ -78,14 +77,14 @@ bool DispatchRE2Call(Function regex_function, // when they escape dollar-signs. string TransformRegularExpressionToRE2Syntax(const string& regex) { string re2_regex(regex); - if (absl::StrReplaceAll({{"$", "\\"}}, &re2_regex) == 0) { + if (GlobalReplaceSubstring("$", "\\", &re2_regex) == 0) { return regex; } // If we replaced a dollar sign with a backslash and there are now two // backslashes in the string, we assume that the dollar-sign was previously // escaped and that we need to retain it. To do this, we replace pairs of // backslashes with a dollar sign. - absl::StrReplaceAll({{"\\\\", "$"}}, &re2_regex); + GlobalReplaceSubstring("\\\\", "$", &re2_regex); return re2_regex; } diff --git a/cpp/src/phonenumbers/stringutil.cc b/cpp/src/phonenumbers/stringutil.cc index 403cd401a..c2f1eaf5b 100644 --- a/cpp/src/phonenumbers/stringutil.cc +++ b/cpp/src/phonenumbers/stringutil.cc @@ -21,8 +21,9 @@ #include "phonenumbers/stringutil.h" -#include "absl/strings/str_cat.h" - +#include "absl/strings/str_replace.h" +#include "absl/strings/substitute.h" +#include "absl/strings/match.h" namespace i18n { namespace phonenumbers { @@ -49,8 +50,7 @@ string SimpleItoa(int64 n) { } bool HasPrefixString(const string& s, const string& prefix) { - return s.size() >= prefix.size() && - equal(s.begin(), s.begin() + prefix.size(), prefix.begin()); + return absl::StartsWith(s, prefix); } size_t FindNth(const string& s, char c, int n) { @@ -65,33 +65,12 @@ size_t FindNth(const string& s, char c, int n) { return pos; } -void SplitStringUsing(const string& s, const string& delimiter, +void SplitStringUsing(const string& s, char delimiter, vector* result) { assert(result); - size_t start_pos = 0; - size_t find_pos = string::npos; - if (delimiter.empty()) { - return; - } - while ((find_pos = s.find(delimiter, start_pos)) != string::npos) { - const string substring = s.substr(start_pos, find_pos - start_pos); - if (!substring.empty()) { - result->push_back(substring); - } - start_pos = find_pos + delimiter.length(); - } - if (start_pos != s.length()) { - result->push_back(s.substr(start_pos)); - } -} - -void StripString(string* s, const char* remove, char replacewith) { - const char* str_start = s->c_str(); - const char* str = str_start; - for (str = strpbrk(str, remove); - str != NULL; - str = strpbrk(str + 1, remove)) { - (*s)[str - str_start] = replacewith; + for (absl::string_view split_piece : absl::StrSplit( + s, absl::ByChar(delimiter), absl::SkipEmpty())) { + result->push_back(std::string(split_piece)); } } @@ -104,17 +83,12 @@ bool TryStripPrefixString(const string& in, const string& prefix, string* out) { } bool HasSuffixString(const string& s, const string& suffix) { - if (s.length() < suffix.length()) { - return false; - } - return s.compare(s.length() - suffix.length(), suffix.length(), suffix) == 0; + return absl::EndsWith(s, suffix); } template void GenericAtoi(const string& s, T* out) { - stringstream stream; - stream << s; - stream >> *out; + absl::SimpleAtoi(s, out); } void safe_strto32(const string& s, int32 *n) { @@ -143,47 +117,20 @@ void strrmm(string* s, const string& chars) { int GlobalReplaceSubstring(const string& substring, const string& replacement, string* s) { - assert(s != NULL); - if (s->empty() || substring.empty()) - return 0; - string tmp; - int num_replacements = 0; - int pos = 0; - for (size_t match_pos = s->find(substring.data(), pos, substring.length()); - match_pos != string::npos; - pos = static_cast(match_pos + substring.length()), - match_pos = s->find(substring.data(), pos, substring.length())) { - ++num_replacements; - // Append the original content before the match. - tmp.append(*s, pos, match_pos - pos); - // Append the replacement for the match. - tmp.append(replacement.begin(), replacement.end()); - } - // Append the content after the last match. - tmp.append(*s, pos, s->length() - pos); - s->swap(tmp); - return num_replacements; + return absl::StrReplaceAll({{substring, replacement}}, s);; } // StringHolder class - StringHolder::StringHolder(const string& s) - : string_(&s), - cstring_(NULL), - len_(s.size()) + : absl::AlphaNum(s) {} -StringHolder::StringHolder(const char* s) - : string_(NULL), - cstring_(s), - len_(std::strlen(s)) +StringHolder::StringHolder(const char* cp) + : absl::AlphaNum(cp) {} StringHolder::StringHolder(uint64 n) - : converted_string_(SimpleItoa(n)), - string_(&converted_string_), - cstring_(NULL), - len_(converted_string_.length()) + : absl::AlphaNum(n) {} StringHolder::~StringHolder() {} @@ -192,9 +139,9 @@ StringHolder::~StringHolder() {} // Implements s += sh; (s: string, sh: StringHolder) string& operator+=(string& lhs, const StringHolder& rhs) { - const string* const s = rhs.GetString(); - if (s) { - lhs += *s; + absl::string_view s = rhs.GetString();; + if (s.size() != 0) { + lhs += s.data(); } else { const char* const cs = rhs.GetCString(); if (cs) @@ -204,87 +151,36 @@ string& operator+=(string& lhs, const StringHolder& rhs) { } string StrCat(const StringHolder& s1, const StringHolder& s2) { - string result; - result.reserve(s1.Length() + s2.Length() + 1); - - result += s1; - result += s2; - - return result; + return absl::StrCat(s1, s2); } string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s3) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + 1); - - result += s1; - result += s2; - result += s3; - - return result; + return absl::StrCat(s1, s2, s3); } string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + 1); - - result += s1; - result += s2; - result += s3; - result += s4; - - return result; + return absl::StrCat(s1, s2, s3, s4); } string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4, const StringHolder& s5) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + 1); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5); } string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4, const StringHolder& s5, const StringHolder& s6) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + 1); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6); } string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4, const StringHolder& s5, const StringHolder& s6, const StringHolder& s7) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + 1); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -294,16 +190,7 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, string result; result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + s5.Length() + s6.Length() + s7.Length() + s8.Length() + 1); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -311,21 +198,7 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s5, const StringHolder& s6, const StringHolder& s7, const StringHolder& s8, const StringHolder& s9) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + 1); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -334,23 +207,7 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s7, const StringHolder& s8, const StringHolder& s9, const StringHolder& s10, const StringHolder& s11) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -359,24 +216,7 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s7, const StringHolder& s8, const StringHolder& s9, const StringHolder& s10, const StringHolder& s11, const StringHolder& s12) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length() + s12.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - result += s12; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -386,26 +226,8 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s9, const StringHolder& s10, const StringHolder& s11, const StringHolder& s12, const StringHolder& s13) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length() + s12.Length() + - s13.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - result += s12; - result += s13; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, + s13); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -415,27 +237,8 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s9, const StringHolder& s10, const StringHolder& s11, const StringHolder& s12, const StringHolder& s13, const StringHolder& s14) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length() + s12.Length() + - s13.Length() + s14.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - result += s12; - result += s13; - result += s14; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, + s13, s14); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -446,28 +249,8 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s11, const StringHolder& s12, const StringHolder& s13, const StringHolder& s14, const StringHolder& s15) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length() + s12.Length() + - s13.Length() + s14.Length() + s15.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - result += s12; - result += s13; - result += s14; - result += s15; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, + s13, s14, s15); } string StrCat(const StringHolder& s1, const StringHolder& s2, @@ -478,83 +261,35 @@ string StrCat(const StringHolder& s1, const StringHolder& s2, const StringHolder& s11, const StringHolder& s12, const StringHolder& s13, const StringHolder& s14, const StringHolder& s15, const StringHolder& s16) { - string result; - result.reserve(s1.Length() + s2.Length() + s3.Length() + s4.Length() + - s5.Length() + s6.Length() + s7.Length() + s8.Length() + - s9.Length() + s10.Length() + s11.Length() + s12.Length() + - s13.Length() + s14.Length() + s15.Length() + s16.Length()); - result += s1; - result += s2; - result += s3; - result += s4; - result += s5; - result += s6; - result += s7; - result += s8; - result += s9; - result += s10; - result += s11; - result += s12; - result += s13; - result += s14; - result += s15; - result += s16; - - return result; + return absl::StrCat(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, + s13, s14, s15, s16); } // StrAppend void StrAppend(string* dest, const StringHolder& s1) { - assert(dest); - - dest->reserve(dest->length() + s1.Length() + 1); - *dest += s1; + absl::StrAppend(dest, s1); } void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2) { - assert(dest); - - dest->reserve(dest->length() + s1.Length() + s2.Length() + 1); - *dest += s1; - *dest += s2; + absl::StrAppend(dest, s1, s2); } void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, const StringHolder& s3) { - assert(dest); - - dest->reserve(dest->length() + s1.Length() + s2.Length() + s3.Length() + 1); - *dest += s1; - *dest += s2; - *dest += s3; + absl::StrAppend(dest, s1, s2, s3); } void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4) { - assert(dest); - - dest->reserve(dest->length() + s1.Length() + s2.Length() + s3.Length() + - s4.Length() + 1); - *dest += s1; - *dest += s2; - *dest += s3; - *dest += s4; + absl::StrAppend(dest, s1, s2, s3, s4); } void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2, const StringHolder& s3, const StringHolder& s4, const StringHolder& s5) { - assert(dest); - - dest->reserve(dest->length() + s1.Length() + s2.Length() + s3.Length() + - s4.Length() + s5.Length() + 1); - *dest += s1; - *dest += s2; - *dest += s3; - *dest += s4; - *dest += s5; + absl::StrAppend(dest, s1, s2, s3, s4, s5); } } // namespace phonenumbers -} // namespace i18n +} // namespace i18n \ No newline at end of file diff --git a/cpp/src/phonenumbers/stringutil.h b/cpp/src/phonenumbers/stringutil.h index 31430141d..b84057d79 100644 --- a/cpp/src/phonenumbers/stringutil.h +++ b/cpp/src/phonenumbers/stringutil.h @@ -22,6 +22,8 @@ #include #include "phonenumbers/base/basictypes.h" +#include "absl/strings/string_view.h" +#include "absl/strings/str_cat.h" namespace i18n { namespace phonenumbers { @@ -46,13 +48,9 @@ size_t FindNth(const string& s, char c, int n); // Splits a string using a character delimiter. Appends the components to the // provided vector. Note that empty tokens are ignored. -void SplitStringUsing(const string& s, const string& delimiter, +void SplitStringUsing(const string& s, char delimiter, vector* result); -// Replaces any occurrence of the character 'remove' (or the characters -// in 'remove') with the character 'replacewith'. -void StripString(string* s, const char* remove, char replacewith); - // Returns true if 'in' starts with 'prefix' and writes 'in' minus 'prefix' into // 'out'. bool TryStripPrefixString(const string& in, const string& prefix, string* out); @@ -77,9 +75,9 @@ void strrmm(string* s, const string& chars); int GlobalReplaceSubstring(const string& substring, const string& replacement, string* s); -// Holds a reference to a std::string or C string. It can also be constructed -// from an integer which is converted to a string. -class StringHolder { +// An abstract to absl::AlphaNum type; AlphaNum has more accomidating +// constructors for more types. +class StringHolder: public absl::AlphaNum { public: // Don't make the constructors explicit to make the StrCat usage convenient. StringHolder(const string& s); // NOLINT(runtime/explicit) @@ -87,23 +85,17 @@ class StringHolder { StringHolder(uint64 n); // NOLINT(runtime/explicit) ~StringHolder(); - const string* GetString() const { - return string_; + const absl::string_view GetString() const { + return Piece(); } const char* GetCString() const { - return cstring_; + return data(); } size_t Length() const { - return len_; + return size(); } - - private: - const string converted_string_; // Stores the string converted from integer. - const string* const string_; - const char* const cstring_; - const size_t len_; }; string& operator+=(string& lhs, const StringHolder& rhs); diff --git a/cpp/test/phonenumbers/stringutil_test.cc b/cpp/test/phonenumbers/stringutil_test.cc index 1b4402902..32747085c 100644 --- a/cpp/test/phonenumbers/stringutil_test.cc +++ b/cpp/test/phonenumbers/stringutil_test.cc @@ -60,19 +60,13 @@ TEST(StringUtilTest, FindNth) { TEST(StringUtilTest, SplitStringUsingWithEmptyString) { vector result; - SplitStringUsing("", ":", &result); - EXPECT_EQ(0U, result.size()); -} - -TEST(StringUtilTest, SplitStringUsingWithEmptyDelimiter) { - vector result; - SplitStringUsing("hello", "", &result); + SplitStringUsing("", ':', &result); EXPECT_EQ(0U, result.size()); } TEST(StringUtilTest, SplitStringUsing) { vector result; - SplitStringUsing(":hello:world:", ":", &result); + SplitStringUsing(":hello:world:", ':', &result); EXPECT_EQ(2U, result.size()); EXPECT_EQ("hello", result[0]); EXPECT_EQ("world", result[1]); @@ -80,7 +74,7 @@ TEST(StringUtilTest, SplitStringUsing) { TEST(StringUtilTest, SplitStringUsingIgnoresEmptyToken) { vector result; - SplitStringUsing("hello::world", ":", &result); + SplitStringUsing("hello::world", ':', &result); EXPECT_EQ(2U, result.size()); EXPECT_EQ("hello", result[0]); EXPECT_EQ("world", result[1]); @@ -195,13 +189,11 @@ TEST(StringUtilTest, StringHolder) { static const char cstring[] = "aaa"; StringHolder sh1(cstring); EXPECT_EQ(cstring, sh1.GetCString()); - EXPECT_EQ(NULL, sh1.GetString()); - // Test with std::string. - string s = "bbb"; + // Test with absl::string_view. + string s = "aaa"; StringHolder sh2(s); - EXPECT_EQ(NULL, sh2.GetCString()); - EXPECT_EQ(&s, sh2.GetString()); + EXPECT_EQ(cstring, sh2.GetString()); // Test GetLength(). string s2 = "hello"; @@ -210,9 +202,8 @@ TEST(StringUtilTest, StringHolder) { // Test with uint64. StringHolder sh4(42); - EXPECT_TRUE(sh4.GetCString() == NULL); - EXPECT_EQ(2U, sh4.Length()); - EXPECT_EQ("42", *sh4.GetString()); + static const char cstring2[] = "42";; + EXPECT_EQ(cstring2, sh4.GetString()); } // Test the operator+=(string& lhs, const StringHolder& rhs) implementation. diff --git a/tools/cpp/CMakeLists.txt b/tools/cpp/CMakeLists.txt index ab2d54b3f..b09416569 100644 --- a/tools/cpp/CMakeLists.txt +++ b/tools/cpp/CMakeLists.txt @@ -64,7 +64,7 @@ endif () include_directories ("src") add_executable (generate_geocoding_data ${SOURCES}) -target_link_libraries (generate_geocoding_data absl::strings absl::btree) +target_link_libraries (generate_geocoding_data absl::strings absl::btree absl::node_hash_set) set (TEST_SOURCES "src/cpp-build/generate_geocoding_data.cc" @@ -81,4 +81,4 @@ endif () # Build the testing binary. include_directories ("test") add_executable (generate_geocoding_data_test ${TEST_SOURCES}) -target_link_libraries (generate_geocoding_data_test absl::btree ${TEST_LIBS}) +target_link_libraries (generate_geocoding_data_test absl::btree ${TEST_LIBS} absl::node_hash_set)