Coverage Report

Created: 2024-11-21 12:31

/root/doris/be/src/gutil/strings/split.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2008 and onwards Google, Inc.
2
//
3
// #status: RECOMMENDED
4
// #category: operations on strings
5
// #summary: Functions for splitting strings into substrings.
6
//
7
// This file contains functions for splitting strings. The new and recommended
8
// API for string splitting is the strings::Split() function. The old API is a
9
// large collection of standalone functions declared at the bottom of this file
10
// in the global scope.
11
//
12
// TODO(user): Rough migration plan from old API to new API
13
// (1) Add comments to old Split*() functions showing how to do the same things
14
//     with the new API.
15
// (2) Reimplement some of the old Split*() functions in terms of the new
16
//     Split() API. This will allow deletion of code in split.cc.
17
// (3) (Optional) Replace old Split*() API calls at call sites with calls to new
18
//     Split() API.
19
//
20
#pragma once
21
22
// IWYU pragma: no_include <pstl/glue_algorithm_defs.h>
23
24
#include <stddef.h>
25
#include <algorithm>
26
27
using std::copy;
28
using std::max;
29
using std::min;
30
using std::reverse;
31
using std::sort;
32
using std::swap;
33
#include <iterator>
34
35
using std::back_insert_iterator;
36
using std::iterator_traits;
37
#include <map>
38
39
using std::map;
40
using std::multimap;
41
#include <set>
42
43
using std::multiset;
44
using std::set;
45
#include <string>
46
47
using std::string;
48
#include <utility>
49
50
using std::make_pair;
51
using std::pair;
52
#include <vector>
53
54
using std::vector;
55
#include "common/logging.h"
56
#include <unordered_map>
57
#include <unordered_set>
58
59
#include "gutil/integral_types.h"
60
#include "gutil/strings/charset.h"
61
#include "gutil/strings/stringpiece.h"
62
#include "gutil/strings/strip.h"
63
#include "gutil/strings/split_internal.h" // IWYU pragma: keep
64
65
namespace strings {
66
67
//                              The new Split API
68
//                                  aka Split2
69
//                              aka strings::Split()
70
//
71
// This string splitting API consists of a Split() function in the ::strings
72
// namespace and a handful of delimiter objects in the ::strings::delimiter
73
// namespace (more on delimiter objects below). The Split() function always
74
// takes two arguments: the text to be split and the delimiter on which to split
75
// the text. An optional third argument may also be given, which is a Predicate
76
// functor that will be used to filter the results, e.g., to skip empty strings
77
// (more on predicates below). The Split() function adapts the returned
78
// collection to the type specified by the caller.
79
//
80
// Example 1:
81
//   // Splits the given string on commas. Returns the results in a
82
//   // vector of strings.
83
//   vector<string> v = strings::Split("a,b,c", ",");
84
//   assert(v.size() == 3);
85
//
86
// Example 2:
87
//   // By default, empty strings are *included* in the output. See the
88
//   // strings::SkipEmpty predicate below to omit them.
89
//   vector<string> v = strings::Split("a,b,,c", ",");
90
//   assert(v.size() == 4);  // "a", "b", "", "c"
91
//   v = strings::Split("", ",");
92
//   assert(v.size() == 1);  // v contains a single ""
93
//
94
// Example 3:
95
//   // Splits the string as in the previous example, except that the results
96
//   // are returned as StringPiece objects. Note that because we are storing
97
//   // the results within StringPiece objects, we have to ensure that the input
98
//   // string outlives any results.
99
//   vector<StringPiece> v = strings::Split("a,b,c", ",");
100
//   assert(v.size() == 3);
101
//
102
// Example 4:
103
//   // Stores results in a set<string>.
104
//   set<string> a = strings::Split("a,b,c,a,b,c", ",");
105
//   assert(a.size() == 3);
106
//
107
// Example 5:
108
//   // Stores results in a map. The map implementation assumes that the input
109
//   // is provided as a series of key/value pairs. For example, the 0th element
110
//   // resulting from the split will be stored as a key to the 1st element. If
111
//   // an odd number of elements are resolved, the last element is paired with
112
//   // a default-constructed value (e.g., empty string).
113
//   map<string, string> m = strings::Split("a,b,c", ",");
114
//   assert(m.size() == 2);
115
//   assert(m["a"] == "b");
116
//   assert(m["c"] == "");  // last component value equals ""
117
//
118
// Example 6:
119
//   // Splits on the empty string, which results in each character of the input
120
//   // string becoming one element in the output collection.
121
//   vector<string> v = strings::Split("abc", "");
122
//   assert(v.size() == 3);
123
//
124
// Example 7:
125
//   // Stores first two split strings as the members in an std::pair.
126
//   std::pair<string, string> p = strings::Split("a,b,c", ",");
127
//   EXPECT_EQ("a", p.first);
128
//   EXPECT_EQ("b", p.second);
129
//   // "c" is omitted because std::pair can hold only two elements.
130
//
131
// As illustrated above, the Split() function adapts the returned collection to
132
// the type specified by the caller. The returned collections may contain
133
// string, StringPiece, Cord, or any object that has a constructor (explicit or
134
// not) that takes a single StringPiece argument. This pattern works for all
135
// standard STL containers including vector, list, deque, set, multiset, map,
136
// multimap, unordered_set and unordered_map, and even std::pair which is not
137
// actually a container.
138
//
139
// Splitting to std::pair is an interesting case because it can hold only two
140
// elements and is not a collection type. When splitting to an std::pair the
141
// first two split strings become the std::pair's .first and .second members
142
// respectively. The remaining split substrings are discarded. If there are less
143
// than two split substrings, the empty string is used for the corresponding
144
// std::pair member.
145
//
146
// The strings::Split() function can be used multiple times to perform more
147
// complicated splitting logic, such as intelligently parsing key-value pairs.
148
// For example
149
//
150
//   // The input string "a=b=c,d=e,f=,g" becomes
151
//   // { "a" => "b=c", "d" => "e", "f" => "", "g" => "" }
152
//   map<string, string> m;
153
//   for (StringPiece sp : strings::Split("a=b=c,d=e,f=,g", ",")) {
154
//     m.insert(strings::Split(sp, strings::delimiter::Limit("=", 1)));
155
//   }
156
//   EXPECT_EQ("b=c", m.find("a")->second);
157
//   EXPECT_EQ("e", m.find("d")->second);
158
//   EXPECT_EQ("", m.find("f")->second);
159
//   EXPECT_EQ("", m.find("g")->second);
160
//
161
// The above example stores the results in an std::map. But depending on your
162
// data requirements, you can just as easily store the results in an
163
// std::multimap or even a vector<std::pair<>>.
164
//
165
//
166
//                                  Delimiters
167
//
168
// The Split() function also takes a second argument that is a delimiter. This
169
// delimiter is actually an object that defines the boundaries between elements
170
// in the provided input. If a string (const char*, ::string, or StringPiece) is
171
// passed in place of an explicit Delimiter object, the argument is implicitly
172
// converted to a ::strings::delimiter::Literal.
173
//
174
// With this split API comes the formal concept of a Delimiter (big D). A
175
// Delimiter is an object with a Find() function that knows how find the first
176
// occurrence of itself in a given StringPiece. Models of the Delimiter concept
177
// represent specific kinds of delimiters, such as single characters,
178
// substrings, or even regular expressions.
179
//
180
// The following Delimiter objects are provided as part of the Split() API:
181
//
182
//   - Literal (default)
183
//   - AnyOf
184
//   - Limit
185
//
186
// The following are examples of using some provided Delimiter objects:
187
//
188
// Example 1:
189
//   // Because a string literal is converted to a strings::delimiter::Literal,
190
//   // the following two splits are equivalent.
191
//   vector<string> v1 = strings::Split("a,b,c", ",");           // (1)
192
//   using ::strings::delimiter::Literal;
193
//   vector<string> v2 = strings::Split("a,b,c", Literal(","));  // (2)
194
//
195
// Example 2:
196
//   // Splits on any of the characters specified in the delimiter string.
197
//   using ::strings::delimiter::AnyOf;
198
//   vector<string> v = strings::Split("a,b;c-d", AnyOf(",;-"));
199
//   assert(v.size() == 4);
200
//
201
// Example 3:
202
//   // Uses the Limit meta-delimiter to limit the number of matches a delimiter
203
//   // can have. In this case, the delimiter of a Literal comma is limited to
204
//   // to matching at most one time. The last element in the returned
205
//   // collection will contain all unsplit pieces, which may contain instances
206
//   // of the delimiter.
207
//   using ::strings::delimiter::Limit;
208
//   vector<string> v = strings::Split("a,b,c", Limit(",", 1));
209
//   assert(v.size() == 2);  // Limited to 1 delimiter; so two elements found
210
//   assert(v[0] == "a");
211
//   assert(v[1] == "b,c");
212
//
213
//
214
//                                  Predicates
215
//
216
// Predicates can filter the results of a Split() operation by determining
217
// whether or not a resultant element is included in the result set. A predicate
218
// may be passed as an *optional* third argument to the Split() function.
219
//
220
// Predicates are unary functions (or functors) that take a single StringPiece
221
// argument and return bool indicating whether the argument should be included
222
// (true) or excluded (false).
223
//
224
// One example where this is useful is when filtering out empty substrings. By
225
// default, empty substrings may be returned by strings::Split(), which is
226
// similar to the way split functions work in other programming languages. For
227
// example:
228
//
229
//   // Empty strings *are* included in the returned collection.
230
//   vector<string> v = strings::Split(",a,,b,", ",");
231
//   assert(v.size() ==  5);  // v[0] == "", v[1] == "a", v[2] == "", ...
232
//
233
// These empty strings can be filtered out of the results by simply passing the
234
// provided SkipEmpty predicate as the third argument to the Split() function.
235
// SkipEmpty does not consider a string containing all whitespace to be empty.
236
// For that behavior use the SkipWhitespace predicate. For example:
237
//
238
// Example 1:
239
//   // Uses SkipEmpty to omit empty strings. Strings containing whitespace are
240
//   // not empty and are therefore not skipped.
241
//   using strings::SkipEmpty;
242
//   vector<string> v = strings::Split(",a, ,b,", ",", SkipEmpty());
243
//   assert(v.size() == 3);
244
//   assert(v[0] == "a");
245
//   assert(v[1] == " ");  // <-- The whitespace makes the string not empty.
246
//   assert(v[2] == "b");
247
//
248
// Example 2:
249
//   // Uses SkipWhitespace to skip all strings that are either empty or contain
250
//   // only whitespace.
251
//   using strings::SkipWhitespace;
252
//   vector<string> v = strings::Split(",a, ,b,", ",",  SkipWhitespace());
253
//   assert(v.size() == 2);
254
//   assert(v[0] == "a");
255
//   assert(v[1] == "b");
256
//
257
//
258
//                     Differences between Split1 and Split2
259
//
260
// Split2 is the strings::Split() API described above. Split1 is a name for the
261
// collection of legacy Split*() functions declared later in this file. Most of
262
// the Split1 functions follow a set of conventions that don't necessarily match
263
// the conventions used in Split2. The following are some of the important
264
// differences between Split1 and Split2:
265
//
266
// Split1 -> Split2
267
// ----------------
268
// Append -> Assign:
269
//   The Split1 functions all returned their output collections via a pointer to
270
//   an out parameter as is typical in Google code. In some cases the comments
271
//   explicitly stated that results would be *appended* to the output
272
//   collection. In some cases it was ambiguous whether results were appended.
273
//   This ambiguity is gone in the Split2 API as results are always assigned to
274
//   the output collection, never appended.
275
//
276
// AnyOf -> Literal:
277
//   Most Split1 functions treated their delimiter argument as a string of
278
//   individual byte delimiters. For example, a delimiter of ",;" would split on
279
//   "," and ";", not the substring ",;". This behavior is equivalent to the
280
//   Split2 delimiter strings::delimiter::AnyOf, which is *not* the default. By
281
//   default, strings::Split() splits using strings::delimiter::Literal() which
282
//   would treat the whole string ",;" as a single delimiter string.
283
//
284
// SkipEmpty -> allow empty:
285
//   Most Split1 functions omitted empty substrings in the results. To keep
286
//   empty substrings one would have to use an explicitly named
287
//   Split*AllowEmpty() function. This behavior is reversed in Split2. By
288
//   default, strings::Split() *allows* empty substrings in the output. To skip
289
//   them, use the strings::SkipEmpty predicate.
290
//
291
// string -> user's choice:
292
//   Most Split1 functions return collections of string objects. Some return
293
//   char*, but the type returned is dictated by each Split1 function. With
294
//   Split2 the caller can choose which string-like object to return. (Note:
295
//   char* C-strings are not supported in Split2--use StringPiece instead).
296
//
297
298
// Definitions of the main Split() function.
299
template <typename Delimiter>
300
24
internal::Splitter<Delimiter> Split(StringPiece text, Delimiter d) {
301
24
    return internal::Splitter<Delimiter>(text, d);
302
24
}
_ZN7strings5SplitINS_9delimiter9LimitImplINS1_7LiteralEEEEENS_8internal8SplitterIT_NS5_8NoFilterEEE11StringPieceS7_
Line
Count
Source
300
24
internal::Splitter<Delimiter> Split(StringPiece text, Delimiter d) {
301
24
    return internal::Splitter<Delimiter>(text, d);
302
24
}
Unexecuted instantiation: _ZN7strings5SplitINS_9delimiter5AnyOfEEENS_8internal8SplitterIT_NS3_8NoFilterEEE11StringPieceS5_
Unexecuted instantiation: _ZN7strings5SplitINS_9delimiter9LimitImplINS1_5AnyOfEEEEENS_8internal8SplitterIT_NS5_8NoFilterEEE11StringPieceS7_
303
304
template <typename Delimiter, typename Predicate>
305
0
internal::Splitter<Delimiter, Predicate> Split(StringPiece text, Delimiter d, Predicate p) {
306
0
    return internal::Splitter<Delimiter, Predicate>(text, d, p);
307
0
}
308
309
namespace delimiter {
310
// A Delimiter object represents a single separator, such as a character,
311
// literal string, or regular expression. A Delimiter object must have the
312
// following member:
313
//
314
//   StringPiece Find(StringPiece text);
315
//
316
// This Find() member function should return a StringPiece referring to the next
317
// occurrence of the represented delimiter within the given string text. If no
318
// delimiter is found in the given text, a zero-length StringPiece referring to
319
// text.end() should be returned (e.g., StringPiece(text.end(), 0)). It is
320
// important that the returned StringPiece always be within the bounds of the
321
// StringPiece given as an argument--it must not refer to a string that is
322
// physically located outside of the given string. The following example is a
323
// simple Delimiter object that is created with a single char and will look for
324
// that char in the text given to the Find() function:
325
//
326
//   struct SimpleDelimiter {
327
//     const char c_;
328
//     explicit SimpleDelimiter(char c) : c_(c) {}
329
//     StringPiece Find(StringPiece text) {
330
//       int pos = text.find(c_);
331
//       if (pos == StringPiece::npos) return StringPiece(text.end(), 0);
332
//       return StringPiece(text, pos, 1);
333
//     }
334
//   };
335
336
// Represents a literal string delimiter. Examples:
337
//
338
//   using ::strings::delimiter::Literal;
339
//   vector<string> v = strings::Split("a=>b=>c", Literal("=>"));
340
//   assert(v.size() == 3);
341
//   assert(v[0] == "a");
342
//   assert(v[1] == "b");
343
//   assert(v[2] == "c");
344
//
345
// The next example uses the empty string as a delimiter.
346
//
347
//   using ::strings::delimiter::Literal;
348
//   vector<string> v = strings::Split("abc", Literal(""));
349
//   assert(v.size() == 3);
350
//   assert(v[0] == "a");
351
//   assert(v[1] == "b");
352
//   assert(v[2] == "c");
353
//
354
class Literal {
355
public:
356
    explicit Literal(StringPiece sp);
357
    StringPiece Find(StringPiece text) const;
358
359
private:
360
    const string delimiter_;
361
};
362
363
// Represents a delimiter that will match any of the given byte-sized
364
// characters. AnyOf is similar to Literal, except that AnyOf uses
365
// StringPiece::find_first_of() and Literal uses StringPiece::find(). AnyOf
366
// examples:
367
//
368
//   using ::strings::delimiter::AnyOf;
369
//   vector<string> v = strings::Split("a,b=c", AnyOf(",="));
370
//
371
//   assert(v.size() == 3);
372
//   assert(v[0] == "a");
373
//   assert(v[1] == "b");
374
//   assert(v[2] == "c");
375
//
376
// If AnyOf is given the empty string, it behaves exactly like Literal and
377
// matches each individual character in the input string.
378
//
379
// Note: The string passed to AnyOf is assumed to be a string of single-byte
380
// ASCII characters. AnyOf does not work with multi-byte characters.
381
class AnyOf {
382
public:
383
    explicit AnyOf(StringPiece sp);
384
    StringPiece Find(StringPiece text) const;
385
386
private:
387
    const string delimiters_;
388
};
389
390
// Wraps another delimiter and sets a max number of matches for that delimiter.
391
// Create LimitImpls using the Limit() function. Example:
392
//
393
//   using ::strings::delimiter::Limit;
394
//   vector<string> v = strings::Split("a,b,c,d", Limit(",", 2));
395
//
396
//   assert(v.size() == 3);  // Split on 2 commas, giving a vector with 3 items
397
//   assert(v[0] == "a");
398
//   assert(v[1] == "b");
399
//   assert(v[2] == "c,d");
400
//
401
template <typename Delimiter>
402
class LimitImpl {
403
public:
404
    LimitImpl(Delimiter delimiter, int limit)
405
24
            : delimiter_(std::move(delimiter)), limit_(limit), count_(0) {}
_ZN7strings9delimiter9LimitImplINS0_7LiteralEEC2ES2_i
Line
Count
Source
405
24
            : delimiter_(std::move(delimiter)), limit_(limit), count_(0) {}
Unexecuted instantiation: _ZN7strings9delimiter9LimitImplINS0_5AnyOfEEC2ES2_i
406
47
    StringPiece Find(StringPiece text) {
407
47
        if (count_++ == limit_) {
408
18
            return StringPiece(text.end(), 0); // No more matches.
409
18
        }
410
29
        return delimiter_.Find(text);
411
47
    }
_ZN7strings9delimiter9LimitImplINS0_7LiteralEE4FindE11StringPiece
Line
Count
Source
406
47
    StringPiece Find(StringPiece text) {
407
47
        if (count_++ == limit_) {
408
18
            return StringPiece(text.end(), 0); // No more matches.
409
18
        }
410
29
        return delimiter_.Find(text);
411
47
    }
Unexecuted instantiation: _ZN7strings9delimiter9LimitImplINS0_5AnyOfEE4FindE11StringPiece
412
413
private:
414
    Delimiter delimiter_;
415
    const int limit_;
416
    int count_;
417
};
418
419
// Overloaded Limit() function to create LimitImpl<> objects. Uses the Delimiter
420
// Literal as the default if string-like objects are passed as the delimiter
421
// parameter. This is similar to the overloads for Split() below.
422
template <typename Delimiter>
423
0
LimitImpl<Delimiter> Limit(Delimiter delim, int limit) {
424
0
    return LimitImpl<Delimiter>(delim, limit);
425
0
}
426
427
14
inline LimitImpl<Literal> Limit(const char* s, int limit) {
428
14
    return LimitImpl<Literal>(Literal(s), limit);
429
14
}
430
431
10
inline LimitImpl<Literal> Limit(const string& s, int limit) {
432
10
    return LimitImpl<Literal>(Literal(s), limit);
433
10
}
434
435
0
inline LimitImpl<Literal> Limit(StringPiece s, int limit) {
436
0
    return LimitImpl<Literal>(Literal(s), limit);
437
0
}
438
439
} // namespace delimiter
440
441
//
442
// Predicates are functors that return bool indicating whether the given
443
// StringPiece should be included in the split output. If the predicate returns
444
// false then the string will be excluded from the output from strings::Split().
445
//
446
447
// Always returns true, indicating that all strings--including empty
448
// strings--should be included in the split output. This predicate is not
449
// strictly needed because this is the default behavior of the strings::Split()
450
// function. But it might be useful at some call sites to make the intent
451
// explicit.
452
//
453
// vector<string> v = Split(" a , ,,b,", ",", AllowEmpty());
454
// EXPECT_THAT(v, ElementsAre(" a ", " ", "", "b", ""));
455
struct AllowEmpty {
456
0
    bool operator()(StringPiece sp) const { return true; }
457
};
458
459
// Returns false if the given StringPiece is empty, indicating that the
460
// strings::Split() API should omit the empty string.
461
//
462
// vector<string> v = Split(" a , ,,b,", ",", SkipEmpty());
463
// EXPECT_THAT(v, ElementsAre(" a ", " ", "b"));
464
struct SkipEmpty {
465
0
    bool operator()(StringPiece sp) const { return !sp.empty(); }
466
};
467
468
// Returns false if the given StringPiece is empty or contains only whitespace,
469
// indicating that the strings::Split() API should omit the string.
470
//
471
// vector<string> v = Split(" a , ,,b,", ",", SkipWhitespace());
472
// EXPECT_THAT(v, ElementsAre(" a ", "b"));
473
struct SkipWhitespace {
474
2.69k
    bool operator()(StringPiece sp) const {
475
2.69k
        StripWhiteSpace(&sp);
476
2.69k
        return !sp.empty();
477
2.69k
    }
478
};
479
480
// Split() function overloads to effectively give Split() a default Delimiter
481
// type of Literal. If Split() is called and a string is passed as the delimiter
482
// instead of an actual Delimiter object, then one of these overloads will be
483
// invoked and will create a Splitter<Literal> with the delimiter string.
484
//
485
// Since Split() is a function template above, these overload signatures need to
486
// be explicit about the string type so they match better than the templated
487
// version. These functions are overloaded for:
488
//
489
//   - const char*
490
//   - const string&
491
//   - StringPiece
492
493
54
inline internal::Splitter<delimiter::Literal> Split(StringPiece text, const char* delimiter) {
494
54
    return internal::Splitter<delimiter::Literal>(text, delimiter::Literal(delimiter));
495
54
}
496
497
89
inline internal::Splitter<delimiter::Literal> Split(StringPiece text, const string& delimiter) {
498
89
    return internal::Splitter<delimiter::Literal>(text, delimiter::Literal(delimiter));
499
89
}
500
501
0
inline internal::Splitter<delimiter::Literal> Split(StringPiece text, StringPiece delimiter) {
502
0
    return internal::Splitter<delimiter::Literal>(text, delimiter::Literal(delimiter));
503
0
}
504
505
// Same overloads as above, but also including a Predicate argument.
506
template <typename Predicate>
507
internal::Splitter<delimiter::Literal, Predicate> Split(StringPiece text, const char* delimiter,
508
500
                                                        Predicate p) {
509
500
    return internal::Splitter<delimiter::Literal, Predicate>(text, delimiter::Literal(delimiter),
510
500
                                                             p);
511
500
}
_ZN7strings5SplitINS_14SkipWhitespaceEEENS_8internal8SplitterINS_9delimiter7LiteralET_EE11StringPiecePKcS6_
Line
Count
Source
508
500
                                                        Predicate p) {
509
500
    return internal::Splitter<delimiter::Literal, Predicate>(text, delimiter::Literal(delimiter),
510
500
                                                             p);
511
500
}
Unexecuted instantiation: _ZN7strings5SplitINS_9SkipEmptyEEENS_8internal8SplitterINS_9delimiter7LiteralET_EE11StringPiecePKcS6_
512
513
template <typename Predicate>
514
internal::Splitter<delimiter::Literal, Predicate> Split(StringPiece text, const string& delimiter,
515
                                                        Predicate p) {
516
    return internal::Splitter<delimiter::Literal, Predicate>(text, delimiter::Literal(delimiter),
517
                                                             p);
518
}
519
520
template <typename Predicate>
521
internal::Splitter<delimiter::Literal, Predicate> Split(StringPiece text, StringPiece delimiter,
522
                                                        Predicate p) {
523
    return internal::Splitter<delimiter::Literal, Predicate>(text, delimiter::Literal(delimiter),
524
                                                             p);
525
}
526
527
} // namespace strings
528
529
//
530
// ==================== LEGACY SPLIT FUNCTIONS ====================
531
//
532
533
// NOTE: The instruction below creates a Module titled
534
// GlobalSplitFunctions within the auto-generated Doxygen documentation.
535
// This instruction is needed to expose global functions that are not
536
// within a namespace.
537
//
538
// START DOXYGEN SplitFunctions grouping
539
/* @defgroup SplitFunctions
540
 * @{ */
541
542
// ----------------------------------------------------------------------
543
// ClipString
544
//    Clip a string to a max length. We try to clip on a word boundary
545
//    if this is possible. If the string is clipped, we append an
546
//    ellipsis.
547
//
548
//    ***NOTE***
549
//    ClipString counts length with strlen.  If you have non-ASCII
550
//    strings like UTF-8, this is wrong.  If you are displaying the
551
//    clipped strings to users in a frontend, consider using
552
//    ClipStringOnWordBoundary in
553
//    webserver/util/snippets/rewriteboldtags, which considers the width
554
//    of the string, not just the number of bytes.
555
//
556
//    TODO(user) Move ClipString back to strutil.  The problem with this is
557
//    that ClipStringHelper is used behind the scenes by SplitStringToLines, but
558
//    probably shouldn't be exposed in the .h files.
559
// ----------------------------------------------------------------------
560
void ClipString(char* str, int max_len);
561
562
// ----------------------------------------------------------------------
563
// ClipString
564
//    Version of ClipString() that uses string instead of char*.
565
//    NOTE: See comment above.
566
// ----------------------------------------------------------------------
567
void ClipString(string* full_str, int max_len);
568
569
// ----------------------------------------------------------------------
570
// SplitStringToLines() Split a string into lines of maximum length
571
// 'max_len'. Append the resulting lines to 'result'. Will attempt
572
// to split on word boundaries.  If 'num_lines'
573
// is zero it splits up the whole string regardless of length. If
574
// 'num_lines' is positive, it returns at most num_lines lines, and
575
// appends a "..." to the end of the last line if the string is too
576
// long to fit completely into 'num_lines' lines.
577
// ----------------------------------------------------------------------
578
void SplitStringToLines(const char* full, int max_len, int num_lines, vector<string>* result);
579
580
// ----------------------------------------------------------------------
581
// SplitOneStringToken()
582
//   Returns the first "delim" delimited string from "*source" and modifies
583
//   *source to point after the delimiter that was found. If no delimiter is
584
//   found, *source is set to NULL.
585
//
586
//   If the start of *source is a delimiter, an empty string is returned.
587
//   If *source is NULL, an empty string is returned.
588
//
589
//   "delim" is treated as a sequence of 1 or more character delimiters. Any one
590
//   of the characters present in "delim" is considered to be a single
591
//   delimiter; The delimiter is not "delim" as a whole. For example:
592
//
593
//     const char* s = "abc=;de";
594
//     string r = SplitOneStringToken(&s, ";=");
595
//     // r = "abc"
596
//     // s points to ";de"
597
// ----------------------------------------------------------------------
598
string SplitOneStringToken(const char** source, const char* delim);
599
600
// ----------------------------------------------------------------------
601
// SplitUsing()
602
//    Split a string into substrings based on the nul-terminated list
603
//    of bytes at delimiters (uses strsep) and return a vector of
604
//    those strings. Modifies 'full' We allocate the return vector,
605
//    and you should free it.  Note that empty fields are ignored.
606
//    Use SplitToVector with last argument 'false' if you want the
607
//    empty fields.
608
//    ----------------------------------------------------------------------
609
vector<char*>* SplitUsing(char* full, const char* delimiters);
610
611
// ----------------------------------------------------------------------
612
// SplitToVector()
613
//    Split a string into substrings based on the nul-terminated list
614
//    of bytes at delim (uses strsep) and appends the split
615
//    strings to 'vec'.  Modifies "full".  If omit empty strings is
616
//    true, empty strings are omitted from the resulting vector.
617
// ----------------------------------------------------------------------
618
void SplitToVector(char* full, const char* delimiters, vector<char*>* vec, bool omit_empty_strings);
619
void SplitToVector(char* full, const char* delimiters, vector<const char*>* vec,
620
                   bool omit_empty_strings);
621
622
// ----------------------------------------------------------------------
623
// SplitStringPieceToVector
624
//    Split a StringPiece into sub-StringPieces based on the
625
//    nul-terminated list of bytes at delim and appends the
626
//    pieces to 'vec'.  If omit empty strings is true, empty strings
627
//    are omitted from the resulting vector.
628
//    Expects the original string (from which 'full' is derived) to exist
629
//    for the full lifespan of 'vec'.
630
// ----------------------------------------------------------------------
631
void SplitStringPieceToVector(const StringPiece& full, const char* delim, vector<StringPiece>* vec,
632
                              bool omit_empty_strings);
633
634
// ----------------------------------------------------------------------
635
// SplitStringUsing()
636
// SplitStringToHashsetUsing()
637
// SplitStringToSetUsing()
638
// SplitStringToMapUsing()
639
// SplitStringToHashmapUsing()
640
641
// Splits a string using one or more byte delimiters, presented as a
642
// nul-terminated c string. Append the components to 'result'. If there are
643
// consecutive delimiters, this function skips over all of them: in other words,
644
// empty components are dropped. If you want to keep empty components, try
645
// SplitStringAllowEmpty().
646
//
647
// NOTE: Do not use this for multi-byte delimiters such as UTF-8 strings. Use
648
// strings::Split() with strings::delimiter::Literal as the delimiter.
649
//
650
// ==> NEW API: Consider using the new Split API defined above. <==
651
// Example:
652
//
653
//   using strings::SkipEmpty;
654
//   using strings::Split;
655
//   using strings::delimiter::AnyOf;
656
//
657
//   vector<string> v = Split(full, AnyOf(delimiter), SkipEmpty());
658
//
659
// For even better performance, store the result in a vector<StringPiece>
660
// to avoid string copies.
661
// ----------------------------------------------------------------------
662
void SplitStringUsing(const string& full, const char* delimiters, vector<string>* result);
663
void SplitStringToHashsetUsing(const string& full, const char* delimiters,
664
                               std::unordered_set<string>* result);
665
void SplitStringToSetUsing(const string& full, const char* delimiters, set<string>* result);
666
// The even-positioned (0-based) components become the keys for the
667
// odd-positioned components that follow them. When there is an odd
668
// number of components, the value for the last key will be unchanged
669
// if the key was already present in the hash table, or will be the
670
// empty string if the key is a newly inserted key.
671
void SplitStringToMapUsing(const string& full, const char* delim, map<string, string>* result);
672
void SplitStringToHashmapUsing(const string& full, const char* delim,
673
                               std::unordered_map<string, string>* result);
674
675
// ----------------------------------------------------------------------
676
// SplitStringAllowEmpty()
677
//
678
// Split a string using one or more byte delimiters, presented as a
679
// nul-terminated c string. Append the components to 'result'. If there are
680
// consecutive delimiters, this function will return corresponding empty
681
// strings.  If you want to drop the empty strings, try SplitStringUsing().
682
//
683
// If "full" is the empty string, yields an empty string as the only value.
684
//
685
// ==> NEW API: Consider using the new Split API defined above. <==
686
//
687
//   using strings::Split;
688
//   using strings::delimiter::AnyOf;
689
//
690
//   vector<string> v = Split(full, AnyOf(delimiter));
691
//
692
// For even better performance, store the result in a vector<StringPiece> to
693
// avoid string copies.
694
// ----------------------------------------------------------------------
695
void SplitStringAllowEmpty(const string& full, const char* delim, vector<string>* result);
696
697
// ----------------------------------------------------------------------
698
// SplitStringWithEscaping()
699
// SplitStringWithEscapingAllowEmpty()
700
// SplitStringWithEscapingToSet()
701
// SplitStringWithEscapingToHashset()
702
703
//   Split the string using the specified delimiters, taking escaping into
704
//   account. '\' is not allowed as a delimiter.
705
//
706
//   Within the string, preserve a delimiter preceded by a backslash as a
707
//   literal delimiter. In addition, preserve two consecutive backslashes as
708
//   a single literal backslash. Do not unescape any other backslash-character
709
//   sequence.
710
//
711
//   Eg. 'foo\=bar=baz\\qu\ux' split on '=' becomes ('foo=bar', 'baz\qu\ux')
712
//
713
//   All versions other than "AllowEmpty" discard any empty substrings.
714
// ----------------------------------------------------------------------
715
void SplitStringWithEscaping(const string& full, const strings::CharSet& delimiters,
716
                             vector<string>* result);
717
void SplitStringWithEscapingAllowEmpty(const string& full, const strings::CharSet& delimiters,
718
                                       vector<string>* result);
719
void SplitStringWithEscapingToSet(const string& full, const strings::CharSet& delimiters,
720
                                  set<string>* result);
721
void SplitStringWithEscapingToHashset(const string& full, const strings::CharSet& delimiters,
722
                                      std::unordered_set<string>* result);
723
724
// ----------------------------------------------------------------------
725
// SplitStringIntoNPiecesAllowEmpty()
726
727
//    Split a string using a nul-terminated list of byte
728
//    delimiters. Append the components to 'result'.  If there are
729
//    consecutive delimiters, this function will return corresponding
730
//    empty strings. The string is split into at most the specified
731
//    number of pieces greedily. This means that the last piece may
732
//    possibly be split further. To split into as many pieces as
733
//    possible, specify 0 as the number of pieces.
734
//
735
//    If "full" is the empty string, yields an empty string as the only value.
736
// ----------------------------------------------------------------------
737
void SplitStringIntoNPiecesAllowEmpty(const string& full, const char* delimiters, int pieces,
738
                                      vector<string>* result);
739
740
// ----------------------------------------------------------------------
741
// SplitStringAndParse()
742
// SplitStringAndParseToContainer()
743
// SplitStringAndParseToList()
744
//    Split a string using a nul-terminated list of character
745
//    delimiters.  For each component, parse using the provided
746
//    parsing function and if successful, append it to 'result'.
747
//    Return true if and only if all components parse successfully.
748
//    If there are consecutive delimiters, this function skips over
749
//    all of them.  This function will correctly handle parsing
750
//    strings that have embedded \0s.
751
//
752
// SplitStringAndParse fills into a vector.
753
// SplitStringAndParseToContainer fills into any container that implements
754
//    a single-argument insert function. (i.e. insert(const value_type& x) ).
755
// SplitStringAndParseToList fills into any container that implements a single-
756
//    argument push_back function (i.e. push_back(const value_type& x) ), plus
757
//    value_type& back() and pop_back().
758
//    NOTE: This implementation relies on parsing in-place into the "back()"
759
//    reference, so its performance may depend on the efficiency of back().
760
//
761
// Example Usage:
762
//  vector<double> values;
763
//  CHECK(SplitStringAndParse("1.0,2.0,3.0", ",", &safe_strtod, &values));
764
//  CHECK_EQ(3, values.size());
765
//
766
//  vector<int64> values;
767
//  CHECK(SplitStringAndParse("1M,2M,3M", ",",
768
//        &HumanReadableNumBytes::ToInt64, &values));
769
//  CHECK_EQ(3, values.size());
770
//
771
//  set<int64> values;
772
//  CHECK(SplitStringAndParseToContainer("3,1,1,2", ",",
773
//        &safe_strto64, &values));
774
//  CHECK_EQ(4, values.size());
775
//
776
//  deque<int64> values;
777
//  CHECK(SplitStringAndParseToList("3,1,1,2", ",", &safe_strto64, &values));
778
//  CHECK_EQ(4, values.size());
779
// ----------------------------------------------------------------------
780
template <class T>
781
bool SplitStringAndParse(StringPiece source, StringPiece delim,
782
                         bool (*parse)(const string& str, T* value), vector<T>* result);
783
template <class Container>
784
bool SplitStringAndParseToContainer(StringPiece source, StringPiece delim,
785
                                    bool (*parse)(const string& str,
786
                                                  typename Container::value_type* value),
787
                                    Container* result);
788
789
template <class List>
790
bool SplitStringAndParseToList(StringPiece source, StringPiece delim,
791
                               bool (*parse)(const string& str, typename List::value_type* value),
792
                               List* result);
793
// ----------------------------------------------------------------------
794
// SplitRange()
795
//    Splits a string of the form "<from>-<to>".  Either or both can be
796
//    missing.  A raw number (<to>) is interpreted as "<to>-".  Modifies
797
//    parameters insofar as they're specified by the string.  RETURNS
798
//    true iff the input is a well-formed range.  If it RETURNS false,
799
//    from and to remain unchanged.  The range in rangestr should be
800
//    terminated either by "\0" or by whitespace.
801
// ----------------------------------------------------------------------
802
bool SplitRange(const char* rangestr, int* from, int* to);
803
804
// ----------------------------------------------------------------------
805
// SplitCSVLineWithDelimiter()
806
//    CSV lines come in many guises.  There's the Comma Separated Values
807
//    variety, in which fields are separated by (surprise!) commas.  There's
808
//    also the tab-separated values variant, in which tabs separate the
809
//    fields.  This routine handles both, which makes it almost like
810
//    SplitUsing(line, delimiter), but for some special processing.  For both
811
//    delimiters, whitespace is trimmed from either side of the field value.
812
//    If the delimiter is ',', we play additional games with quotes.  A
813
//    field value surrounded by double quotes is allowed to contain commas,
814
//    which are not treated as field separators.  Within a double-quoted
815
//    string, a series of two double quotes signals an escaped single double
816
//    quote.  It'll be clearer in the examples.
817
//    Example:
818
//     Google , x , "Buchheit, Paul", "string with "" quote in it"
819
//     -->  [Google], [x], [Buchheit, Paul], [string with " quote in it]
820
//
821
// SplitCSVLine()
822
//    A convenience wrapper around SplitCSVLineWithDelimiter which uses
823
//    ',' as the delimiter.
824
//
825
// The following variants of SplitCSVLine() are not recommended for new code.
826
// Please consider the CSV parser in //util/csv as an alternative.  Examples:
827
// To parse a single line:
828
//     #include "util/csv/parser.h"
829
//     vector<string> fields = util::csv::ParseLine(line).fields();
830
//
831
// To parse an entire file:
832
//     #include "util/csv/parser.h"
833
//     for (Record rec : Parser(source)) {
834
//       vector<string> fields = rec.fields();
835
//     }
836
//
837
// See //util/csv/parser.h for more complete documentation.
838
//
839
// ----------------------------------------------------------------------
840
void SplitCSVLine(char* line, vector<char*>* cols);
841
void SplitCSVLineWithDelimiter(char* line, char delimiter, vector<char*>* cols);
842
// SplitCSVLine string wrapper that internally makes a copy of string line.
843
void SplitCSVLineWithDelimiterForStrings(const string& line, char delimiter, vector<string>* cols);
844
845
// ----------------------------------------------------------------------
846
// SplitStructuredLine()
847
//    Splits a line using the given delimiter, and places the columns
848
//    into 'cols'. This is unlike 'SplitUsing(line, ",")' because you can
849
//    define pairs of opening closing symbols inside which the delimiter should
850
//    be ignored. If the symbol_pair string has an odd number of characters,
851
//    the last character (which cannot be paired) will be assumed to be both an
852
//    opening and closing symbol.
853
//    WARNING : The input string 'line' is destroyed in the process.
854
//    The function returns 0 if the line was parsed correctly (i.e all the
855
//    opened braces had their closing braces) otherwise, it returns the position
856
//    of the error.
857
//    Example:
858
//     SplitStructuredLine("item1,item2,{subitem1,subitem2},item4,[5,{6,7}]",
859
//                         ',',
860
//                         "{}[]", &output)
861
//     --> output = { "item1", "item2", "{subitem1,subitem2}", "item4",
862
//                    "[5,{6,7}]" }
863
//    Example2: trying to split "item1,[item2,{4,5],5}" will fail and the
864
//              function will return the position of the problem : ]
865
//
866
// ----------------------------------------------------------------------
867
char* SplitStructuredLine(char* line, char delimiter, const char* symbol_pairs,
868
                          vector<char*>* cols);
869
870
// Similar to the function with the same name above, but splits a StringPiece
871
// into StringPiece parts. Returns true if successful.
872
bool SplitStructuredLine(StringPiece line, char delimiter, const char* symbol_pairs,
873
                         vector<StringPiece>* cols);
874
875
// ----------------------------------------------------------------------
876
// SplitStructuredLineWithEscapes()
877
//    Like SplitStructuredLine but also allows characters to be escaped.
878
//
879
//    WARNING: the escape characters will be replicated in the output
880
//    columns rather than being consumed, i.e. if {} were the opening and
881
//    closing symbols, using \{ to quote a curly brace in the middle of
882
//    an option would pass this unchanged.
883
//
884
//    Example:
885
//     SplitStructuredLineWithEscapes(
886
//       "\{item1\},it\\em2,{\{subitem1\},sub\\item2},item4\,item5,[5,{6,7}]",
887
//                     ',',
888
//                     "{}[]",
889
//                     &output)
890
//     --> output = { "\{item1\}", "it\\em2", "{\{subitem1\},sub\\item2}",
891
//                    "item4\,item5", "[5,{6,7}]" }
892
//
893
// ----------------------------------------------------------------------
894
char* SplitStructuredLineWithEscapes(char* line, char delimiter, const char* symbol_pairs,
895
                                     vector<char*>* cols);
896
897
// Similar to the function with the same name above, but splits a StringPiece
898
// into StringPiece parts. Returns true if successful.
899
bool SplitStructuredLineWithEscapes(StringPiece line, char delimiter, const char* symbol_pairs,
900
                                    vector<StringPiece>* cols);
901
902
// ----------------------------------------------------------------------
903
// DEPRECATED(jgm): See the "NEW API" comment about this function below for
904
// example code showing an alternative.
905
//
906
// SplitStringIntoKeyValues()
907
// Split a line into a key string and a vector of value strings. The line has
908
// the following format:
909
//
910
// <key><kvsep>+<vvsep>*<value1><vvsep>+<value2><vvsep>+<value3>...<vvsep>*
911
//
912
// where key and value are strings; */+ means zero/one or more; <kvsep> is
913
// a delimiter character to separate key and value; and <vvsep> is a delimiter
914
// character to separate between values. The user can specify a bunch of
915
// delimiter characters using a string. For example, if the user specifies
916
// the separator string as "\t ", then either ' ' or '\t' or any combination
917
// of them wil be treated as separator. For <vvsep>, the user can specify a
918
// empty string to indicate there is only one value.
919
//
920
// Note: this function assumes the input string begins exactly with a
921
// key. Therefore, if you use whitespaces to separate key and value, you
922
// should not let whitespace precedes the key in the input. Otherwise, you
923
// will get an empty string as the key.
924
//
925
// A line with no <kvsep> will return an empty string as the key, even if
926
// <key> is non-empty!
927
//
928
// The syntax makes it impossible for a value to be the empty string.
929
// It is possible for the number of values to be zero.
930
//
931
// Returns false if the line has no <kvsep> or if the number of values is
932
// zero.
933
//
934
// ==> NEW API: Consider using the new Split API defined above. <==
935
//
936
// The SplitStringIntoKeyValues() function has some subtle and surprising
937
// semantics in various corner cases. To avoid this the strings::Split API is
938
// recommended. The following example shows how to split a string of delimited
939
// key-value pairs into a vector of pairs using the strings::Split API.
940
//
941
//   using strings::Split;
942
//   using strings::delimiter::AnyOf;
943
//   using strings::delimiter::Limit;
944
//
945
//   pair<string, StringPiece> key_values =
946
//       Split(line, Limit(AnyOf(kv_delim), 1));
947
//   string key = key_values.first;
948
//   vector<string> values = Split(key_values.second, AnyOf(vv_delim));
949
//
950
// ----------------------------------------------------------------------
951
bool SplitStringIntoKeyValues(const string& line, const string& key_value_delimiters,
952
                              const string& value_value_delimiters, string* key,
953
                              vector<string>* values);
954
955
// ----------------------------------------------------------------------
956
// SplitStringIntoKeyValuePairs()
957
// Split a line into a vector of <key, value> pairs. The line has
958
// the following format:
959
//
960
// <kvpsep>*<key1><kvsep>+<value1><kvpsep>+<key2><kvsep>+<value2>...<kvpsep>*
961
//
962
// Where key and value are strings; */+ means zero/one or more. <kvsep> is
963
// a delimiter character to separate key and value and <kvpsep> is a delimiter
964
// character to separate key value pairs. The user can specify a bunch of
965
// delimiter characters using a string.
966
//
967
// Note: this function assumes each key-value pair begins exactly with a
968
// key. Therefore, if you use whitespaces to separate key and value, you
969
// should not let whitespace precede the key in the pair. Otherwise, you
970
// will get an empty string as the key.
971
//
972
// A pair with no <kvsep> will return empty strings as the key and value,
973
// even if <key> is non-empty!
974
//
975
// Returns false for pairs with no <kvsep> specified and for pairs with
976
// empty strings as values.
977
//
978
// ==> NEW API: Consider using the new Split API defined above. <==
979
//
980
// The SplitStringIntoKeyValuePairs() function has some subtle and surprising
981
// semantics in various corner cases. To avoid this the strings::Split API is
982
// recommended. The following example shows how to split a string of delimited
983
// key-value pairs into a vector of pairs using the strings::Split API.
984
//
985
//   using strings::SkipEmpty;
986
//   using strings::Split;
987
//   using strings::delimiter::AnyOf;
988
//   using strings::delimiter::Limit;
989
//
990
//   vector<pair<string, string>> pairs;  // or even map<string, string>
991
//   for (StringPiece sp : Split(line, AnyOf(pair_delim), SkipEmpty())) {
992
//     pairs.push_back(Split(sp, Limit(AnyOf(kv_delim), 1), SkipEmpty()));
993
//   }
994
//
995
// ----------------------------------------------------------------------
996
bool SplitStringIntoKeyValuePairs(const string& line, const string& key_value_delimiters,
997
                                  const string& key_value_pair_delimiters,
998
                                  vector<pair<string, string>>* kv_pairs);
999
1000
// ----------------------------------------------------------------------
1001
// SplitLeadingDec32Values()
1002
// SplitLeadingDec64Values()
1003
//    A simple parser for space-separated decimal int32/int64 values.
1004
//    Appends parsed integers to the end of the result vector, stopping
1005
//    at the first unparsable spot.  Skips past leading and repeated
1006
//    whitespace (does not consume trailing whitespace), and returns
1007
//    a pointer beyond the last character parsed.
1008
// --------------------------------------------------------------------
1009
const char* SplitLeadingDec32Values(const char* next, vector<int32>* result);
1010
const char* SplitLeadingDec64Values(const char* next, vector<int64>* result);
1011
1012
// ----------------------------------------------------------------------
1013
// SplitOneIntToken()
1014
// SplitOneInt32Token()
1015
// SplitOneUint32Token()
1016
// SplitOneInt64Token()
1017
// SplitOneUint64Token()
1018
// SplitOneDoubleToken()
1019
// SplitOneFloatToken()
1020
//   Parse a single "delim" delimited number from "*source" into "*value".
1021
//   Modify *source to point after the delimiter.
1022
//   If no delimiter is present after the number, set *source to NULL.
1023
//
1024
//   If the start of *source is not an number, return false.
1025
//   If the int is followed by the null character, return true.
1026
//   If the int is not followed by a character from delim, return false.
1027
//   If *source is NULL, return false.
1028
//
1029
//   They cannot handle decimal numbers with leading 0s, since they will be
1030
//   treated as octal.
1031
// ----------------------------------------------------------------------
1032
bool SplitOneIntToken(const char** source, const char* delim, int* value);
1033
bool SplitOneInt32Token(const char** source, const char* delim, int32* value);
1034
bool SplitOneUint32Token(const char** source, const char* delim, uint32* value);
1035
bool SplitOneInt64Token(const char** source, const char* delim, int64* value);
1036
bool SplitOneUint64Token(const char** source, const char* delim, uint64* value);
1037
bool SplitOneDoubleToken(const char** source, const char* delim, double* value);
1038
bool SplitOneFloatToken(const char** source, const char* delim, float* value);
1039
1040
// Some aliases, so that the function names are standardized against the names
1041
// of the reflection setters/getters in proto2. This makes it easier to use
1042
// certain macros with reflection when creating custom text formats for protos.
1043
1044
0
inline bool SplitOneUInt32Token(const char** source, const char* delim, uint32* value) {
1045
0
    return SplitOneUint32Token(source, delim, value);
1046
0
}
1047
1048
0
inline bool SplitOneUInt64Token(const char** source, const char* delim, uint64* value) {
1049
0
    return SplitOneUint64Token(source, delim, value);
1050
0
}
1051
1052
// ----------------------------------------------------------------------
1053
// SplitOneDecimalIntToken()
1054
// SplitOneDecimalInt32Token()
1055
// SplitOneDecimalUint32Token()
1056
// SplitOneDecimalInt64Token()
1057
// SplitOneDecimalUint64Token()
1058
// Parse a single "delim"-delimited number from "*source" into "*value".
1059
// Unlike SplitOneIntToken, etc., this function always interprets
1060
// the numbers as decimal.
1061
bool SplitOneDecimalIntToken(const char** source, const char* delim, int* value);
1062
bool SplitOneDecimalInt32Token(const char** source, const char* delim, int32* value);
1063
bool SplitOneDecimalUint32Token(const char** source, const char* delim, uint32* value);
1064
bool SplitOneDecimalInt64Token(const char** source, const char* delim, int64* value);
1065
bool SplitOneDecimalUint64Token(const char** source, const char* delim, uint64* value);
1066
1067
// ----------------------------------------------------------------------
1068
// SplitOneHexUint32Token()
1069
// SplitOneHexUint64Token()
1070
// Once more, for hexadecimal numbers (unsigned only).
1071
bool SplitOneHexUint32Token(const char** source, const char* delim, uint32* value);
1072
bool SplitOneHexUint64Token(const char** source, const char* delim, uint64* value);
1073
1074
// ###################### TEMPLATE INSTANTIATIONS BELOW #######################
1075
1076
// SplitStringAndParse() -- see description above
1077
template <class T>
1078
bool SplitStringAndParse(StringPiece source, StringPiece delim,
1079
0
                         bool (*parse)(const string& str, T* value), vector<T>* result) {
1080
0
    return SplitStringAndParseToList(source, delim, parse, result);
1081
0
}
1082
1083
namespace strings {
1084
namespace internal {
1085
1086
template <class Container, class InsertPolicy>
1087
bool SplitStringAndParseToInserter(StringPiece source, StringPiece delim,
1088
                                   bool (*parse)(const string& str,
1089
                                                 typename Container::value_type* value),
1090
0
                                   Container* result, InsertPolicy insert_policy) {
1091
0
    CHECK(NULL != parse);
1092
0
    CHECK(NULL != result);
1093
0
    CHECK(NULL != delim.data());
1094
0
    CHECK_GT(delim.size(), 0);
1095
0
    bool retval = true;
1096
0
    vector<StringPiece> pieces =
1097
0
            strings::Split(source, strings::delimiter::AnyOf(delim), strings::SkipEmpty());
1098
0
    for (const auto& piece : pieces) {
1099
0
        typename Container::value_type t;
1100
0
        if (parse(piece.as_string(), &t)) {
1101
0
            insert_policy(result, t);
1102
0
        } else {
1103
0
            retval = false;
1104
0
        }
1105
0
    }
1106
0
    return retval;
1107
0
}
1108
1109
// Cannot use output iterator here (e.g. std::inserter, std::back_inserter)
1110
// because some callers use non-standard containers that don't have iterators,
1111
// only an insert() or push_back() method.
1112
struct BasicInsertPolicy {
1113
    template <class C, class V>
1114
    void operator()(C* c, const V& v) const {
1115
        c->insert(v);
1116
    }
1117
};
1118
1119
struct BackInsertPolicy {
1120
    template <class C, class V>
1121
0
    void operator()(C* c, const V& v) const {
1122
0
        c->push_back(v);
1123
0
    }
1124
};
1125
1126
} // namespace internal
1127
} // namespace strings
1128
1129
// SplitStringAndParseToContainer() -- see description above
1130
template <class Container>
1131
bool SplitStringAndParseToContainer(StringPiece source, StringPiece delim,
1132
                                    bool (*parse)(const string& str,
1133
                                                  typename Container::value_type* value),
1134
                                    Container* result) {
1135
    return strings::internal::SplitStringAndParseToInserter(source, delim, parse, result,
1136
                                                            strings::internal::BasicInsertPolicy());
1137
}
1138
1139
// SplitStringAndParseToList() -- see description above
1140
template <class List>
1141
bool SplitStringAndParseToList(StringPiece source, StringPiece delim,
1142
                               bool (*parse)(const string& str, typename List::value_type* value),
1143
0
                               List* result) {
1144
0
    return strings::internal::SplitStringAndParseToInserter(source, delim, parse, result,
1145
0
                                                            strings::internal::BackInsertPolicy());
1146
0
}
1147
1148
// END DOXYGEN SplitFunctions grouping
1149
/* @} */