On 01/04/19 11:45 +0300, Ville Voutilainen wrote:
@@ -570,45 +574,44 @@ namespace __variant operator=(const _Copy_assign_base& __rhs) noexcept(_Traits<_Types...>::_S_nothrow_copy_assign) { - __do_visit([this, &__rhs](auto&& __this_mem, auto&& __rhs_mem) mutable - -> __detail::__variant::__variant_cookie + __do_visit<__visit_with_index>([this](auto&& __rhs_mem, + auto __rhs_index) mutable + -> __detail::__variant::__variant_idx_cookie { - if constexpr (is_same_v< - remove_reference_t<decltype(__this_mem)>, - remove_reference_t<decltype(__rhs_mem)>>) + if constexpr (__rhs_index != variant_npos) { - if constexpr (!is_same_v< - remove_reference_t<decltype(__rhs_mem)>, - __variant_cookie>) - __this_mem = __rhs_mem; - } - else - { - if constexpr (!is_same_v< - remove_reference_t<decltype(__rhs_mem)>, - __variant_cookie>) + if (this->_M_index == __rhs_index) { - using __rhs_type = - remove_reference_t<decltype(__rhs_mem)>; - if constexpr (is_nothrow_copy_constructible_v<__rhs_type> - || !is_nothrow_move_constructible_v<__rhs_type>) + if constexpr (__rhs_index != variant_npos) { - this->_M_destructive_copy(__rhs._M_index, __rhs_mem); + auto& __this_mem = + __get<__rhs_index>(*this);
Qualify this as __variant::__get please.
+ if constexpr (is_same_v< + remove_reference_t<decltype(__this_mem)>, + remove_reference_t<decltype(__rhs_mem)>>) + __this_mem = __rhs_mem; } + } + else + { + using __rhs_type = + remove_reference_t<decltype(__rhs_mem)>; + if constexpr + (is_nothrow_copy_constructible_v<__rhs_type> + || !is_nothrow_move_constructible_v<__rhs_type>) + this->_M_destructive_copy(__rhs_index, __rhs_mem); else { auto __tmp(__rhs_mem); - this->_M_destructive_move(__rhs._M_index, + this->_M_destructive_move(__rhs_index, std::move(__tmp)); } } - else - { - this->_M_reset(); - } } - return {}; - }, __variant_cast<_Types...>(*this), __variant_cast<_Types...>(__rhs)); + else + this->_M_reset(); + return {}; + }, __variant_cast<_Types...>(__rhs)); __glibcxx_assert(this->_M_index == __rhs._M_index); return *this; } @@ -641,25 +644,32 @@ namespace __variant operator=(_Move_assign_base&& __rhs) noexcept(_Traits<_Types...>::_S_nothrow_move_assign) { - __do_visit([this, &__rhs](auto&& __this_mem, auto&& __rhs_mem) mutable - -> __detail::__variant::__variant_cookie + __do_visit<__visit_with_index>([this](auto&& __rhs_mem, + auto __rhs_index) mutable + -> __detail::__variant::__variant_idx_cookie { - if constexpr (is_same_v< - remove_reference_t<decltype(__this_mem)>, - remove_reference_t<decltype(__rhs_mem)>>) + if constexpr (__rhs_index != variant_npos) { - if constexpr (!is_same_v< - remove_reference_t<decltype(__rhs_mem)>, - __variant_cookie>) - __this_mem = std::move(__rhs_mem); + if (this->_M_index == __rhs_index) + { + if constexpr (__rhs_index != variant_npos) + { + auto& __this_mem = + __get<__rhs_index>(*this);
And here.
+ if constexpr (is_same_v< + remove_reference_t<decltype(__this_mem)>, + remove_reference_t<decltype(__rhs_mem)>>) + __this_mem = std::move(__rhs_mem); + } + } + else + this->_M_destructive_move(__rhs_index, + std::move(__rhs_mem)); } else - { - auto __tmp(std::move(__rhs_mem)); - this->_M_destructive_move(__rhs._M_index, std::move(__tmp)); - } - return {}; - }, __variant_cast<_Types...>(*this), __variant_cast<_Types...>(__rhs)); + this->_M_reset(); + return {}; + }, __variant_cast<_Types...>(__rhs)); __glibcxx_assert(this->_M_index == __rhs._M_index); return *this; } @@ -1082,25 +1099,25 @@ namespace __variant const variant<_Types...>& __rhs) \ { \ bool __ret = true; \ - __do_visit([&__ret, &__lhs, __rhs] \ - (auto&& __this_mem, auto&& __rhs_mem) mutable \ - -> __detail::__variant::__variant_cookie \ + __do_visit<__detail::__variant::__visit_with_index>( \ + [&__ret, &__lhs, __rhs] \ + (auto&& __rhs_mem, auto __rhs_index) mutable \ + -> __detail::__variant::__variant_idx_cookie \ { \ - if constexpr (!is_same_v< \ - remove_reference_t<decltype(__this_mem)>, \ - remove_reference_t<decltype(__rhs_mem)>> \ - || is_same_v<decltype(__this_mem), \ - __detail::__variant::__variant_cookie>) \ - __ret = (__lhs.index() + 1) __OP (__rhs.index() + 1); \ - else if constexpr (is_same_v< \ - remove_reference_t<decltype(__this_mem)>, \ - remove_reference_t<decltype(__rhs_mem)>> \ - && !is_same_v< \ - remove_reference_t<decltype(__this_mem)>, \ - __detail::__variant::__variant_cookie>) \ - __ret = __this_mem __OP __rhs_mem; \ + if constexpr (__rhs_index != variant_npos) \ + { \ + if (__lhs.index() == __rhs_index) \ + { \ + auto& __this_mem = get<__rhs_index>(__lhs); \
And std::get here.
+ __ret = __this_mem __OP __rhs_mem; \ + } \ + else \ + __ret = (__lhs.index() + 1) __OP (__rhs_index + 1); \ + } \ + else \ + __ret = (__lhs.index() + 1) __OP (__rhs_index + 1); \ return {}; \ - }, __lhs, __rhs); \ + }, __rhs); \ return __ret; \ } \ \ @@ -1402,51 +1419,47 @@ namespace __variant noexcept((__is_nothrow_swappable<_Types>::value && ...) && is_nothrow_move_constructible_v<variant>) { - __do_visit([this, &__rhs](auto&& __this_mem, auto&& __rhs_mem) mutable - -> __detail::__variant::__variant_cookie + __do_visit<__detail::__variant::__visit_with_index>( + [this, &__rhs](auto&& __rhs_mem, + auto __rhs_index) mutable + -> __detail::__variant::__variant_idx_cookie { - if constexpr (is_same_v< - remove_reference_t<decltype(__this_mem)>, - remove_reference_t<decltype(__rhs_mem)>>) + if constexpr (__rhs_index != variant_npos) { - if constexpr (!is_same_v< - remove_reference_t<decltype(__rhs_mem)>, - __detail::__variant::__variant_cookie>) + if (this->index() == __rhs_index) { + auto& __this_mem = + get<__rhs_index>(*this);
And here. OK with those four qualifications, thanks very much.