mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
add tuple assignment for pair
This commit is contained in:
parent
ae9578ce37
commit
87ed3d5548
11 changed files with 262 additions and 26 deletions
|
@ -53,6 +53,29 @@ namespace sprout {
|
|||
inline SPROUT_CONSTEXPR sprout::tuples::tuple<Types...>::tuple(sprout::tuples::flexibly_construct_t, sprout::pair<UType1, UType2>&& t)
|
||||
: impl_type(SPROUT_FORWARD(UType1, t.first), SPROUT_FORWARD(UType2, t.second))
|
||||
{}
|
||||
// tuple assignment
|
||||
template<typename... Types>
|
||||
template<
|
||||
typename UType1, typename UType2,
|
||||
typename
|
||||
>
|
||||
inline SPROUT_CXX14_CONSTEXPR sprout::tuples::tuple<Types...>&
|
||||
sprout::tuples::tuple<Types...>::operator=(sprout::pair<UType1, UType2> const& rhs) {
|
||||
sprout::tuples::detail::tuple_impl<0, Types...>::head(*this) = rhs.first;
|
||||
sprout::tuples::detail::tuple_impl<1, Types...>::head(*this) = rhs.second;
|
||||
return *this;
|
||||
}
|
||||
template<typename... Types>
|
||||
template<
|
||||
typename UType1, typename UType2,
|
||||
typename
|
||||
>
|
||||
inline SPROUT_CXX14_CONSTEXPR sprout::tuples::tuple<Types...>&
|
||||
sprout::tuples::tuple<Types...>::operator=(sprout::pair<UType1, UType2>&& rhs) {
|
||||
sprout::tuples::detail::tuple_impl<0, Types...>::head(*this) = sprout::move(rhs.first);
|
||||
sprout::tuples::detail::tuple_impl<1, Types...>::head(*this) = sprout::move(rhs.second);
|
||||
return *this;
|
||||
}
|
||||
} // namespace tuples
|
||||
} // namespace sprout
|
||||
|
||||
|
|
|
@ -272,6 +272,18 @@ namespace sprout {
|
|||
>...
|
||||
>
|
||||
{};
|
||||
|
||||
template<typename TndexTuple, typename... Utypes>
|
||||
struct is_flexibly_assignable_impl;
|
||||
template<sprout::index_t... Indexes, typename... Utypes>
|
||||
struct is_flexibly_assignable_impl<sprout::index_tuple<Indexes...>, Utypes...>
|
||||
: public sprout::tpp::all_of<
|
||||
std::is_assignable<
|
||||
typename sprout::pack_element<Indexes, Types...>::type,
|
||||
typename sprout::pack_element<Indexes, Utypes...>::type
|
||||
>...
|
||||
>
|
||||
{};
|
||||
public:
|
||||
template<typename... UTypes>
|
||||
struct is_flexibly_convert_constructible
|
||||
|
@ -304,6 +316,38 @@ namespace sprout {
|
|||
struct is_clvref_fixedly_convert_constructible
|
||||
: public is_fixedly_convert_constructible<UTypes const&...>
|
||||
{};
|
||||
|
||||
template<typename... UTypes>
|
||||
struct is_flexibly_assignable
|
||||
: public is_flexibly_assignable_impl<
|
||||
typename sprout::make_index_tuple<(sizeof...(UTypes) < sizeof...(Types) ? sizeof...(UTypes) : sizeof...(Types))>::type,
|
||||
UTypes...
|
||||
>
|
||||
{};
|
||||
template<typename... UTypes>
|
||||
struct is_rvref_flexibly_assignable
|
||||
: public is_flexibly_assignable<UTypes&&...>
|
||||
{};
|
||||
template<typename... UTypes>
|
||||
struct is_clvref_flexibly_assignable
|
||||
: public is_flexibly_assignable<UTypes const&...>
|
||||
{};
|
||||
|
||||
template<typename... UTypes>
|
||||
struct is_fixedly_assignable
|
||||
: public sprout::integral_constant<
|
||||
bool,
|
||||
(sizeof...(UTypes) == sizeof...(Types) && is_flexibly_assignable<UTypes...>::value)
|
||||
>
|
||||
{};
|
||||
template<typename... UTypes>
|
||||
struct is_rvref_fixedly_assignable
|
||||
: public is_fixedly_assignable<UTypes&&...>
|
||||
{};
|
||||
template<typename... UTypes>
|
||||
struct is_clvref_fixedly_assignable
|
||||
: public is_fixedly_assignable<UTypes const&...>
|
||||
{};
|
||||
public:
|
||||
// tuple construction
|
||||
SPROUT_CONSTEXPR tuple()
|
||||
|
@ -428,6 +472,20 @@ namespace sprout {
|
|||
static_cast<impl_type&>(*this) = sprout::move(rhs);
|
||||
return *this;
|
||||
}
|
||||
template<
|
||||
typename UType1, typename UType2,
|
||||
typename = typename std::enable_if<
|
||||
is_clvref_fixedly_assignable<UType1, UType2>::value
|
||||
>::type
|
||||
>
|
||||
SPROUT_CXX14_CONSTEXPR tuple& operator=(sprout::pair<UType1, UType2> const& rhs);
|
||||
template<
|
||||
typename UType1, typename UType2,
|
||||
typename = typename std::enable_if<
|
||||
is_rvref_fixedly_assignable<UType1, UType2>::value
|
||||
>::type
|
||||
>
|
||||
SPROUT_CXX14_CONSTEXPR tuple& operator=(sprout::pair<UType1, UType2>&& rhs);
|
||||
// tuple swap
|
||||
SPROUT_CXX14_CONSTEXPR void swap(tuple& other)
|
||||
SPROUT_NOEXCEPT_EXPR(sprout::tpp::all_of_c<SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(sprout::swap(std::declval<Types&>(), std::declval<Types&>()), false)...>::value)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue