Use fold expressions to reduce std::variant instantiation depth
authorBarrett Adair <barrettellisadair@gmail.com>
Fri, 6 Jan 2017 15:27:01 +0000 (15:27 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 6 Jan 2017 15:27:01 +0000 (15:27 +0000)
2017-01-06  Barrett Adair  <barrettellisadair@gmail.com>
    Jonathan Wakely  <jwakely@redhat.com>

* include/std/variant (variant, swap): Replace __and_ usage with fold
expressions.

Co-Authored-By: Jonathan Wakely <jwakely@redhat.com>
From-SVN: r244163

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

index b172a54..eee7808 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-06  Barrett Adair  <barrettellisadair@gmail.com>
+           Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/std/variant (variant, swap): Replace __and_ usage with fold
+       expressions.
+
 2017-01-06  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR go/78978
index 1803315..3d025a7 100644 (file)
@@ -396,7 +396,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 
       _Variant_base(_Variant_base&& __rhs)
-      noexcept(__and_<is_nothrow_move_constructible<_Types>...>::value)
+      noexcept((is_nothrow_move_constructible_v<_Types> && ...))
       {
        if (__rhs._M_valid())
          {
@@ -459,8 +459,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       _Variant_base&
       operator=(_Variant_base&& __rhs)
-      noexcept(__and_<is_nothrow_move_constructible<_Types>...,
-                     is_nothrow_move_assignable<_Types>...>::value)
+      noexcept((is_nothrow_move_constructible_v<_Types> && ...)
+         && (is_nothrow_move_assignable_v<_Types> && ...))
       {
        if (this->_M_index == __rhs._M_index)
          {
@@ -865,8 +865,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { __lhs.swap(__rhs); }
 
   template<typename... _Types>
-    enable_if_t<!__and_<is_move_constructible<_Types>...,
-                       is_swappable<_Types>...>::value>
+    enable_if_t<!((is_move_constructible_v<_Types> && ...)
+                  && (is_swappable_v<_Types> && ...))>
     swap(variant<_Types...>&, variant<_Types...>&) = delete;
 
   class bad_variant_access : public exception
@@ -895,13 +895,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        is_default_constructible_v<
          variant_alternative_t<0, variant<_Types...>>>, variant<_Types...>>,
       private _Enable_copy_move<
-       __and_<is_copy_constructible<_Types>...>::value,
-       __and_<is_copy_constructible<_Types>...,
-              is_move_constructible<_Types>...,
-              is_copy_assignable<_Types>...>::value,
-       __and_<is_move_constructible<_Types>...>::value,
-       __and_<is_move_constructible<_Types>...,
-              is_move_assignable<_Types>...>::value,
+       (is_copy_constructible_v<_Types> && ...),
+       (is_copy_constructible_v<_Types> && ...)
+            && (is_move_constructible_v<_Types> && ...)
+            && (is_copy_assignable_v<_Types> && ...),
+       (is_move_constructible_v<_Types> && ...),
+       (is_move_constructible_v<_Types> && ...)
+            && (is_move_assignable_v<_Types> && ...),
        variant<_Types...>>
     {
     private:
@@ -948,8 +948,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       noexcept(is_nothrow_default_constructible_v<__to_type<0>>) = default;
       variant(const variant&) = default;
       variant(variant&&)
-      noexcept(__and_<
-       is_nothrow_move_constructible<_Types>...>::value) = default;
+      noexcept((is_nothrow_move_constructible_v<_Types> && ...)) = default;
 
       template<typename _Tp,
               typename = enable_if_t<__exactly_once<__accepted_type<_Tp&&>>
@@ -1003,8 +1002,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       variant& operator=(const variant&) = default;
       variant& operator=(variant&&)
-      noexcept(__and_<is_nothrow_move_constructible<_Types>...,
-                     is_nothrow_move_assignable<_Types>...>::value) = default;
+      noexcept((is_nothrow_move_constructible_v<_Types> && ...)
+         && (is_nothrow_move_assignable_v<_Types> && ...)) = default;
 
       template<typename _Tp>
        enable_if_t<__exactly_once<__accepted_type<_Tp&&>>
@@ -1091,7 +1090,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       void
       swap(variant& __rhs)
-      noexcept(__and_<__is_nothrow_swappable<_Types>...>::value
+      noexcept((__is_nothrow_swappable<_Types>::value && ...)
               && is_nothrow_move_constructible_v<variant>)
       {
        if (this->index() == __rhs.index())