diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2022-09-01 13:06:13 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2022-09-01 20:31:00 +0100 |
commit | 775fe01b38933850dcb884733c4d0edc7cde45c3 (patch) | |
tree | 660784718f15833fe4d53df908bda00f71862129 /libstdc++-v3 | |
parent | 33005a4be49466880fe3f5a9317bccc8c1ed423b (diff) | |
download | gcc-775fe01b38933850dcb884733c4d0edc7cde45c3.zip gcc-775fe01b38933850dcb884733c4d0edc7cde45c3.tar.gz gcc-775fe01b38933850dcb884733c4d0edc7cde45c3.tar.bz2 |
libstdc++: Optimize std::decay
Define partial specializations of std::decay and its __decay_selector
helper so that remove_reference, is_array and is_function are not
instantiated for every type, and remove_extent is not instantiated for
arrays.
libstdc++-v3/ChangeLog:
* include/std/type_traits (__decay_selector): Add partial
specializations for array types. Only check for function types
when not dealing with an array.
(decay): Add partial specializations for reference types.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/include/std/type_traits | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index e4b9b59..639c351 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2203,34 +2203,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Decay trait for arrays and functions, used for perfect forwarding // in make_pair, make_tuple, etc. - template<typename _Up, - bool _IsArray = is_array<_Up>::value, - bool _IsFunction = is_function<_Up>::value> - struct __decay_selector; - - // NB: DR 705. template<typename _Up> - struct __decay_selector<_Up, false, false> - { typedef __remove_cv_t<_Up> __type; }; + struct __decay_selector + : __conditional_t<is_const<const _Up>::value, // false for functions + remove_cv<_Up>, // N.B. DR 705. + add_pointer<_Up>> // function decays to pointer + { }; - template<typename _Up> - struct __decay_selector<_Up, true, false> - { typedef typename remove_extent<_Up>::type* __type; }; + template<typename _Up, size_t _Nm> + struct __decay_selector<_Up[_Nm]> + { using type = _Up*; }; template<typename _Up> - struct __decay_selector<_Up, false, true> - { typedef typename add_pointer<_Up>::type __type; }; + struct __decay_selector<_Up[]> + { using type = _Up*; }; + /// @endcond /// decay template<typename _Tp> - class decay - { - typedef typename remove_reference<_Tp>::type __remove_type; + struct decay + { using type = typename __decay_selector<_Tp>::type; }; - public: - typedef typename __decay_selector<__remove_type>::__type type; - }; + template<typename _Tp> + struct decay<_Tp&> + { using type = typename __decay_selector<_Tp>::type; }; + + template<typename _Tp> + struct decay<_Tp&&> + { using type = typename __decay_selector<_Tp>::type; }; /// @cond undocumented |