|
|
@ -169,10 +169,34 @@ constexpr bool ShouldAnyUseBase() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template <typename T, typename V> |
|
|
|
template <typename T, typename V> |
|
|
|
using TupleMoveConstructible = typename std::conditional< |
|
|
|
using TupleElementMoveConstructible = |
|
|
|
std::is_reference<T>::value, std::is_convertible<V, T>, |
|
|
|
typename std::conditional<std::is_reference<T>::value, |
|
|
|
|
|
|
|
std::is_convertible<V, T>, |
|
|
|
std::is_constructible<T, V&&>>::type; |
|
|
|
std::is_constructible<T, V&&>>::type; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <bool SizeMatches, class T, class... Vs> |
|
|
|
|
|
|
|
struct TupleMoveConstructible : std::false_type {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <class... Ts, class... Vs> |
|
|
|
|
|
|
|
struct TupleMoveConstructible<true, CompressedTuple<Ts...>, Vs...> |
|
|
|
|
|
|
|
: std::integral_constant< |
|
|
|
|
|
|
|
bool, absl::conjunction< |
|
|
|
|
|
|
|
TupleElementMoveConstructible<Ts, Vs&&>...>::value> {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
|
|
|
struct compressed_tuple_size; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename... Es> |
|
|
|
|
|
|
|
struct compressed_tuple_size<CompressedTuple<Es...>> |
|
|
|
|
|
|
|
: public std::integral_constant<std::size_t, sizeof...(Es)> {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <class T, class... Vs> |
|
|
|
|
|
|
|
struct TupleItemsMoveConstructible |
|
|
|
|
|
|
|
: std::integral_constant< |
|
|
|
|
|
|
|
bool, TupleMoveConstructible<compressed_tuple_size<T>::value == |
|
|
|
|
|
|
|
sizeof...(Vs), |
|
|
|
|
|
|
|
T, Vs...>::value> {}; |
|
|
|
|
|
|
|
|
|
|
|
} // namespace internal_compressed_tuple
|
|
|
|
} // namespace internal_compressed_tuple
|
|
|
|
|
|
|
|
|
|
|
|
// Helper class to perform the Empty Base Class Optimization.
|
|
|
|
// Helper class to perform the Empty Base Class Optimization.
|
|
|
@ -217,17 +241,18 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple |
|
|
|
explicit constexpr CompressedTuple(const Ts&... base) |
|
|
|
explicit constexpr CompressedTuple(const Ts&... base) |
|
|
|
: CompressedTuple::CompressedTupleImpl(absl::in_place, base...) {} |
|
|
|
: CompressedTuple::CompressedTupleImpl(absl::in_place, base...) {} |
|
|
|
|
|
|
|
|
|
|
|
template <typename... Vs, |
|
|
|
template <typename First, typename... Vs, |
|
|
|
absl::enable_if_t< |
|
|
|
absl::enable_if_t< |
|
|
|
absl::conjunction< |
|
|
|
absl::conjunction< |
|
|
|
// Ensure we are not hiding default copy/move constructors.
|
|
|
|
// Ensure we are not hiding default copy/move constructors.
|
|
|
|
absl::negation<std::is_same<void(CompressedTuple), |
|
|
|
absl::negation<std::is_same<void(CompressedTuple), |
|
|
|
void(absl::decay_t<Vs>...)>>, |
|
|
|
void(absl::decay_t<First>)>>, |
|
|
|
internal_compressed_tuple::TupleMoveConstructible< |
|
|
|
internal_compressed_tuple::TupleItemsMoveConstructible< |
|
|
|
Ts, Vs&&>...>::value, |
|
|
|
CompressedTuple<Ts...>, First, Vs...>>::value, |
|
|
|
bool> = true> |
|
|
|
bool> = true> |
|
|
|
explicit constexpr CompressedTuple(Vs&&... base) |
|
|
|
explicit constexpr CompressedTuple(First&& first, Vs&&... base) |
|
|
|
: CompressedTuple::CompressedTupleImpl(absl::in_place, |
|
|
|
: CompressedTuple::CompressedTupleImpl(absl::in_place, |
|
|
|
|
|
|
|
absl::forward<First>(first), |
|
|
|
absl::forward<Vs>(base)...) {} |
|
|
|
absl::forward<Vs>(base)...) {} |
|
|
|
|
|
|
|
|
|
|
|
template <int I> |
|
|
|
template <int I> |
|
|
|