11767c5feSopenharmony_ci// Copyright (C) 2011 The Libphonenumber Authors
21767c5feSopenharmony_ci//
31767c5feSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
41767c5feSopenharmony_ci// you may not use this file except in compliance with the License.
51767c5feSopenharmony_ci// You may obtain a copy of the License at
61767c5feSopenharmony_ci//
71767c5feSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0
81767c5feSopenharmony_ci//
91767c5feSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
101767c5feSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
111767c5feSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121767c5feSopenharmony_ci// See the License for the specific language governing permissions and
131767c5feSopenharmony_ci// limitations under the License.
141767c5feSopenharmony_ci
151767c5feSopenharmony_ci// Author: Philippe Liard
161767c5feSopenharmony_ci
171767c5feSopenharmony_ci#ifndef I18N_PHONENUMBERS_STRINGUTIL_H_
181767c5feSopenharmony_ci#define I18N_PHONENUMBERS_STRINGUTIL_H_
191767c5feSopenharmony_ci
201767c5feSopenharmony_ci#include <cstddef>
211767c5feSopenharmony_ci#include <string>
221767c5feSopenharmony_ci#include <vector>
231767c5feSopenharmony_ci
241767c5feSopenharmony_ci#include "phonenumbers/base/basictypes.h"
251767c5feSopenharmony_ci#include "absl/strings/string_view.h"
261767c5feSopenharmony_ci#include "absl/strings/str_cat.h"
271767c5feSopenharmony_ci
281767c5feSopenharmony_cinamespace i18n {
291767c5feSopenharmony_cinamespace phonenumbers {
301767c5feSopenharmony_ci
311767c5feSopenharmony_ciusing std::string;
321767c5feSopenharmony_ciusing std::vector;
331767c5feSopenharmony_ci
341767c5feSopenharmony_ci// Supports string("hello") + 10.
351767c5feSopenharmony_cistring operator+(const string& s, int n);  // NOLINT(runtime/string)
361767c5feSopenharmony_ci
371767c5feSopenharmony_ci// Converts integer to string.
381767c5feSopenharmony_cistring SimpleItoa(uint64_t n);
391767c5feSopenharmony_cistring SimpleItoa(int64_t n);
401767c5feSopenharmony_cistring SimpleItoa(int n);
411767c5feSopenharmony_ci
421767c5feSopenharmony_ci// Returns whether the provided string starts with the supplied prefix.
431767c5feSopenharmony_cibool HasPrefixString(const string& s, const string& prefix);
441767c5feSopenharmony_ci
451767c5feSopenharmony_ci// Returns the index of the nth occurence of c in s or string::npos if less than
461767c5feSopenharmony_ci// n occurrences are present.
471767c5feSopenharmony_cisize_t FindNth(const string& s, char c, int n);
481767c5feSopenharmony_ci
491767c5feSopenharmony_ci// Splits a string using a character delimiter. Appends the components to the
501767c5feSopenharmony_ci// provided vector. Note that empty tokens are ignored.
511767c5feSopenharmony_civoid SplitStringUsing(const string& s, char delimiter,
521767c5feSopenharmony_ci                      vector<string>* result);
531767c5feSopenharmony_ci
541767c5feSopenharmony_ci// Returns true if 'in' starts with 'prefix' and writes 'in' minus 'prefix' into
551767c5feSopenharmony_ci// 'out'.
561767c5feSopenharmony_cibool TryStripPrefixString(const string& in, const string& prefix, string* out);
571767c5feSopenharmony_ci
581767c5feSopenharmony_ci// Returns true if 's' ends with 'suffix'.
591767c5feSopenharmony_cibool HasSuffixString(const string& s, const string& suffix);
601767c5feSopenharmony_ci
611767c5feSopenharmony_ci// Converts string to int32_t.
621767c5feSopenharmony_civoid safe_strto32(const string& s, int32_t *n);
631767c5feSopenharmony_ci
641767c5feSopenharmony_ci// Converts string to uint64_t.
651767c5feSopenharmony_civoid safe_strtou64(const string& s, uint64_t *n);
661767c5feSopenharmony_ci
671767c5feSopenharmony_ci// Converts string to int64_t.
681767c5feSopenharmony_civoid safe_strto64(const string& s, int64_t* n);
691767c5feSopenharmony_ci
701767c5feSopenharmony_ci// Remove all occurrences of a given set of characters from a string.
711767c5feSopenharmony_civoid strrmm(string* s, const string& chars);
721767c5feSopenharmony_ci
731767c5feSopenharmony_ci// Replaces all instances of 'substring' in 's' with 'replacement'. Returns the
741767c5feSopenharmony_ci// number of instances replaced. Replacements are not subject to re-matching.
751767c5feSopenharmony_ciint GlobalReplaceSubstring(const string& substring, const string& replacement,
761767c5feSopenharmony_ci                           string* s);
771767c5feSopenharmony_ci
781767c5feSopenharmony_ci// An abstract to absl::AlphaNum type; AlphaNum has more accomidating
791767c5feSopenharmony_ci// constructors for more types.
801767c5feSopenharmony_ciclass StringHolder: public absl::AlphaNum {
811767c5feSopenharmony_ci public:
821767c5feSopenharmony_ci  // Don't make the constructors explicit to make the StrCat usage convenient.
831767c5feSopenharmony_ci  StringHolder(const string& s);  // NOLINT(runtime/explicit)
841767c5feSopenharmony_ci  StringHolder(const char* s);    // NOLINT(runtime/explicit)
851767c5feSopenharmony_ci  StringHolder(uint64_t n);         // NOLINT(runtime/explicit)
861767c5feSopenharmony_ci  ~StringHolder();
871767c5feSopenharmony_ci
881767c5feSopenharmony_ci  const absl::string_view GetString() const {
891767c5feSopenharmony_ci    return Piece();
901767c5feSopenharmony_ci  }
911767c5feSopenharmony_ci
921767c5feSopenharmony_ci  const char* GetCString() const {
931767c5feSopenharmony_ci    return data();
941767c5feSopenharmony_ci  }
951767c5feSopenharmony_ci
961767c5feSopenharmony_ci  size_t Length() const {
971767c5feSopenharmony_ci    return size();
981767c5feSopenharmony_ci  }
991767c5feSopenharmony_ci};
1001767c5feSopenharmony_ci
1011767c5feSopenharmony_cistring& operator+=(string& lhs, const StringHolder& rhs);
1021767c5feSopenharmony_ci
1031767c5feSopenharmony_ci// Efficient string concatenation.
1041767c5feSopenharmony_ci
1051767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2);
1061767c5feSopenharmony_ci
1071767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1081767c5feSopenharmony_ci              const StringHolder& s3);
1091767c5feSopenharmony_ci
1101767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1111767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4);
1121767c5feSopenharmony_ci
1131767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1141767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1151767c5feSopenharmony_ci              const StringHolder& s5);
1161767c5feSopenharmony_ci
1171767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1181767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1191767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6);
1201767c5feSopenharmony_ci
1211767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1221767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1231767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1241767c5feSopenharmony_ci              const StringHolder& s7);
1251767c5feSopenharmony_ci
1261767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1271767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1281767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1291767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8);
1301767c5feSopenharmony_ci
1311767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1321767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1331767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1341767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1351767c5feSopenharmony_ci              const StringHolder& s9);
1361767c5feSopenharmony_ci
1371767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1381767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1391767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1401767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1411767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1421767c5feSopenharmony_ci              const StringHolder& s11);
1431767c5feSopenharmony_ci
1441767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1451767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1461767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1471767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1481767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1491767c5feSopenharmony_ci              const StringHolder& s11, const StringHolder& s12);
1501767c5feSopenharmony_ci
1511767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1521767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1531767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1541767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1551767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1561767c5feSopenharmony_ci              const StringHolder& s11, const StringHolder& s12,
1571767c5feSopenharmony_ci              const StringHolder& s13);
1581767c5feSopenharmony_ci
1591767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1601767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1611767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1621767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1631767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1641767c5feSopenharmony_ci              const StringHolder& s11, const StringHolder& s12,
1651767c5feSopenharmony_ci              const StringHolder& s13, const StringHolder& s14);
1661767c5feSopenharmony_ci
1671767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1681767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1691767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1701767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1711767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1721767c5feSopenharmony_ci              const StringHolder& s11, const StringHolder& s12,
1731767c5feSopenharmony_ci              const StringHolder& s13, const StringHolder& s14,
1741767c5feSopenharmony_ci              const StringHolder& s15);
1751767c5feSopenharmony_ci
1761767c5feSopenharmony_cistring StrCat(const StringHolder& s1, const StringHolder& s2,
1771767c5feSopenharmony_ci              const StringHolder& s3, const StringHolder& s4,
1781767c5feSopenharmony_ci              const StringHolder& s5, const StringHolder& s6,
1791767c5feSopenharmony_ci              const StringHolder& s7, const StringHolder& s8,
1801767c5feSopenharmony_ci              const StringHolder& s9, const StringHolder& s10,
1811767c5feSopenharmony_ci              const StringHolder& s11, const StringHolder& s12,
1821767c5feSopenharmony_ci              const StringHolder& s13, const StringHolder& s14,
1831767c5feSopenharmony_ci              const StringHolder& s15, const StringHolder& s16);
1841767c5feSopenharmony_ci
1851767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1);
1861767c5feSopenharmony_ci
1871767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2);
1881767c5feSopenharmony_ci
1891767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
1901767c5feSopenharmony_ci               const StringHolder& s3);
1911767c5feSopenharmony_ci
1921767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
1931767c5feSopenharmony_ci               const StringHolder& s3, const StringHolder& s4);
1941767c5feSopenharmony_ci
1951767c5feSopenharmony_civoid StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
1961767c5feSopenharmony_ci               const StringHolder& s3, const StringHolder& s4,
1971767c5feSopenharmony_ci               const StringHolder& s5);
1981767c5feSopenharmony_ci
1991767c5feSopenharmony_ci}  // namespace phonenumbers
2001767c5feSopenharmony_ci}  // namespace i18n
2011767c5feSopenharmony_ci
2021767c5feSopenharmony_ci#endif  // I18N_PHONENUMBERS_STRINGUTIL_H_
203