25 #ifndef ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_ 26 #define ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_ 31 #include <forward_list> 35 #include <type_traits> 36 #include <unordered_map> 37 #include <unordered_set> 43 namespace strings_internal {
45 template <
typename C,
template <
typename...>
class T>
47 template <
template <
typename...>
class T,
typename... Args>
49 template <
typename C,
template <
typename...>
class T>
54 template <
template <
typename,
size_t>
class A,
typename T,
size_t N>
55 struct IsArrayImpl<A<T, N>> : std::is_same<A<T, N>, std::array<T, N>> {};
61 template <
template <
size_t>
class B,
size_t N>
69 IsArray<C>, IsBitset<C>, IsSpecialization<C, std::deque>,
70 IsSpecialization<C, std::forward_list>,
71 IsSpecialization<C, std::list>, IsSpecialization<C, std::map>,
72 IsSpecialization<C, std::multimap>, IsSpecialization<C, std::set>,
73 IsSpecialization<C, std::multiset>,
74 IsSpecialization<C, std::unordered_map>,
75 IsSpecialization<C, std::unordered_multimap>,
76 IsSpecialization<C, std::unordered_set>,
77 IsSpecialization<C, std::unordered_multiset>,
78 IsSpecialization<C, std::vector>> {};
80 template <
typename C,
template <
typename...>
class T,
typename =
void>
85 template <
typename C,
template <
typename,
typename>
class T>
87 C, T,
absl::
void_t<typename C::value_type, typename C::allocator_type>>
89 T<typename C::value_type, typename C::allocator_type>> {};
90 template <
typename C,
template <
typename,
typename,
typename>
class T>
93 absl::
void_t<typename C::key_type, typename C::key_compare,
94 typename C::allocator_type>>
95 : std::is_base_of<C, T<typename C::key_type, typename C::key_compare,
96 typename C::allocator_type>> {};
97 template <
typename C,
template <
typename,
typename,
typename,
typename>
class T>
100 absl::
void_t<typename C::key_type, typename C::mapped_type,
101 typename C::key_compare, typename C::allocator_type>>
103 T<typename C::key_type, typename C::mapped_type,
104 typename C::key_compare, typename C::allocator_type>> {
106 template <
typename C,
template <
typename,
typename,
typename,
typename>
class T>
109 absl::
void_t<typename C::key_type, typename C::hasher,
110 typename C::key_equal, typename C::allocator_type>>
111 : std::is_base_of<C, T<typename C::key_type, typename C::hasher,
112 typename C::key_equal, typename C::allocator_type>> {
114 template <
typename C,
115 template <
typename,
typename,
typename,
typename,
typename>
class T>
118 absl::
void_t<typename C::key_type, typename C::mapped_type,
119 typename C::hasher, typename C::key_equal,
120 typename C::allocator_type>>
121 : std::is_base_of<C, T<typename C::key_type, typename C::mapped_type,
122 typename C::hasher, typename C::key_equal,
123 typename C::allocator_type>> {};
124 template <
typename C,
template <
typename...>
class T>
127 template <
typename C>
129 template <
template <
typename,
size_t>
class A,
typename T,
size_t N>
132 template <
typename C>
135 template <
typename C>
137 template <
template <
size_t>
class B,
size_t N>
139 template <
typename C>
142 template <
typename C>
145 IsBaseOfSpecialization<C, std::deque>,
146 IsBaseOfSpecialization<C, std::forward_list>,
147 IsBaseOfSpecialization<C, std::list>,
148 IsBaseOfSpecialization<C, std::map>,
149 IsBaseOfSpecialization<C, std::multimap>,
150 IsBaseOfSpecialization<C, std::set>,
151 IsBaseOfSpecialization<C, std::multiset>,
152 IsBaseOfSpecialization<C, std::unordered_map>,
153 IsBaseOfSpecialization<C, std::unordered_multimap>,
154 IsBaseOfSpecialization<C, std::unordered_set>,
155 IsBaseOfSpecialization<C, std::unordered_multiset>,
156 IsBaseOfSpecialization<C, std::vector>> {};
158 template <
typename C,
template <
typename...>
class T,
typename =
void>
163 template <
typename C,
template <
typename,
typename>
class T>
165 C, T, absl::
void_t<typename C::value_type, typename C::allocator_type>>
166 : std::is_convertible<
167 C, T<typename C::value_type, typename C::allocator_type>> {};
168 template <
typename C,
template <
typename,
typename,
typename>
class T>
171 absl::
void_t<typename C::key_type, typename C::key_compare,
172 typename C::allocator_type>>
173 : std::is_convertible<C, T<typename C::key_type, typename C::key_compare,
174 typename C::allocator_type>> {};
175 template <
typename C,
template <
typename,
typename,
typename,
typename>
class T>
178 absl::
void_t<typename C::key_type, typename C::mapped_type,
179 typename C::key_compare, typename C::allocator_type>>
180 : std::is_convertible<
181 C, T<typename C::key_type, typename C::mapped_type,
182 typename C::key_compare, typename C::allocator_type>> {};
183 template <
typename C,
template <
typename,
typename,
typename,
typename>
class T>
186 absl::
void_t<typename C::key_type, typename C::hasher,
187 typename C::key_equal, typename C::allocator_type>>
188 : std::is_convertible<
189 C, T<typename C::key_type, typename C::hasher, typename C::key_equal,
190 typename C::allocator_type>> {};
191 template <
typename C,
192 template <
typename,
typename,
typename,
typename,
typename>
class T>
195 absl::
void_t<typename C::key_type, typename C::mapped_type,
196 typename C::hasher, typename C::key_equal,
197 typename C::allocator_type>>
198 : std::is_convertible<C, T<typename C::key_type, typename C::mapped_type,
199 typename C::hasher, typename C::key_equal,
200 typename C::allocator_type>> {};
201 template <
typename C,
template <
typename...>
class T>
205 template <
typename C>
207 template <
template <
typename,
size_t>
class A,
typename T,
size_t N>
209 : std::is_convertible<A<T, N>, std::array<T, N>> {};
210 template <
typename C>
213 template <
typename C>
215 template <
template <
size_t>
class B,
size_t N>
217 : std::is_convertible<B<N>, std::bitset<N>> {};
218 template <
typename C>
221 template <
typename C>
224 IsConvertibleToArray<C>, IsConvertibleToBitset<C>,
225 IsConvertibleToSpecialization<C, std::deque>,
226 IsConvertibleToSpecialization<C, std::forward_list>,
227 IsConvertibleToSpecialization<C, std::list>,
228 IsConvertibleToSpecialization<C, std::map>,
229 IsConvertibleToSpecialization<C, std::multimap>,
230 IsConvertibleToSpecialization<C, std::set>,
231 IsConvertibleToSpecialization<C, std::multiset>,
232 IsConvertibleToSpecialization<C, std::unordered_map>,
233 IsConvertibleToSpecialization<C, std::unordered_multimap>,
234 IsConvertibleToSpecialization<C, std::unordered_set>,
235 IsConvertibleToSpecialization<C, std::unordered_multiset>,
236 IsConvertibleToSpecialization<C, std::vector>> {};
238 template <
typename C>
241 IsBaseOfSTLContainer<C>,
242 IsConvertibleToSTLContainer<C>> {};
246 #endif // ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_
typename type_traits_internal::VoidTImpl< Ts... >::type void_t