32 #ifndef ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_
33 #define ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_
35 #include <initializer_list>
37 #include <type_traits>
40 #include "absl/utility/utility.h"
42 #if defined(_MSC_VER) && !defined(__NVCC__)
45 #define ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC __declspec(empty_bases)
47 #define ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC
52 namespace container_internal {
54 template <
typename... Ts>
57 namespace internal_compressed_tuple {
59 template <
typename D,
size_t I>
61 template <
typename... B,
size_t I>
63 : std::tuple_element<I, std::tuple<B...>> {};
64 template <
typename D,
size_t I>
73 #if defined(__clang__) || defined(__GNUC__)
96 template <
typename T,
size_t I,
101 bool UseBase = ShouldUseBase<T>()>
106 template <
typename V>
115 template <
typename T,
size_t I>
119 template <
typename V>
129 template <
typename D,
typename I,
bool ShouldAnyUseBase>
140 Storage<Ts, std::integral_constant<size_t, I>::value>... {
142 template <
typename... Vs>
148 template <
typename... Ts,
size_t...
I>
152 :
Storage<Ts, std::integral_constant<size_t, I>::value, false>... {
154 template <
typename... Vs>
165 template <
typename... Ts>
168 Or({std::integral_constant<bool, ShouldUseBase<Ts>()>()...})){};
171 template <
typename T,
typename V>
174 std::is_convertible<V, T>,
177 template <
bool SizeMatches,
class T,
class... Vs>
180 template <
class... Ts,
class... Vs>
182 : std::integral_constant<
183 bool, absl::conjunction<
184 TupleElementMoveConstructible<Ts, Vs&&>...>::value> {};
186 template <
typename T>
189 template <
typename... Es>
191 :
public std::integral_constant<std::size_t, sizeof...(Es)> {};
193 template <
class T,
class... Vs>
195 : std::integral_constant<
196 bool, TupleMoveConstructible<compressed_tuple_size<T>::value ==
198 T, Vs...>::value> {};
220 template <
typename... Ts>
223 CompressedTuple<Ts...>, absl::index_sequence_for<Ts...>,
224 internal_compressed_tuple::ShouldAnyUseBase<Ts...>()> {
236 #if defined(_MSC_VER)
244 template <
typename First,
typename... Vs,
270 return std::move(*this).StorageT<I>::get();
288 #undef ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC
290 #endif // ABSL_CONTAINER_INTERNAL_COMPRESSED_TUPLE_H_