stl_type_traits.h
Go to the documentation of this file.
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 
16 // Thie file provides the IsStrictlyBaseOfAndConvertibleToSTLContainer type
17 // trait metafunction to assist in working with the _GLIBCXX_DEBUG debug
18 // wrappers of STL containers.
19 //
20 // DO NOT INCLUDE THIS FILE DIRECTLY. Use this file by including
21 // absl/strings/str_split.h.
22 //
23 // IWYU pragma: private, include "absl/strings/str_split.h"
24 
25 #ifndef ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_
26 #define ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_
27 
28 #include <array>
29 #include <bitset>
30 #include <deque>
31 #include <forward_list>
32 #include <list>
33 #include <map>
34 #include <set>
35 #include <type_traits>
36 #include <unordered_map>
37 #include <unordered_set>
38 #include <vector>
39 
40 #include "absl/meta/type_traits.h"
41 
42 namespace absl {
43 namespace strings_internal {
44 
45 template <typename C, template <typename...> class T>
46 struct IsSpecializationImpl : std::false_type {};
47 template <template <typename...> class T, typename... Args>
48 struct IsSpecializationImpl<T<Args...>, T> : std::true_type {};
49 template <typename C, template <typename...> class T>
51 
52 template <typename C>
53 struct IsArrayImpl : std::false_type {};
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>> {};
56 template <typename C>
58 
59 template <typename C>
60 struct IsBitsetImpl : std::false_type {};
61 template <template <size_t> class B, size_t N>
62 struct IsBitsetImpl<B<N>> : std::is_same<B<N>, std::bitset<N>> {};
63 template <typename C>
65 
66 template <typename C>
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>> {};
79 
80 template <typename C, template <typename...> class T, typename = void>
81 struct IsBaseOfSpecializationImpl : std::false_type {};
82 // IsBaseOfSpecializationImpl needs multiple partial specializations to SFINAE
83 // on the existence of container dependent types and plug them into the STL
84 // template.
85 template <typename C, template <typename, typename> class T>
87  C, T, absl::void_t<typename C::value_type, typename C::allocator_type>>
88  : std::is_base_of<C,
89  T<typename C::value_type, typename C::allocator_type>> {};
90 template <typename C, template <typename, typename, typename> class T>
92  C, 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>
99  C, T,
100  absl::void_t<typename C::key_type, typename C::mapped_type,
101  typename C::key_compare, typename C::allocator_type>>
102  : std::is_base_of<C,
103  T<typename C::key_type, typename C::mapped_type,
104  typename C::key_compare, typename C::allocator_type>> {
105 };
106 template <typename C, template <typename, typename, typename, typename> class T>
108  C, 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>> {
113 };
114 template <typename C,
115  template <typename, typename, typename, typename, typename> class T>
117  C, 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>
126 
127 template <typename C>
128 struct IsBaseOfArrayImpl : std::false_type {};
129 template <template <typename, size_t> class A, typename T, size_t N>
130 struct IsBaseOfArrayImpl<A<T, N>> : std::is_base_of<A<T, N>, std::array<T, N>> {
131 };
132 template <typename C>
134 
135 template <typename C>
136 struct IsBaseOfBitsetImpl : std::false_type {};
137 template <template <size_t> class B, size_t N>
138 struct IsBaseOfBitsetImpl<B<N>> : std::is_base_of<B<N>, std::bitset<N>> {};
139 template <typename C>
141 
142 template <typename C>
144  : absl::disjunction<IsBaseOfArray<C>, IsBaseOfBitset<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>> {};
157 
158 template <typename C, template <typename...> class T, typename = void>
159 struct IsConvertibleToSpecializationImpl : std::false_type {};
160 // IsConvertibleToSpecializationImpl needs multiple partial specializations to
161 // SFINAE on the existence of container dependent types and plug them into the
162 // STL template.
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>
170  C, 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>
177  C, 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>
185  C, 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>
194  C, 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>
204 
205 template <typename C>
206 struct IsConvertibleToArrayImpl : std::false_type {};
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>
212 
213 template <typename C>
214 struct IsConvertibleToBitsetImpl : std::false_type {};
215 template <template <size_t> class B, size_t N>
217  : std::is_convertible<B<N>, std::bitset<N>> {};
218 template <typename C>
220 
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>> {};
237 
238 template <typename C>
240  : absl::conjunction<absl::negation<IsSTLContainer<C>>,
241  IsBaseOfSTLContainer<C>,
242  IsConvertibleToSTLContainer<C>> {};
243 
244 } // namespace strings_internal
245 } // namespace absl
246 #endif // ABSL_STRINGS_INTERNAL_STL_TYPE_TRAITS_H_
Definition: algorithm.h:29
typename type_traits_internal::VoidTImpl< Ts... >::type void_t
Definition: type_traits.h:171
#define C(x)
Definition: city_test.cc:47


abseil_cpp
Author(s):
autogenerated on Wed Jun 19 2019 19:19:58