Add std::variant specializations for IsOwner and IsView Fixes: #1960 PiperOrigin-RevId: 951038585 Change-Id: I73cf69baf577289e80bff20bd151c0e452de074b
diff --git a/absl/meta/type_traits.h b/absl/meta/type_traits.h index d12300f..be55e52 100644 --- a/absl/meta/type_traits.h +++ b/absl/meta/type_traits.h
@@ -41,7 +41,6 @@ #include <string_view> #include <type_traits> #include <utility> -#include <variant> #include <vector> #include "absl/base/attributes.h" @@ -584,14 +583,6 @@ template <typename T, typename Alloc> struct IsOwner<std::vector<T, Alloc>> : std::true_type {}; -template <typename... T> -struct IsOwner<std::variant<T...>> - : std::bool_constant<(sizeof...(T) > 0) && - // Uses a C++17 fold expression where '...' unpacks the - // parameter pack T, and 'true &&' provides the base - // case for the logical AND operation across all types. - (true && ... && IsOwner<T>::value)> {}; - // Detects if a class's definition has declared itself to be a view by declaring // using absl_internal_is_view = std::true_type; // as a member. @@ -629,14 +620,6 @@ template <typename Char, typename Traits> struct IsView<std::basic_string_view<Char, Traits>> : std::true_type {}; -template <typename... T> -struct IsView<std::variant<T...>> - : std::bool_constant<(sizeof...(T) > 0) && - // Uses a C++17 fold expression where '...' unpacks the - // parameter pack T, and 'true &&' provides the base - // case for the logical AND operation across all types. - (true && ... && IsView<T>::value)> {}; - #ifdef __cpp_lib_span template <typename T> struct IsView<std::span<T>> : std::true_type {};
diff --git a/absl/meta/type_traits_test.cc b/absl/meta/type_traits_test.cc index 8e5f90d..9734fc1 100644 --- a/absl/meta/type_traits_test.cc +++ b/absl/meta/type_traits_test.cc
@@ -19,7 +19,6 @@ #include <string_view> #include <type_traits> #include <utility> -#include <variant> #include <vector> #include "gtest/gtest.h" @@ -33,11 +32,6 @@ using ::testing::StaticAssertTypeEq; template <typename T> -using IsViewAndNotOwner = - std::conjunction<absl::type_traits_internal::IsView<T>, - std::negation<absl::type_traits_internal::IsOwner<T>>>; - -template <typename T> using IsOwnerAndNotView = std::conjunction<absl::type_traits_internal::IsOwner<T>, std::negation<absl::type_traits_internal::IsView<T>>>; @@ -56,23 +50,6 @@ static_assert(!IsOwnerAndNotView<std::wstring_view>::value, "wstring_view is a view, not an owner"); -static_assert(!IsOwnerAndNotView<std::variant<>>::value, - "empty variant is not an owner"); -static_assert(!IsViewAndNotOwner<std::variant<>>::value, - "empty variant is not a view"); - -static_assert(IsOwnerAndNotView<std::variant<std::string, std::vector<char>, - std::vector<int>>>::value, - "aggregate of owners is an owner"); -static_assert( - IsViewAndNotOwner<std::variant<std::wstring_view, std::string_view>>::value, - "aggregate of views is an view"); - -static_assert(!IsOwnerAndNotView<std::variant<const char*, std::string>>::value, - "variant of mixed-ownership types is not considered an owner"); -static_assert(!IsViewAndNotOwner<std::variant<const char*, std::string>>::value, - "variant of mixed-ownership types is not considered a view"); - template <class T, class U> struct simple_pair { T first;