1b9056914e2627627ffdd615e078a9b6020ab1cf2philip.liard@gmail.com// Copyright (C) 2011 The Libphonenumber Authors
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Licensed under the Apache License, Version 2.0 (the "License");
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// you may not use this file except in compliance with the License.
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// You may obtain a copy of the License at
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.apache.org/licenses/LICENSE-2.0
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Unless required by applicable law or agreed to in writing, software
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// distributed under the License is distributed on an "AS IS" BASIS,
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See the License for the specific language governing permissions and
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// limitations under the License.
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Author: Philippe Liard
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef I18N_PHONENUMBERS_STRINGUTIL_H_
181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#define I18N_PHONENUMBERS_STRINGUTIL_H_
191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <cstddef>
211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <string>
226a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com#include <vector>
231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
24af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/basictypes.h"
251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace i18n {
271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace phonenumbers {
281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::string;
306a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.comusing std::vector;
311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Supports string("hello") + 10.
33c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.comstring operator+(const string& s, int n);  // NOLINT(runtime/string)
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Converts integer to string.
361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring SimpleItoa(uint64 n);
372dbe1d8526f8d057898bc02ed3185a84f82cbb9aphilip.liard@gmail.comstring SimpleItoa(int64 n);
381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring SimpleItoa(int n);
391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
406a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com// Returns whether the provided string starts with the supplied prefix.
416a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.combool HasPrefixString(const string& s, const string& prefix);
426a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
436a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com// Returns the index of the nth occurence of c in s or string::npos if less than
446a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com// n occurrences are present.
456a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.comsize_t FindNth(const string& s, char c, int n);
466a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
476a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com// Splits a string using a character delimiter. Appends the components to the
486a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com// provided vector. Note that empty tokens are ignored.
496a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.comvoid SplitStringUsing(const string& s, const string& delimiter,
506a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com                      vector<string>* result);
516a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Replaces any occurrence of the character 'remove' (or the characters
531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// in 'remove') with the character 'replacewith'.
541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid StripString(string* s, const char* remove, char replacewith);
551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Returns true if 'in' starts with 'prefix' and writes 'in' minus 'prefix' into
571ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// 'out'.
581ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.combool TryStripPrefixString(const string& in, const string& prefix, string* out);
591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Returns true if 's' ends with 'suffix'.
611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.combool HasSuffixString(const string& s, const string& suffix);
621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Converts string to int32.
641ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid safe_strto32(const string& s, int32 *n);
651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Converts string to uint64.
671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid safe_strtou64(const string& s, uint64 *n);
681ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
692dbe1d8526f8d057898bc02ed3185a84f82cbb9aphilip.liard@gmail.com// Converts string to int64.
702dbe1d8526f8d057898bc02ed3185a84f82cbb9aphilip.liard@gmail.comvoid safe_strto64(const string& s, int64* n);
712dbe1d8526f8d057898bc02ed3185a84f82cbb9aphilip.liard@gmail.com
721ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Remove all occurrences of a given set of characters from a string.
731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid strrmm(string* s, const string& chars);
741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Replaces all instances of 'substring' in 's' with 'replacement'. Returns the
761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// number of instances replaced. Replacements are not subject to re-matching.
771ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comint GlobalReplaceSubstring(const string& substring, const string& replacement,
781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com                           string* s);
791ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Holds a reference to a std::string or C string. It can also be constructed
811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// from an integer which is converted to a string.
821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass StringHolder {
83c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.com public:
841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Don't make the constructors explicit to make the StrCat usage convenient.
85c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.com  StringHolder(const string& s);  // NOLINT(runtime/explicit)
86c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.com  StringHolder(const char* s);    // NOLINT(runtime/explicit)
87c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.com  StringHolder(uint64 n);         // NOLINT(runtime/explicit)
881ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ~StringHolder();
891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const string* GetString() const {
911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return string_;
921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const char* GetCString() const {
951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return cstring_;
961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  size_t Length() const {
991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return len_;
1001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
1011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
102c1b63c89b2a1bd6d58893f860c2899b4d3dc375cphilip.liard@gmail.com private:
1031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const string converted_string_;  // Stores the string converted from integer.
1041ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const string* const string_;
1051ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const char* const cstring_;
1061ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  const size_t len_;
1071ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
1081ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1091ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring& operator+=(string& lhs, const StringHolder& rhs);
1101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Efficient string concatenation.
1121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2);
1141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3);
1171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4);
1201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s5);
1241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s5, const StringHolder& s6);
1281ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s5, const StringHolder& s6,
1321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s7);
1331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s5, const StringHolder& s6,
1376a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com              const StringHolder& s7, const StringHolder& s8);
1386a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com
1396a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1406a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1416a0a07f4f0066eba2dc9bb81465f4e67d670c7b6philip.liard@gmail.com              const StringHolder& s5, const StringHolder& s6,
1421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s7, const StringHolder& s8,
1434784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com              const StringHolder& s9);
1444784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com
1454784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
1464784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com              const StringHolder& s3, const StringHolder& s4,
1474784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com              const StringHolder& s5, const StringHolder& s6,
1484784d0d0f3a84cdac8d7a6b99b72fbb6b1a98ca5philip.liard@gmail.com              const StringHolder& s7, const StringHolder& s8,
1491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s9, const StringHolder& s10,
1501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com              const StringHolder& s11);
1511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
15235bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.comstring StrCat(const StringHolder& s1, const StringHolder& s2,
15335bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com              const StringHolder& s3, const StringHolder& s4,
15435bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com              const StringHolder& s5, const StringHolder& s6,
15535bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com              const StringHolder& s7, const StringHolder& s8,
15635bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com              const StringHolder& s9, const StringHolder& s10,
15735bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com              const StringHolder& s11, const StringHolder& s12);
15835bd393fb78215a9c6dbeb158913def01eb58985lararennie@google.com
1591ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid StrAppend(string* dest, const StringHolder& s1);
1601ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comvoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2);
1621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
163cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.comvoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
164cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com               const StringHolder& s3);
165cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com
166cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.comvoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
167cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com               const StringHolder& s3, const StringHolder& s4);
168cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com
169cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.comvoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
170cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com               const StringHolder& s3, const StringHolder& s4,
171cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com               const StringHolder& s5);
172cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com
1731ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace phonenumbers
1741ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace i18n
1751ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1761ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // I18N_PHONENUMBERS_STRINGUTIL_H_
177