1// Copyright (C) 2011 The Libphonenumber Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Author: Philippe Liard
16
17#ifndef I18N_PHONENUMBERS_STRINGUTIL_H_
18#define I18N_PHONENUMBERS_STRINGUTIL_H_
19
20#include <cstddef>
21#include <string>
22#include <vector>
23
24#include "phonenumbers/base/basictypes.h"
25#include "absl/strings/string_view.h"
26#include "absl/strings/str_cat.h"
27
28namespace i18n {
29namespace phonenumbers {
30
31using std::string;
32using std::vector;
33
34// Supports string("hello") + 10.
35string operator+(const string& s, int n);  // NOLINT(runtime/string)
36
37// Converts integer to string.
38string SimpleItoa(uint64_t n);
39string SimpleItoa(int64_t n);
40string SimpleItoa(int n);
41
42// Returns whether the provided string starts with the supplied prefix.
43bool HasPrefixString(const string& s, const string& prefix);
44
45// Returns the index of the nth occurence of c in s or string::npos if less than
46// n occurrences are present.
47size_t FindNth(const string& s, char c, int n);
48
49// Splits a string using a character delimiter. Appends the components to the
50// provided vector. Note that empty tokens are ignored.
51void SplitStringUsing(const string& s, char delimiter,
52                      vector<string>* result);
53
54// Returns true if 'in' starts with 'prefix' and writes 'in' minus 'prefix' into
55// 'out'.
56bool TryStripPrefixString(const string& in, const string& prefix, string* out);
57
58// Returns true if 's' ends with 'suffix'.
59bool HasSuffixString(const string& s, const string& suffix);
60
61// Converts string to int32_t.
62void safe_strto32(const string& s, int32_t *n);
63
64// Converts string to uint64_t.
65void safe_strtou64(const string& s, uint64_t *n);
66
67// Converts string to int64_t.
68void safe_strto64(const string& s, int64_t* n);
69
70// Remove all occurrences of a given set of characters from a string.
71void strrmm(string* s, const string& chars);
72
73// Replaces all instances of 'substring' in 's' with 'replacement'. Returns the
74// number of instances replaced. Replacements are not subject to re-matching.
75int GlobalReplaceSubstring(const string& substring, const string& replacement,
76                           string* s);
77
78// An abstract to absl::AlphaNum type; AlphaNum has more accomidating
79// constructors for more types.
80class StringHolder: public absl::AlphaNum {
81 public:
82  // Don't make the constructors explicit to make the StrCat usage convenient.
83  StringHolder(const string& s);  // NOLINT(runtime/explicit)
84  StringHolder(const char* s);    // NOLINT(runtime/explicit)
85  StringHolder(uint64_t n);         // NOLINT(runtime/explicit)
86  ~StringHolder();
87
88  const absl::string_view GetString() const {
89    return Piece();
90  }
91
92  const char* GetCString() const {
93    return data();
94  }
95
96  size_t Length() const {
97    return size();
98  }
99};
100
101string& operator+=(string& lhs, const StringHolder& rhs);
102
103// Efficient string concatenation.
104
105string StrCat(const StringHolder& s1, const StringHolder& s2);
106
107string StrCat(const StringHolder& s1, const StringHolder& s2,
108              const StringHolder& s3);
109
110string StrCat(const StringHolder& s1, const StringHolder& s2,
111              const StringHolder& s3, const StringHolder& s4);
112
113string StrCat(const StringHolder& s1, const StringHolder& s2,
114              const StringHolder& s3, const StringHolder& s4,
115              const StringHolder& s5);
116
117string StrCat(const StringHolder& s1, const StringHolder& s2,
118              const StringHolder& s3, const StringHolder& s4,
119              const StringHolder& s5, const StringHolder& s6);
120
121string StrCat(const StringHolder& s1, const StringHolder& s2,
122              const StringHolder& s3, const StringHolder& s4,
123              const StringHolder& s5, const StringHolder& s6,
124              const StringHolder& s7);
125
126string StrCat(const StringHolder& s1, const StringHolder& s2,
127              const StringHolder& s3, const StringHolder& s4,
128              const StringHolder& s5, const StringHolder& s6,
129              const StringHolder& s7, const StringHolder& s8);
130
131string StrCat(const StringHolder& s1, const StringHolder& s2,
132              const StringHolder& s3, const StringHolder& s4,
133              const StringHolder& s5, const StringHolder& s6,
134              const StringHolder& s7, const StringHolder& s8,
135              const StringHolder& s9);
136
137string StrCat(const StringHolder& s1, const StringHolder& s2,
138              const StringHolder& s3, const StringHolder& s4,
139              const StringHolder& s5, const StringHolder& s6,
140              const StringHolder& s7, const StringHolder& s8,
141              const StringHolder& s9, const StringHolder& s10,
142              const StringHolder& s11);
143
144string StrCat(const StringHolder& s1, const StringHolder& s2,
145              const StringHolder& s3, const StringHolder& s4,
146              const StringHolder& s5, const StringHolder& s6,
147              const StringHolder& s7, const StringHolder& s8,
148              const StringHolder& s9, const StringHolder& s10,
149              const StringHolder& s11, const StringHolder& s12);
150
151string StrCat(const StringHolder& s1, const StringHolder& s2,
152              const StringHolder& s3, const StringHolder& s4,
153              const StringHolder& s5, const StringHolder& s6,
154              const StringHolder& s7, const StringHolder& s8,
155              const StringHolder& s9, const StringHolder& s10,
156              const StringHolder& s11, const StringHolder& s12,
157              const StringHolder& s13);
158
159string StrCat(const StringHolder& s1, const StringHolder& s2,
160              const StringHolder& s3, const StringHolder& s4,
161              const StringHolder& s5, const StringHolder& s6,
162              const StringHolder& s7, const StringHolder& s8,
163              const StringHolder& s9, const StringHolder& s10,
164              const StringHolder& s11, const StringHolder& s12,
165              const StringHolder& s13, const StringHolder& s14);
166
167string StrCat(const StringHolder& s1, const StringHolder& s2,
168              const StringHolder& s3, const StringHolder& s4,
169              const StringHolder& s5, const StringHolder& s6,
170              const StringHolder& s7, const StringHolder& s8,
171              const StringHolder& s9, const StringHolder& s10,
172              const StringHolder& s11, const StringHolder& s12,
173              const StringHolder& s13, const StringHolder& s14,
174              const StringHolder& s15);
175
176string StrCat(const StringHolder& s1, const StringHolder& s2,
177              const StringHolder& s3, const StringHolder& s4,
178              const StringHolder& s5, const StringHolder& s6,
179              const StringHolder& s7, const StringHolder& s8,
180              const StringHolder& s9, const StringHolder& s10,
181              const StringHolder& s11, const StringHolder& s12,
182              const StringHolder& s13, const StringHolder& s14,
183              const StringHolder& s15, const StringHolder& s16);
184
185void StrAppend(string* dest, const StringHolder& s1);
186
187void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2);
188
189void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
190               const StringHolder& s3);
191
192void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
193               const StringHolder& s3, const StringHolder& s4);
194
195void StrAppend(string* dest, const StringHolder& s1, const StringHolder& s2,
196               const StringHolder& s3, const StringHolder& s4,
197               const StringHolder& s5);
198
199}  // namespace phonenumbers
200}  // namespace i18n
201
202#endif  // I18N_PHONENUMBERS_STRINGUTIL_H_
203