]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Separate construct/convertibility tests for std::tuple
authorPatrick Palka <ppalka@redhat.com>
Tue, 23 Aug 2022 17:35:49 +0000 (13:35 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 23 Aug 2022 17:35:49 +0000 (13:35 -0400)
P2321R2 adds additional conditionally explicit constructors to std::tuple
which we'll concisely implement in a subsequent patch using explicit(bool),
like in our C++20 std::pair implementation.  This prerequisite patch
adds member typedefs to _TupleConstraints for testing element-wise
constructibility and convertibility separately; we'll use the first in
the new constructors' constraints, and the second in their explicit
specifier.

In passing, this patch also redefines the existing member predicates
__is_ex/implicitly_constructible in terms of these new members.  This
seems to reduce compile time and memory usage by about 10% for large
tuples when using the converting constructors that're constrained by
_Explicit/_ImplicitCtor.

libstdc++-v3/ChangeLog:

* include/std/tuple (_TupleConstraints::__convertible): Define.
(_TupleConstraints::__constructible): Define.
(_TupleConstraints::__is_explicitly_constructible): Redefine this
in terms of __convertible and __constructible.
(_TupleConstraints::__is_implicitly_constructible): Likewise.

libstdc++-v3/include/std/tuple

index 6d0060a191c6da3631477e5ca43e8c16bf62f9e7..7f9c07248d4335515a07ccfdbea23849fe8f0b0f 100644 (file)
@@ -553,14 +553,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<bool, typename... _Types>
     struct _TupleConstraints
     {
+      template<typename... _UTypes>
+       using __constructible = __and_<is_constructible<_Types, _UTypes>...>;
+
+      template<typename... _UTypes>
+       using __convertible = __and_<is_convertible<_UTypes, _Types>...>;
+
       // Constraint for a non-explicit constructor.
       // True iff each Ti in _Types... can be constructed from Ui in _UTypes...
       // and every Ui is implicitly convertible to Ti.
       template<typename... _UTypes>
        static constexpr bool __is_implicitly_constructible()
        {
-         return __and_<is_constructible<_Types, _UTypes>...,
-                       is_convertible<_UTypes, _Types>...
+         return __and_<__constructible<_UTypes...>,
+                       __convertible<_UTypes...>
                        >::value;
        }
 
@@ -570,8 +576,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       template<typename... _UTypes>
        static constexpr bool __is_explicitly_constructible()
        {
-         return __and_<is_constructible<_Types, _UTypes>...,
-                       __not_<__and_<is_convertible<_UTypes, _Types>...>>
+         return __and_<__constructible<_UTypes...>,
+                       __not_<__convertible<_UTypes...>>
                        >::value;
        }