OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_TEMPLATE_UTIL_H_ | 5 #ifndef BASE_TEMPLATE_UTIL_H_ |
6 #define BASE_TEMPLATE_UTIL_H_ | 6 #define BASE_TEMPLATE_UTIL_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 #include <type_traits> | 10 #include <type_traits> |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #if !defined(__clang__) && defined(_LIBCPP_VERSION) | 44 #if !defined(__clang__) && defined(_LIBCPP_VERSION) |
45 #define CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX | 45 #define CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX |
46 #endif | 46 #endif |
47 | 47 |
48 namespace base { | 48 namespace base { |
49 | 49 |
50 template <class T> struct is_non_const_reference : std::false_type {}; | 50 template <class T> struct is_non_const_reference : std::false_type {}; |
51 template <class T> struct is_non_const_reference<T&> : std::true_type {}; | 51 template <class T> struct is_non_const_reference<T&> : std::true_type {}; |
52 template <class T> struct is_non_const_reference<const T&> : std::false_type {}; | 52 template <class T> struct is_non_const_reference<const T&> : std::false_type {}; |
53 | 53 |
54 // is_assignable | |
55 | |
56 namespace internal { | 54 namespace internal { |
57 | 55 |
58 template <typename First, typename Second> | |
59 struct SelectSecond { | |
60 using type = Second; | |
61 }; | |
62 | |
63 struct Any { | |
64 Any(...); | |
65 }; | |
66 | |
67 // True case: If |Lvalue| can be assigned to from |Rvalue|, then the return | |
68 // value is a true_type. | |
69 template <class Lvalue, class Rvalue> | |
70 typename internal::SelectSecond< | |
71 decltype((std::declval<Lvalue>() = std::declval<Rvalue>())), | |
72 std::true_type>::type | |
73 IsAssignableTest(Lvalue&&, Rvalue&&); | |
74 | |
75 // False case: Otherwise the return value is a false_type. | |
76 template <class Rvalue> | |
77 std::false_type IsAssignableTest(internal::Any, Rvalue&&); | |
78 | |
79 // Default case: Neither Lvalue nor Rvalue is void. Uses IsAssignableTest to | |
80 // determine the type of IsAssignableImpl. | |
81 template <class Lvalue, | |
82 class Rvalue, | |
83 bool = std::is_void<Lvalue>::value || std::is_void<Rvalue>::value> | |
84 struct IsAssignableImpl | |
85 : public std::common_type<decltype( | |
86 internal::IsAssignableTest(std::declval<Lvalue>(), | |
87 std::declval<Rvalue>()))>::type {}; | |
88 | |
89 // Void case: Either Lvalue or Rvalue is void. Then the type of IsAssignableTest | |
90 // is false_type. | |
91 template <class Lvalue, class Rvalue> | |
92 struct IsAssignableImpl<Lvalue, Rvalue, true> : public std::false_type {}; | |
93 | |
94 // Uses expression SFINAE to detect whether using operator<< would work. | 56 // Uses expression SFINAE to detect whether using operator<< would work. |
95 template <typename T, typename = void> | 57 template <typename T, typename = void> |
96 struct SupportsOstreamOperator : std::false_type {}; | 58 struct SupportsOstreamOperator : std::false_type {}; |
97 template <typename T> | 59 template <typename T> |
98 struct SupportsOstreamOperator<T, | 60 struct SupportsOstreamOperator<T, |
99 decltype(void(std::declval<std::ostream&>() | 61 decltype(void(std::declval<std::ostream&>() |
100 << std::declval<T>()))> | 62 << std::declval<T>()))> |
101 : std::true_type {}; | 63 : std::true_type {}; |
102 | 64 |
103 } // namespace internal | 65 } // namespace internal |
104 | 66 |
105 // TODO(crbug.com/554293): Remove this when all platforms have this in the std | |
106 // namespace. | |
107 template <class Lvalue, class Rvalue> | |
108 struct is_assignable : public internal::IsAssignableImpl<Lvalue, Rvalue> {}; | |
109 | |
110 // is_copy_assignable is true if a T const& is assignable to a T&. | |
111 // TODO(crbug.com/554293): Remove this when all platforms have this in the std | |
112 // namespace. | |
113 template <class T> | |
114 struct is_copy_assignable | |
115 : public is_assignable<typename std::add_lvalue_reference<T>::type, | |
116 typename std::add_lvalue_reference< | |
117 typename std::add_const<T>::type>::type> {}; | |
118 | |
119 // is_move_assignable is true if a T&& is assignable to a T&. | |
120 // TODO(crbug.com/554293): Remove this when all platforms have this in the std | |
121 // namespace. | |
122 template <class T> | |
123 struct is_move_assignable | |
124 : public is_assignable<typename std::add_lvalue_reference<T>::type, | |
125 const typename std::add_rvalue_reference<T>::type> { | |
126 }; | |
127 | |
128 // underlying_type produces the integer type backing an enum type. | 67 // underlying_type produces the integer type backing an enum type. |
129 // TODO(crbug.com/554293): Remove this when all platforms have this in the std | 68 // TODO(crbug.com/554293): Remove this when all platforms have this in the std |
130 // namespace. | 69 // namespace. |
131 #if defined(CR_USE_FALLBACKS_FOR_OLD_GLIBCXX) | 70 #if defined(CR_USE_FALLBACKS_FOR_OLD_GLIBCXX) |
132 template <typename T> | 71 template <typename T> |
133 struct underlying_type { | 72 struct underlying_type { |
134 using type = __underlying_type(T); | 73 using type = __underlying_type(T); |
135 }; | 74 }; |
136 #else | 75 #else |
137 template <typename T> | 76 template <typename T> |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 using is_trivially_copyable = std::is_trivially_copyable<T>; | 130 using is_trivially_copyable = std::is_trivially_copyable<T>; |
192 #endif | 131 #endif |
193 | 132 |
194 } // namespace base | 133 } // namespace base |
195 | 134 |
196 #undef CR_USE_FALLBACKS_FOR_OLD_GLIBCXX | 135 #undef CR_USE_FALLBACKS_FOR_OLD_GLIBCXX |
197 #undef CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX | 136 #undef CR_USE_FALLBACKS_FOR_GCC_WITH_LIBCXX |
198 #undef CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX | 137 #undef CR_USE_FALLBACKS_FOR_OLD_EXPERIMENTAL_GLIBCXX |
199 | 138 |
200 #endif // BASE_TEMPLATE_UTIL_H_ | 139 #endif // BASE_TEMPLATE_UTIL_H_ |
OLD | NEW |