Export of internal Abseil changes.
-- 6bab63b2bcdbd768743c2ebcc4a8e19af20c5406 by Abseil Team <absl-team@google.com>: Reformats inlined_vector.h to match the current Google lint rules PiperOrigin-RevId: 202154101 -- 00cdeda6ea24591a9cb8ac8b3c2e2a042e1b15b1 by Gennadiy Rozental <rogeeff@google.com>: Improve SplitterIsConvertibleTo implementation. PiperOrigin-RevId: 202095009 -- 7c24071afac45a17c47e819896f844a36e239bda by Greg Falcon <gfalcon@google.com>: Internal change PiperOrigin-RevId: 201991288 GitOrigin-RevId: 6bab63b2bcdbd768743c2ebcc4a8e19af20c5406 Change-Id: Ic5a988ab39e78247285411f36287cd34d6f5afd3
This commit is contained in:
parent
87a4c07856
commit
7efd8dc0f1
7 changed files with 65 additions and 20 deletions
|
|
@ -486,6 +486,9 @@ cc_test(
|
|||
srcs = [
|
||||
"charconv_benchmark.cc",
|
||||
],
|
||||
tags = [
|
||||
"benchmark",
|
||||
],
|
||||
deps = [
|
||||
":strings",
|
||||
"//absl/base",
|
||||
|
|
|
|||
|
|
@ -228,14 +228,31 @@ struct IsInitializerList
|
|||
// compiled in C++11 will get an error due to ambiguous conversion paths (in
|
||||
// C++11 std::vector<T>::operator= is overloaded to take either a std::vector<T>
|
||||
// or an std::initializer_list<T>).
|
||||
|
||||
template <typename C, bool has_value_type, bool has_mapped_type>
|
||||
struct SplitterIsConvertibleToImpl : std::false_type {};
|
||||
|
||||
template <typename C>
|
||||
struct SplitterIsConvertibleToImpl<C, true, false>
|
||||
: std::is_constructible<typename C::value_type, absl::string_view> {};
|
||||
|
||||
template <typename C>
|
||||
struct SplitterIsConvertibleToImpl<C, true, true>
|
||||
: absl::conjunction<
|
||||
std::is_constructible<typename C::key_type, absl::string_view>,
|
||||
std::is_constructible<typename C::mapped_type, absl::string_view>> {};
|
||||
|
||||
template <typename C>
|
||||
struct SplitterIsConvertibleTo
|
||||
: std::enable_if<
|
||||
: SplitterIsConvertibleToImpl<
|
||||
C,
|
||||
#ifdef _GLIBCXX_DEBUG
|
||||
!IsStrictlyBaseOfAndConvertibleToSTLContainer<C>::value &&
|
||||
#endif // _GLIBCXX_DEBUG
|
||||
!IsInitializerList<C>::value && HasValueType<C>::value &&
|
||||
HasConstIterator<C>::value> {
|
||||
!IsInitializerList<
|
||||
typename std::remove_reference<C>::type>::value &&
|
||||
HasValueType<C>::value && HasConstIterator<C>::value,
|
||||
HasMappedType<C>::value> {
|
||||
};
|
||||
|
||||
// This class implements the range that is returned by absl::StrSplit(). This
|
||||
|
|
@ -281,7 +298,8 @@ class Splitter {
|
|||
// An implicit conversion operator that is restricted to only those containers
|
||||
// that the splitter is convertible to.
|
||||
template <typename Container,
|
||||
typename OnlyIf = typename SplitterIsConvertibleTo<Container>::type>
|
||||
typename = typename std::enable_if<
|
||||
SplitterIsConvertibleTo<Container>::value>::type>
|
||||
operator Container() const { // NOLINT(runtime/explicit)
|
||||
return ConvertToContainer<Container, typename Container::value_type,
|
||||
HasMappedType<Container>::value>()(*this);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,34 @@ using ::testing::ElementsAre;
|
|||
using ::testing::Pair;
|
||||
using ::testing::UnorderedElementsAre;
|
||||
|
||||
TEST(Split, TraitsTest) {
|
||||
static_assert(!absl::strings_internal::SplitterIsConvertibleTo<int>::value,
|
||||
"");
|
||||
static_assert(!absl::strings_internal::SplitterIsConvertibleTo<std::string>::value,
|
||||
"");
|
||||
static_assert(absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::vector<std::string>>::value,
|
||||
"");
|
||||
static_assert(
|
||||
!absl::strings_internal::SplitterIsConvertibleTo<std::vector<int>>::value,
|
||||
"");
|
||||
static_assert(absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::vector<absl::string_view>>::value,
|
||||
"");
|
||||
static_assert(absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::map<std::string, std::string>>::value,
|
||||
"");
|
||||
static_assert(absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::map<absl::string_view, absl::string_view>>::value,
|
||||
"");
|
||||
static_assert(!absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::map<int, std::string>>::value,
|
||||
"");
|
||||
static_assert(!absl::strings_internal::SplitterIsConvertibleTo<
|
||||
std::map<std::string, int>>::value,
|
||||
"");
|
||||
}
|
||||
|
||||
// This tests the overall split API, which is made up of the absl::StrSplit()
|
||||
// function and the Delimiter objects in the absl:: namespace.
|
||||
// This TEST macro is outside of any namespace to require full specification of
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue