From 0d67cd380d37f2a28156d3430b9964a5df67a101 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 12 Jul 2019 12:43:22 +0100 Subject: [PATCH] Define __type_identity_t alias and use for string_view This defines the equivalent of C++2a's std::type_identity_t alias but for use in C++11 and later. This can be used to replace __detail::__idt in the string_view headers, which previously used common_type_t because the one argument specialization of common_type_t was simply the identity transform (which is no longer true). * include/experimental/string_view (__detail::__idt): Remove. (operator==, operator!=, operator<, operator>, operator<=, operator>=): Use __type_identity_t instead of __detail::__idt; * include/std/string_view (__detail::__idt): Remove. (operator==, operator!=, operator<, operator>, operator<=, operator>=): Use __type_identity_t instead of __detail::__idt; * include/std/type_traits (__type_identity_t): New alias template. From-SVN: r273442 --- libstdc++-v3/ChangeLog | 8 ++++ libstdc++-v3/include/experimental/string_view | 42 ++++++++++--------- libstdc++-v3/include/std/string_view | 42 ++++++++++--------- libstdc++-v3/include/std/type_traits | 8 ++-- 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cbf8133aafd..668d80afa8b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2019-07-12 Jonathan Wakely + * include/experimental/string_view (__detail::__idt): Remove. + (operator==, operator!=, operator<, operator>, operator<=, operator>=): + Use __type_identity_t instead of __detail::__idt; + * include/std/string_view (__detail::__idt): Remove. + (operator==, operator!=, operator<, operator>, operator<=, operator>=): + Use __type_identity_t instead of __detail::__idt; + * include/std/type_traits (__type_identity_t): New alias template. + * doc/xml/manual/status_cxx2020.xml: Update status for atomic_ref and floating point atomics. diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view index 9449869367c..84b2a3eb402 100644 --- a/libstdc++-v3/include/experimental/string_view +++ b/libstdc++-v3/include/experimental/string_view @@ -436,14 +436,10 @@ inline namespace fundamentals_v1 // [string.view.comparison], non-member basic_string_view comparison functions - namespace __detail - { - // Identity transform to create a non-deduced context, so that only one - // argument participates in template argument deduction and the other - // argument gets implicitly converted to the deduced type. See n3766.html. - template - using __idt = common_type_t<_Tp>; - } + // Several of these functions use type_identity_t to create a non-deduced + // context, so that only one argument participates in template argument + // deduction and the other argument gets implicitly converted to the deduced + // type (see N3766). template constexpr bool @@ -454,12 +450,13 @@ inline namespace fundamentals_v1 template constexpr bool operator==(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.size() == __y.size() && __x.compare(__y) == 0; } template constexpr bool - operator==(__detail::__idt> __x, + operator==(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.size() == __y.size() && __x.compare(__y) == 0; } @@ -472,12 +469,13 @@ inline namespace fundamentals_v1 template constexpr bool operator!=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return !(__x == __y); } template constexpr bool - operator!=(__detail::__idt> __x, + operator!=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return !(__x == __y); } @@ -490,12 +488,13 @@ inline namespace fundamentals_v1 template constexpr bool operator< (basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) < 0; } template constexpr bool - operator< (__detail::__idt> __x, + operator< (__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) < 0; } @@ -508,12 +507,13 @@ inline namespace fundamentals_v1 template constexpr bool operator> (basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) > 0; } template constexpr bool - operator> (__detail::__idt> __x, + operator> (__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) > 0; } @@ -526,12 +526,13 @@ inline namespace fundamentals_v1 template constexpr bool operator<=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) <= 0; } template constexpr bool - operator<=(__detail::__idt> __x, + operator<=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) <= 0; } @@ -544,12 +545,13 @@ inline namespace fundamentals_v1 template constexpr bool operator>=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) >= 0; } template constexpr bool - operator>=(__detail::__idt> __x, + operator>=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) >= 0; } diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 42822cc41ab..e8b6ed3af12 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -459,14 +459,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // [string.view.comparison], non-member basic_string_view comparison function - namespace __detail - { - // Identity transform to create a non-deduced context, so that only one - // argument participates in template argument deduction and the other - // argument gets implicitly converted to the deduced type. See n3766.html. - template - using __idt = common_type_t<_Tp>; - } + // Several of these functions use type_identity_t to create a non-deduced + // context, so that only one argument participates in template argument + // deduction and the other argument gets implicitly converted to the deduced + // type (see N3766). template constexpr bool @@ -477,12 +473,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator==(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.size() == __y.size() && __x.compare(__y) == 0; } template constexpr bool - operator==(__detail::__idt> __x, + operator==(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.size() == __y.size() && __x.compare(__y) == 0; } @@ -495,12 +492,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator!=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return !(__x == __y); } template constexpr bool - operator!=(__detail::__idt> __x, + operator!=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return !(__x == __y); } @@ -513,12 +511,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator< (basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) < 0; } template constexpr bool - operator< (__detail::__idt> __x, + operator< (__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) < 0; } @@ -531,12 +530,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator> (basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) > 0; } template constexpr bool - operator> (__detail::__idt> __x, + operator> (__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) > 0; } @@ -549,12 +549,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator<=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) <= 0; } template constexpr bool - operator<=(__detail::__idt> __x, + operator<=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) <= 0; } @@ -567,12 +568,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template constexpr bool operator>=(basic_string_view<_CharT, _Traits> __x, - __detail::__idt> __y) noexcept + __type_identity_t> __y) + noexcept { return __x.compare(__y) >= 0; } template constexpr bool - operator>=(__detail::__idt> __x, + operator>=(__type_identity_t> __x, basic_string_view<_CharT, _Traits> __y) noexcept { return __x.compare(__y) >= 0; } diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index b07291706ac..d8ed1ce120d 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -92,9 +92,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct conditional; template - struct __type_identity { - using type = _Type; - }; + struct __type_identity + { using type = _Type; }; + + template + using __type_identity_t = typename __type_identity<_Tp>::type; template struct __or_; -- 2.30.2