]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Changes to std::variant to reduce code size
authorJonathan Wakely <jwakely@redhat.com>
Thu, 16 May 2019 20:30:27 +0000 (21:30 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 16 May 2019 20:30:27 +0000 (21:30 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/variant

index 060d92a0a27a51aad7623ce61cbf7d5b04da6a97..997924e2c11dba425d66c457dea75a29dc2e5736 100644 (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
index 8c710c30de5ad42f0bf7fdcd12be98fa3a47c83b..101b8945943126e87ec7c635557e9d27027123b8 100644 (file)
@@ -396,19 +396,16 @@ namespace __variant
        _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;
       }
 
@@ -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();