Commit b62dcd16 by Jonathan Wakely Committed by Jonathan Wakely

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
parent 5120e0d8
2019-05-16 Jonathan Wakely <jwakely@redhat.com> 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. * include/bits/hashtable_policy.h (_Equal_helper): Remove.
(_Hashtable_base::_Equal_hash_code): Define new class template. (_Hashtable_base::_Equal_hash_code): Define new class template.
(_Hashtable_base::_M_equals): Use _Equal_hash_code instead of (_Hashtable_base::_M_equals): Use _Equal_hash_code instead of
......
...@@ -396,19 +396,16 @@ namespace __variant ...@@ -396,19 +396,16 @@ namespace __variant
_M_index(_Np) _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)>, std::_Destroy(std::__addressof(__this_mem));
__variant_cookie>)
std::_Destroy(std::__addressof(__this_mem));
}, __variant_cast<_Types...>(*this)); }, __variant_cast<_Types...>(*this));
}
void _M_reset()
{
_M_reset_impl();
_M_index = variant_npos; _M_index = variant_npos;
} }
...@@ -1485,12 +1482,7 @@ namespace __variant ...@@ -1485,12 +1482,7 @@ namespace __variant
{ return !this->_M_valid(); } { return !this->_M_valid(); }
constexpr size_t index() const noexcept constexpr size_t index() const noexcept
{ { return size_t(typename _Base::__index_type(this->_M_index + 1)) - 1; }
if (this->_M_index ==
typename _Base::__index_type(variant_npos))
return variant_npos;
return this->_M_index;
}
void void
swap(variant& __rhs) swap(variant& __rhs)
...@@ -1511,7 +1503,7 @@ namespace __variant ...@@ -1511,7 +1503,7 @@ namespace __variant
} }
else else
{ {
if (this->index() != variant_npos) if (!this->valueless_by_exception()) [[__likely__]]
{ {
auto __tmp(std::move(__rhs_mem)); auto __tmp(std::move(__rhs_mem));
__rhs = std::move(*this); __rhs = std::move(*this);
...@@ -1528,7 +1520,7 @@ namespace __variant ...@@ -1528,7 +1520,7 @@ namespace __variant
} }
else else
{ {
if (this->index() != variant_npos) if (!this->valueless_by_exception()) [[__likely__]]
{ {
__rhs = std::move(*this); __rhs = std::move(*this);
this->_M_reset(); this->_M_reset();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment