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.
This commit is contained in:
parent
e85bb1881e
commit
02f6b405f0
1 changed files with 10 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue