Changes to std::variant to reduce code size

* 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.

From-SVN: r271295
This commit is contained in:
Jonathan Wakely 2019-05-16 21:30:27 +01:00 committed by Jonathan Wakely
parent 5120e0d8d4
commit b62dcd16aa
2 changed files with 19 additions and 19 deletions

View File

@ -1,5 +1,13 @@
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

View File

@ -396,19 +396,16 @@ namespace __variant
_M_index(_Np)
{ }
constexpr void _M_reset_impl()
{
__variant::__raw_visit([](auto&& __this_mem) mutable
{
if constexpr (!is_same_v<remove_reference_t<decltype(__this_mem)>,
__variant_cookie>)
std::_Destroy(std::__addressof(__this_mem));
}, __variant_cast<_Types...>(*this));
}
void _M_reset()
{
_M_reset_impl();
if (!_M_valid()) [[unlikely]]
return;
std::__do_visit<void>([](auto&& __this_mem) mutable
{
std::_Destroy(std::__addressof(__this_mem));
}, __variant_cast<_Types...>(*this));
_M_index = variant_npos;
}
@ -1485,12 +1482,7 @@ namespace __variant
{ 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)
@ -1511,7 +1503,7 @@ namespace __variant
}
else
{
if (this->index() != variant_npos)
if (!this->valueless_by_exception()) [[__likely__]]
{
auto __tmp(std::move(__rhs_mem));
__rhs = std::move(*this);
@ -1528,7 +1520,7 @@ namespace __variant
}
else
{
if (this->index() != variant_npos)
if (!this->valueless_by_exception()) [[__likely__]]
{
__rhs = std::move(*this);
this->_M_reset();