Fix CompressedTuple move constructor on MSVC (#637)
This commit is contained in:
parent
a877af1f29
commit
b92f35f65f
1 changed files with 33 additions and 8 deletions
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue