diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-12-12 14:35:55 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-12-12 14:35:55 +0000 |
commit | d1505d01462a5c99ecee7847d913836f898f8b65 (patch) | |
tree | e8e8bdb449652308695c8d755bd931b73c87c8dc /libstdc++-v3 | |
parent | 2fb1d6d65474998f9359203af9785f8613f3b622 (diff) | |
download | gcc-d1505d01462a5c99ecee7847d913836f898f8b65.zip gcc-d1505d01462a5c99ecee7847d913836f898f8b65.tar.gz gcc-d1505d01462a5c99ecee7847d913836f898f8b65.tar.bz2 |
libstdc++: Simplify std::common_comparison_category
* libsupc++/compare (common_comparison_category): Define without using
concepts and optimise for compilation time.
(__detail::__cmp_cat_ids): Remove.
(__detail::__common_cmp_cat): Replace class template and
specializations with constexpr function.
From-SVN: r279307
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/compare | 53 |
2 files changed, 30 insertions, 31 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 54377d8..91d60d0 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2019-12-12 Jonathan Wakely <jwakely@redhat.com> + + * libsupc++/compare (common_comparison_category): Define without using + concepts and optimise for compilation time. + (__detail::__cmp_cat_ids): Remove. + (__detail::__common_cmp_cat): Replace class template and + specializations with constexpr function. + 2019-12-12 François Dumont <fdumont@gcc.gnu.org> * include/tr1/cctype: Add _GLIBCXX_BEGIN_VERSION_NAMESPACE and diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare index 412ec68..f77b7d7 100644 --- a/libstdc++-v3/libsupc++/compare +++ b/libstdc++-v3/libsupc++/compare @@ -385,53 +385,43 @@ namespace std is_gteq(partial_ordering __cmp) noexcept { return __cmp >= 0; } -#if __cpp_lib_concepts namespace __detail { template<typename _Tp> inline constexpr unsigned __cmp_cat_id = 1; template<> - inline constexpr unsigned __cmp_cat_id<strong_ordering> = 2; + inline constexpr unsigned __cmp_cat_id<partial_ordering> = 2; template<> inline constexpr unsigned __cmp_cat_id<weak_ordering> = 4; template<> - inline constexpr unsigned __cmp_cat_id<partial_ordering> = 8; + inline constexpr unsigned __cmp_cat_id<strong_ordering> = 8; template<typename... _Ts> - constexpr unsigned __cmp_cat_ids() - { return (__cmp_cat_id<_Ts> | ...); } - - template<unsigned> - struct __common_cmp_cat; - - // If any Ti is not a comparison category type, U is void. - template<unsigned _Bits> - requires ((_Bits & 1) == 1) - struct __common_cmp_cat<_Bits> { using type = void; }; - - // Otherwise, if at least one Ti is std::partial_ordering, - // U is std::partial_ordering. - template<unsigned _Bits> - requires ((_Bits & 0b1001) == 0b1000) - struct __common_cmp_cat<_Bits> { using type = partial_ordering; }; - - // Otherwise, if at least one Ti is std::weak_ordering, - // U is std::weak_ordering. - template<unsigned _Bits> - requires ((_Bits & 0b1101) == 0b0100) - struct __common_cmp_cat<_Bits> { using type = weak_ordering; }; - - // Otherwise, U is std::strong_ordering. - template<> - struct __common_cmp_cat<0b0010> { using type = strong_ordering; }; + constexpr auto __common_cmp_cat() + { + constexpr unsigned __cats = (__cmp_cat_id<_Ts> | ...); + // If any Ti is not a comparison category type, U is void. + if constexpr (__cats & 1) + return; + // Otherwise, if at least one Ti is std::partial_ordering, + // U is std::partial_ordering. + else if constexpr (bool(__cats & __cmp_cat_id<partial_ordering>)) + return partial_ordering::equivalent; + // Otherwise, if at least one Ti is std::weak_ordering, + // U is std::weak_ordering. + else if constexpr (bool(__cats & __cmp_cat_id<weak_ordering>)) + return weak_ordering::equivalent; + // Otherwise, U is std::strong_ordering. + else + return strong_ordering::equivalent; + } } // namespace __detail // [cmp.common], common comparison category type template<typename... _Ts> struct common_comparison_category { - using type - = __detail::__common_cmp_cat<__detail::__cmp_cat_ids<_Ts...>()>::type; + using type = decltype(__detail::__common_cmp_cat<_Ts...>()); }; // Partial specializations for one and zero argument cases. @@ -460,6 +450,7 @@ namespace std using common_comparison_category_t = typename common_comparison_category<_Ts...>::type; +#if __cpp_lib_concepts namespace __detail { template<typename _Tp, typename _Cat> |