aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-09-01 20:40:42 +0100
committerJonathan Wakely <jwakely@redhat.com>2022-09-02 16:57:49 +0100
commit45433832a1ec392814e7f1cb7559bca48c2cb4e0 (patch)
tree1beb2273cd6b977aed67874d472e1f1150452def
parent51c42b38e43b5283b116882529d232719b099bfc (diff)
downloadgcc-45433832a1ec392814e7f1cb7559bca48c2cb4e0.zip
gcc-45433832a1ec392814e7f1cb7559bca48c2cb4e0.tar.gz
gcc-45433832a1ec392814e7f1cb7559bca48c2cb4e0.tar.bz2
libstdc++: Optimize constructible/assignable variable templates
This defines the is_xxx_constructible_v and is_xxx_assignable_v variable templates by using the built-ins directly. The actual logic for each one is the same as the corresponding class template, but way using the variable template doesn't need to instantiate the class template. This means that the variable templates won't use the static assertions checking for complete types, cv void or unbounded arrays, but that's OK because the built-ins check those anyway. We could probably remove the static assertions from the class templates, and maybe from all type traits that use a built-in. libstdc++-v3/ChangeLog: * include/std/type_traits (is_constructible_v) (is_default_constructible_v, is_copy_constructible_v) (is_move_constructible_v): Define using __is_constructible. (is_assignable_v, is_copy_assignable_v, is_move_assignable_v): Define using __is_assignable. (is_trivially_constructible_v) (is_trivially_default_constructible_v) (is_trivially_copy_constructible_v) (is_trivially_move_constructible_v): Define using __is_trivially_constructible. (is_trivially_assignable_v, is_trivially_copy_assignable_v) (is_trivially_move_assignable_v): Define using __is_trivially_assignable. (is_nothrow_constructible_v) (is_nothrow_default_constructible_v) (is_nothrow_copy_constructible_v) (is_nothrow_move_constructible_v): Define using __is_nothrow_constructible. (is_nothrow_assignable_v, is_nothrow_copy_assignable_v) (is_nothrow_move_assignable_v): Define using __is_nothrow_assignable.
-rw-r--r--libstdc++-v3/include/std/type_traits88
1 files changed, 49 insertions, 39 deletions
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index be9f295..2f5fe80 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -3105,71 +3105,81 @@ template <typename _Tp>
inline constexpr bool is_signed_v = is_signed<_Tp>::value;
template <typename _Tp>
inline constexpr bool is_unsigned_v = is_unsigned<_Tp>::value;
+
template <typename _Tp, typename... _Args>
- inline constexpr bool is_constructible_v =
- is_constructible<_Tp, _Args...>::value;
+ inline constexpr bool is_constructible_v = __is_constructible(_Tp, _Args...);
template <typename _Tp>
- inline constexpr bool is_default_constructible_v =
- is_default_constructible<_Tp>::value;
+ inline constexpr bool is_default_constructible_v = __is_constructible(_Tp);
template <typename _Tp>
- inline constexpr bool is_copy_constructible_v =
- is_copy_constructible<_Tp>::value;
+ inline constexpr bool is_copy_constructible_v
+ = __is_constructible(_Tp, __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_move_constructible_v =
- is_move_constructible<_Tp>::value;
+ inline constexpr bool is_move_constructible_v
+ = __is_constructible(_Tp, __add_rval_ref_t<_Tp>);
+
template <typename _Tp, typename _Up>
- inline constexpr bool is_assignable_v = is_assignable<_Tp, _Up>::value;
+ inline constexpr bool is_assignable_v = __is_assignable(_Tp, _Up);
template <typename _Tp>
- inline constexpr bool is_copy_assignable_v = is_copy_assignable<_Tp>::value;
+ inline constexpr bool is_copy_assignable_v
+ = __is_assignable(__add_lval_ref_t<_Tp>, __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_move_assignable_v = is_move_assignable<_Tp>::value;
+ inline constexpr bool is_move_assignable_v
+ = __is_assignable(__add_lval_ref_t<_Tp>, __add_rval_ref_t<_Tp>);
+
template <typename _Tp>
inline constexpr bool is_destructible_v = is_destructible<_Tp>::value;
+
template <typename _Tp, typename... _Args>
- inline constexpr bool is_trivially_constructible_v =
- is_trivially_constructible<_Tp, _Args...>::value;
+ inline constexpr bool is_trivially_constructible_v
+ = __is_trivially_constructible(_Tp, _Args...);
template <typename _Tp>
- inline constexpr bool is_trivially_default_constructible_v =
- is_trivially_default_constructible<_Tp>::value;
+ inline constexpr bool is_trivially_default_constructible_v
+ = __is_trivially_constructible(_Tp);
template <typename _Tp>
- inline constexpr bool is_trivially_copy_constructible_v =
- is_trivially_copy_constructible<_Tp>::value;
+ inline constexpr bool is_trivially_copy_constructible_v
+ = __is_trivially_constructible(_Tp, __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_trivially_move_constructible_v =
- is_trivially_move_constructible<_Tp>::value;
+ inline constexpr bool is_trivially_move_constructible_v
+ = __is_trivially_constructible(_Tp, __add_rval_ref_t<_Tp>);
+
template <typename _Tp, typename _Up>
- inline constexpr bool is_trivially_assignable_v =
- is_trivially_assignable<_Tp, _Up>::value;
+ inline constexpr bool is_trivially_assignable_v
+ = __is_trivially_assignable(_Tp, _Up);
template <typename _Tp>
- inline constexpr bool is_trivially_copy_assignable_v =
- is_trivially_copy_assignable<_Tp>::value;
+ inline constexpr bool is_trivially_copy_assignable_v
+ = __is_trivially_assignable(__add_lval_ref_t<_Tp>,
+ __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_trivially_move_assignable_v =
- is_trivially_move_assignable<_Tp>::value;
+ inline constexpr bool is_trivially_move_assignable_v
+ = __is_trivially_assignable(__add_lval_ref_t<_Tp>,
+ __add_rval_ref_t<_Tp>);
template <typename _Tp>
inline constexpr bool is_trivially_destructible_v =
is_trivially_destructible<_Tp>::value;
template <typename _Tp, typename... _Args>
- inline constexpr bool is_nothrow_constructible_v =
- is_nothrow_constructible<_Tp, _Args...>::value;
+ inline constexpr bool is_nothrow_constructible_v
+ = __is_nothrow_constructible(_Tp, _Args...);
template <typename _Tp>
- inline constexpr bool is_nothrow_default_constructible_v =
- is_nothrow_default_constructible<_Tp>::value;
+ inline constexpr bool is_nothrow_default_constructible_v
+ = __is_nothrow_constructible(_Tp);
template <typename _Tp>
- inline constexpr bool is_nothrow_copy_constructible_v =
- is_nothrow_copy_constructible<_Tp>::value;
+ inline constexpr bool is_nothrow_copy_constructible_v
+ = __is_nothrow_constructible(_Tp, __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_nothrow_move_constructible_v =
- is_nothrow_move_constructible<_Tp>::value;
+ inline constexpr bool is_nothrow_move_constructible_v
+ = __is_nothrow_constructible(_Tp, __add_rval_ref_t<_Tp>);
+
template <typename _Tp, typename _Up>
- inline constexpr bool is_nothrow_assignable_v =
- is_nothrow_assignable<_Tp, _Up>::value;
+ inline constexpr bool is_nothrow_assignable_v
+ = __is_nothrow_assignable(_Tp, _Up);
template <typename _Tp>
- inline constexpr bool is_nothrow_copy_assignable_v =
- is_nothrow_copy_assignable<_Tp>::value;
+ inline constexpr bool is_nothrow_copy_assignable_v
+ = __is_nothrow_assignable(__add_lval_ref_t<_Tp>,
+ __add_lval_ref_t<const _Tp>);
template <typename _Tp>
- inline constexpr bool is_nothrow_move_assignable_v =
- is_nothrow_move_assignable<_Tp>::value;
+ inline constexpr bool is_nothrow_move_assignable_v
+ = __is_nothrow_assignable(__add_lval_ref_t<_Tp>, __add_rval_ref_t<_Tp>);
+
template <typename _Tp>
inline constexpr bool is_nothrow_destructible_v =
is_nothrow_destructible<_Tp>::value;