xref: /aosp_15_r20/external/libchrome/base/strings/string_split.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_STRINGS_STRING_SPLIT_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_STRINGS_STRING_SPLIT_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <string>
9*635a8641SAndroid Build Coastguard Worker #include <utility>
10*635a8641SAndroid Build Coastguard Worker #include <vector>
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/strings/string16.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker enum WhitespaceHandling {
19*635a8641SAndroid Build Coastguard Worker   KEEP_WHITESPACE,
20*635a8641SAndroid Build Coastguard Worker   TRIM_WHITESPACE,
21*635a8641SAndroid Build Coastguard Worker };
22*635a8641SAndroid Build Coastguard Worker 
23*635a8641SAndroid Build Coastguard Worker enum SplitResult {
24*635a8641SAndroid Build Coastguard Worker   // Strictly return all results.
25*635a8641SAndroid Build Coastguard Worker   //
26*635a8641SAndroid Build Coastguard Worker   // If the input is ",," and the separator is ',' this will return a
27*635a8641SAndroid Build Coastguard Worker   // vector of three empty strings.
28*635a8641SAndroid Build Coastguard Worker   SPLIT_WANT_ALL,
29*635a8641SAndroid Build Coastguard Worker 
30*635a8641SAndroid Build Coastguard Worker   // Only nonempty results will be added to the results. Multiple separators
31*635a8641SAndroid Build Coastguard Worker   // will be coalesced. Separators at the beginning and end of the input will
32*635a8641SAndroid Build Coastguard Worker   // be ignored. With TRIM_WHITESPACE, whitespace-only results will be dropped.
33*635a8641SAndroid Build Coastguard Worker   //
34*635a8641SAndroid Build Coastguard Worker   // If the input is ",," and the separator is ',', this will return an empty
35*635a8641SAndroid Build Coastguard Worker   // vector.
36*635a8641SAndroid Build Coastguard Worker   SPLIT_WANT_NONEMPTY,
37*635a8641SAndroid Build Coastguard Worker };
38*635a8641SAndroid Build Coastguard Worker 
39*635a8641SAndroid Build Coastguard Worker // Split the given string on ANY of the given separators, returning copies of
40*635a8641SAndroid Build Coastguard Worker // the result.
41*635a8641SAndroid Build Coastguard Worker //
42*635a8641SAndroid Build Coastguard Worker // To split on either commas or semicolons, keeping all whitespace:
43*635a8641SAndroid Build Coastguard Worker //
44*635a8641SAndroid Build Coastguard Worker //   std::vector<std::string> tokens = base::SplitString(
45*635a8641SAndroid Build Coastguard Worker //       input, ",;", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
46*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<std::string> SplitString(
47*635a8641SAndroid Build Coastguard Worker     StringPiece input,
48*635a8641SAndroid Build Coastguard Worker     StringPiece separators,
49*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
50*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
51*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<string16> SplitString(
52*635a8641SAndroid Build Coastguard Worker     StringPiece16 input,
53*635a8641SAndroid Build Coastguard Worker     StringPiece16 separators,
54*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
55*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
56*635a8641SAndroid Build Coastguard Worker 
57*635a8641SAndroid Build Coastguard Worker // Like SplitString above except it returns a vector of StringPieces which
58*635a8641SAndroid Build Coastguard Worker // reference the original buffer without copying. Although you have to be
59*635a8641SAndroid Build Coastguard Worker // careful to keep the original string unmodified, this provides an efficient
60*635a8641SAndroid Build Coastguard Worker // way to iterate through tokens in a string.
61*635a8641SAndroid Build Coastguard Worker //
62*635a8641SAndroid Build Coastguard Worker // To iterate through all whitespace-separated tokens in an input string:
63*635a8641SAndroid Build Coastguard Worker //
64*635a8641SAndroid Build Coastguard Worker //   for (const auto& cur :
65*635a8641SAndroid Build Coastguard Worker //        base::SplitStringPiece(input, base::kWhitespaceASCII,
66*635a8641SAndroid Build Coastguard Worker //                               base::KEEP_WHITESPACE,
67*635a8641SAndroid Build Coastguard Worker //                               base::SPLIT_WANT_NONEMPTY)) {
68*635a8641SAndroid Build Coastguard Worker //     ...
69*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<StringPiece> SplitStringPiece(
70*635a8641SAndroid Build Coastguard Worker     StringPiece input,
71*635a8641SAndroid Build Coastguard Worker     StringPiece separators,
72*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
73*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
74*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<StringPiece16> SplitStringPiece(
75*635a8641SAndroid Build Coastguard Worker     StringPiece16 input,
76*635a8641SAndroid Build Coastguard Worker     StringPiece16 separators,
77*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
78*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
79*635a8641SAndroid Build Coastguard Worker 
80*635a8641SAndroid Build Coastguard Worker using StringPairs = std::vector<std::pair<std::string, std::string>>;
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker // Splits |line| into key value pairs according to the given delimiters and
83*635a8641SAndroid Build Coastguard Worker // removes whitespace leading each key and trailing each value. Returns true
84*635a8641SAndroid Build Coastguard Worker // only if each pair has a non-empty key and value. |key_value_pairs| will
85*635a8641SAndroid Build Coastguard Worker // include ("","") pairs for entries without |key_value_delimiter|.
86*635a8641SAndroid Build Coastguard Worker BASE_EXPORT bool SplitStringIntoKeyValuePairs(StringPiece input,
87*635a8641SAndroid Build Coastguard Worker                                               char key_value_delimiter,
88*635a8641SAndroid Build Coastguard Worker                                               char key_value_pair_delimiter,
89*635a8641SAndroid Build Coastguard Worker                                               StringPairs* key_value_pairs);
90*635a8641SAndroid Build Coastguard Worker 
91*635a8641SAndroid Build Coastguard Worker // Similar to SplitString, but use a substring delimiter instead of a list of
92*635a8641SAndroid Build Coastguard Worker // characters that are all possible delimiters.
93*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<string16> SplitStringUsingSubstr(
94*635a8641SAndroid Build Coastguard Worker     StringPiece16 input,
95*635a8641SAndroid Build Coastguard Worker     StringPiece16 delimiter,
96*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
97*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
98*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<std::string> SplitStringUsingSubstr(
99*635a8641SAndroid Build Coastguard Worker     StringPiece input,
100*635a8641SAndroid Build Coastguard Worker     StringPiece delimiter,
101*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
102*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
103*635a8641SAndroid Build Coastguard Worker 
104*635a8641SAndroid Build Coastguard Worker // Like SplitStringUsingSubstr above except it returns a vector of StringPieces
105*635a8641SAndroid Build Coastguard Worker // which reference the original buffer without copying. Although you have to be
106*635a8641SAndroid Build Coastguard Worker // careful to keep the original string unmodified, this provides an efficient
107*635a8641SAndroid Build Coastguard Worker // way to iterate through tokens in a string.
108*635a8641SAndroid Build Coastguard Worker //
109*635a8641SAndroid Build Coastguard Worker // To iterate through all newline-separated tokens in an input string:
110*635a8641SAndroid Build Coastguard Worker //
111*635a8641SAndroid Build Coastguard Worker //   for (const auto& cur :
112*635a8641SAndroid Build Coastguard Worker //        base::SplitStringUsingSubstr(input, "\r\n",
113*635a8641SAndroid Build Coastguard Worker //                                     base::KEEP_WHITESPACE,
114*635a8641SAndroid Build Coastguard Worker //                                     base::SPLIT_WANT_NONEMPTY)) {
115*635a8641SAndroid Build Coastguard Worker //     ...
116*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<StringPiece16> SplitStringPieceUsingSubstr(
117*635a8641SAndroid Build Coastguard Worker     StringPiece16 input,
118*635a8641SAndroid Build Coastguard Worker     StringPiece16 delimiter,
119*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
120*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
121*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::vector<StringPiece> SplitStringPieceUsingSubstr(
122*635a8641SAndroid Build Coastguard Worker     StringPiece input,
123*635a8641SAndroid Build Coastguard Worker     StringPiece delimiter,
124*635a8641SAndroid Build Coastguard Worker     WhitespaceHandling whitespace,
125*635a8641SAndroid Build Coastguard Worker     SplitResult result_type);
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker }  // namespace base
128*635a8641SAndroid Build Coastguard Worker 
129*635a8641SAndroid Build Coastguard Worker #endif  // BASE_STRINGS_STRING_SPLIT_H_
130