29 #ifndef ABSL_STRINGS_INTERNAL_STR_SPLIT_INTERNAL_H_
30 #define ABSL_STRINGS_INTERNAL_STR_SPLIT_INTERNAL_H_
33 #include <initializer_list>
36 #include <type_traits>
40 #include "absl/base/macros.h"
41 #include "absl/base/port.h"
42 #include "absl/meta/type_traits.h"
43 #include "absl/strings/string_view.h"
46 #include "absl/strings/internal/stl_type_traits.h"
47 #endif // _GLIBCXX_DEBUG
51 namespace strings_internal {
83 template <
typename Splitter>
148 return a.state_ ==
b.state_ &&
a.pos_ ==
b.pos_;
165 template <
typename T,
typename =
void>
167 template <
typename T>
172 template <
typename T,
typename =
void>
174 template <
typename T>
179 template <
typename T,
typename =
void>
181 template <
typename T>
186 template <
typename T,
typename =
void>
188 template <
typename T>
195 template <
typename T>
197 template <
typename T>
199 : decltype(IsInitializerListDispatch(static_cast<T*>(nullptr))) {};
211 template <
typename C,
bool has_value_type,
bool has_mapped_type>
214 template <
typename C>
216 : std::is_constructible<typename C::value_type, absl::string_view> {};
218 template <
typename C>
221 std::is_constructible<typename C::key_type, absl::string_view>,
222 std::is_constructible<typename C::mapped_type, absl::string_view>> {};
224 template <
typename C>
228 #ifdef _GLIBCXX_DEBUG
229 !IsStrictlyBaseOfAndConvertibleToSTLContainer<C>::value &&
232 typename std::remove_reference<C>::type>::value &&
233 HasValueType<C>::value && HasConstIterator<C>::value,
234 HasMappedType<C>::value> {
258 template <
typename Delimiter,
typename Predicate,
typename StringType>
283 template <
typename Container,
284 typename =
typename std::enable_if<
286 operator Container()
const {
295 template <
typename First,
typename Second>
296 operator std::pair<First, Second>()
const {
316 template <
typename Container,
typename ValueType,
bool is_map = false>
320 auto it = std::inserter(c, c.end());
321 for (
const auto& sp : splitter) {
333 template <
typename A>
345 std::vector<absl::string_view, A>
v;
346 std::array<raw_view, 16> ar;
347 for (
auto it = splitter.
begin(); !
it.at_end();) {
353 }
while (++
index != ar.size() && !
it.at_end());
354 v.insert(
v.end(), ar.begin(), ar.begin() +
index);
366 template <
typename A>
369 const std::vector<absl::string_view>
v = splitter;
370 return std::vector<std::string, A>(
v.begin(),
v.end());
380 template <
typename Container,
typename First,
typename Second>
390 it = InsertOrEmplace(&
m, sv);
392 it->second = Second(sv);
401 template <
typename M>
409 template <
typename M>
412 return ToIter(
m->insert(std::make_pair(First(
key), Second(
""))));
430 #endif // ABSL_STRINGS_INTERNAL_STR_SPLIT_INTERNAL_H_