From: Jonathan Wakely Date: Thu, 1 Sep 2022 12:06:13 +0000 (+0100) Subject: libstdc++: Optimize std::decay X-Git-Tag: basepoints/gcc-14~4855 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=775fe01b38933850dcb884733c4d0edc7cde45c3;p=thirdparty%2Fgcc.git 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. --- diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index e4b9b59ce08e..639c351df8a7 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::value, - bool _IsFunction = is_function<_Up>::value> - struct __decay_selector; - - // NB: DR 705. template - struct __decay_selector<_Up, false, false> - { typedef __remove_cv_t<_Up> __type; }; + struct __decay_selector + : __conditional_t::value, // false for functions + remove_cv<_Up>, // N.B. DR 705. + add_pointer<_Up>> // function decays to pointer + { }; - template - struct __decay_selector<_Up, true, false> - { typedef typename remove_extent<_Up>::type* __type; }; + template + struct __decay_selector<_Up[_Nm]> + { using type = _Up*; }; template - struct __decay_selector<_Up, false, true> - { typedef typename add_pointer<_Up>::type __type; }; + struct __decay_selector<_Up[]> + { using type = _Up*; }; + /// @endcond /// decay template - 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 + struct decay<_Tp&> + { using type = typename __decay_selector<_Tp>::type; }; + + template + struct decay<_Tp&&> + { using type = typename __decay_selector<_Tp>::type; }; /// @cond undocumented