2019-05-16 Jonathan Wakely <jwakely@redhat.com>
+ * include/std/variant (_Variant_storage<false, _Types...>::_M_reset):
+ Replace raw visitation with a runtime check for the valueless state
+ and a non-raw visitor.
+ (_Variant_storage<false, _Types...>::_M_reset_impl): Remove.
+ (variant::index()): Remove branch.
+ (variant::swap(variant&)): Use valueless_by_exception() instead of
+ comparing the index to variant_npos, and add likelihood attribute.
+
* include/bits/hashtable_policy.h (_Equal_helper): Remove.
(_Hashtable_base::_Equal_hash_code): Define new class template.
(_Hashtable_base::_M_equals): Use _Equal_hash_code instead of
_M_index(_Np)
{ }
- constexpr void _M_reset_impl()
+ void _M_reset()
{
- __variant::__raw_visit([](auto&& __this_mem) mutable
+ if (!_M_valid()) [[unlikely]]
+ return;
+
+ std::__do_visit<void>([](auto&& __this_mem) mutable
{
- if constexpr (!is_same_v<remove_reference_t<decltype(__this_mem)>,
- __variant_cookie>)
- std::_Destroy(std::__addressof(__this_mem));
+ std::_Destroy(std::__addressof(__this_mem));
}, __variant_cast<_Types...>(*this));
- }
- void _M_reset()
- {
- _M_reset_impl();
_M_index = variant_npos;
}
{ return !this->_M_valid(); }
constexpr size_t index() const noexcept
- {
- if (this->_M_index ==
- typename _Base::__index_type(variant_npos))
- return variant_npos;
- return this->_M_index;
- }
+ { return size_t(typename _Base::__index_type(this->_M_index + 1)) - 1; }
void
swap(variant& __rhs)
}
else
{
- if (this->index() != variant_npos)
+ if (!this->valueless_by_exception()) [[__likely__]]
{
auto __tmp(std::move(__rhs_mem));
__rhs = std::move(*this);
}
else
{
- if (this->index() != variant_npos)
+ if (!this->valueless_by_exception()) [[__likely__]]
{
__rhs = std::move(*this);
this->_M_reset();