diff options
author | Patrick Palka <ppalka@redhat.com> | 2022-08-23 13:35:49 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2022-08-23 13:35:49 -0400 |
commit | 02f6b405f0e9dc7a8868fecef9a048b79c433125 (patch) | |
tree | 7a0ef673a67bb94c053bc4dcc0f1eed31687c852 | |
parent | e85bb1881e57e53306ede2a15f30d06480d69886 (diff) | |
download | gcc-02f6b405f0e9dc7a8868fecef9a048b79c433125.zip gcc-02f6b405f0e9dc7a8868fecef9a048b79c433125.tar.gz gcc-02f6b405f0e9dc7a8868fecef9a048b79c433125.tar.bz2 |
libstdc++: Separate construct/convertibility tests for std::tuple
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.
-rw-r--r-- | libstdc++-v3/include/std/tuple | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 6d0060a..7f9c072 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -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; } |