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