From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1984) id D587E398D04B; Fri, 17 Jul 2020 13:08:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D587E398D04B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1594991327; bh=AZXKRWIy8rWkkJNU96J0Fm51AAxr9Qsv0hqZh0jhKzg=; h=From:To:Subject:Date:From; b=GnCDpjeqW9PlPhVj9r76NKM4cYWpeud4MlURporg6RT1VL/3dR9aJmqUaOEsLBux5 P4lcl/hLv9ih7h2cPof8/CQ4au/2TmwMXs6h/k6q9qjFyERoM+vto+9pG64bCkLD0s wXF2oBz9FCoF4PnrB2MXDjyN6MOArODxuO4agVVs= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Tamar Christina To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc(refs/vendors/ARM/heads/arm-perf-staging)] libstdc++: P1964R2 Wording for boolean-testable X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/vendors/ARM/heads/arm-perf-staging X-Git-Oldrev: 7ab36231a17d8a78f4355289ebbd9d32bb8ede7b X-Git-Newrev: c5e1c1d3aba39e960cc5fb0dcd77e447e5dee7eb Message-Id: <20200717130847.D587E398D04B@sourceware.org> Date: Fri, 17 Jul 2020 13:08:47 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Jul 2020 13:08:47 -0000 https://gcc.gnu.org/g:c5e1c1d3aba39e960cc5fb0dcd77e447e5dee7eb commit c5e1c1d3aba39e960cc5fb0dcd77e447e5dee7eb Author: Jonathan Wakely Date: Mon Feb 17 18:15:00 2020 +0000 libstdc++: P1964R2 Wording for boolean-testable This removes the complicated std::boolean concept, as agreed in Prague. * include/bits/ranges_algo.h (__find_fn, __find_first_of_fn) (__adjacent_find_fn): Cast result of predicate to bool. * include/std/concepts (__boolean): Remove. (__detail::__boolean_testable_impl, __detail::__boolean_testable): Add new helper concepts. (__detail::__weakly_eq_cmp_with, totally_ordered, totally_ordered_with) (predicate): Use __boolean_testable instead of boolean. * libsupc++/compare (__detail::__partially_ordered, _Synth3way): Likewise. Diff: --- libstdc++-v3/ChangeLog | 11 ++++++ libstdc++-v3/include/bits/ranges_algo.h | 14 +++---- libstdc++-v3/include/std/concepts | 67 ++++++++++++++------------------- libstdc++-v3/libsupc++/compare | 20 +++++----- 4 files changed, 57 insertions(+), 55 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 547337dda90..7e48bee2b18 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,16 @@ 2020-02-17 Jonathan Wakely + P1964R2 Wording for boolean-testable + * include/bits/ranges_algo.h (__find_fn, __find_first_of_fn) + (__adjacent_find_fn): Cast result of predicate to bool. + * include/std/concepts (__boolean): Remove. + (__detail::__boolean_testable_impl, __detail::__boolean_testable): Add + new helper concepts. + (__detail::__weakly_eq_cmp_with, totally_ordered, totally_ordered_with) + (predicate): Use __boolean_testable instead of boolean. + * libsupc++/compare (__detail::__partially_ordered, _Synth3way): + Likewise. + P1970R2 Consistency for size() functions: Add ranges::ssize * include/bits/range_access.h (_SSize, ssize): Define for C++20. * testsuite/std/ranges/access/ssize.cc: New test. diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h index f3a349ef839..83f295722e9 100644 --- a/libstdc++-v3/include/bits/ranges_algo.h +++ b/libstdc++-v3/include/bits/ranges_algo.h @@ -206,7 +206,7 @@ namespace ranges const _Tp& __value, _Proj __proj = {}) const { while (__first != __last - && !(std::__invoke(__proj, *__first) == __value)) + && !(bool)(std::__invoke(__proj, *__first) == __value)) ++__first; return __first; } @@ -295,9 +295,9 @@ namespace ranges { for (; __first1 != __last1; ++__first1) for (auto __iter = __first2; __iter != __last2; ++__iter) - if (std::__invoke(__pred, - std::__invoke(__proj1, *__first1), - std::__invoke(__proj2, *__iter))) + if ((bool)std::__invoke(__pred, + std::__invoke(__proj1, *__first1), + std::__invoke(__proj2, *__iter))) return __first1; return __first1; } @@ -687,9 +687,9 @@ namespace ranges auto __next = __first; for (; ++__next != __last; __first = __next) { - if (std::__invoke(__pred, - std::__invoke(__proj, *__first), - std::__invoke(__proj, *__next))) + if ((bool)std::__invoke(__pred, + std::__invoke(__proj, *__first), + std::__invoke(__proj, *__next))) return __first; } return __next; diff --git a/libstdc++-v3/include/std/concepts b/libstdc++-v3/include/std/concepts index acc9dd2599d..f3db40b798f 100644 --- a/libstdc++-v3/include/std/concepts +++ b/libstdc++-v3/include/std/concepts @@ -259,27 +259,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // [concepts.compare], comparison concepts - /// [concept.boolean], concept boolean - template - concept boolean - = movable> - && requires(__detail::__cref<_Bp> __b1, __detail::__cref<_Bp> __b2, - const bool __a) { - { __b1 } -> convertible_to; - { !__b1 } -> convertible_to; - { __b1 && __b2 } -> same_as; - { __b1 && __a } -> same_as; - { __a && __b2 } -> same_as; - { __b1 || __b2 } -> same_as; - { __b1 || __a } -> same_as; - { __a || __b2 } -> same_as; - { __b1 == __b2 } -> convertible_to; - { __b1 == __a } -> convertible_to; - { __a == __b2 } -> convertible_to; - { __b1 != __b2 } -> convertible_to; - { __b1 != __a } -> convertible_to; - { __a != __b2 } -> convertible_to; - }; + // [concept.booleantestable], Boolean testability + namespace __detail + { + template + concept __boolean_testable_impl = convertible_to<_Tp, bool>; + + template + concept __boolean_testable + = __boolean_testable_impl<_Tp> + && requires(_Tp&& __t) + { { !static_cast<_Tp&&>(__t) } -> __boolean_testable_impl; }; + } // namespace __detail // [concept.equalitycomparable], concept equality_comparable @@ -288,10 +279,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template concept __weakly_eq_cmp_with = requires(__detail::__cref<_Tp> __t, __detail::__cref<_Up> __u) { - { __t == __u } -> boolean; - { __t != __u } -> boolean; - { __u == __t } -> boolean; - { __u != __t } -> boolean; + { __t == __u } -> __boolean_testable; + { __t != __u } -> __boolean_testable; + { __u == __t } -> __boolean_testable; + { __u != __t } -> __boolean_testable; }; } // namespace __detail @@ -311,10 +302,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION concept totally_ordered = equality_comparable<_Tp> && requires(__detail::__cref<_Tp> __a, __detail::__cref<_Tp> __b) { - { __a < __b } -> boolean; - { __a > __b } -> boolean; - { __a <= __b } -> boolean; - { __a >= __b } -> boolean; + { __a < __b } -> __detail::__boolean_testable; + { __a > __b } -> __detail::__boolean_testable; + { __a <= __b } -> __detail::__boolean_testable; + { __a >= __b } -> __detail::__boolean_testable; }; template @@ -325,14 +316,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __detail::__cref<_Up>>> && equality_comparable_with<_Tp, _Up> && requires(__detail::__cref<_Tp> __t, __detail::__cref<_Up> __u) { - { __t < __u } -> boolean; - { __t > __u } -> boolean; - { __t <= __u } -> boolean; - { __t >= __u } -> boolean; - { __u < __t } -> boolean; - { __u > __t } -> boolean; - { __u <= __t } -> boolean; - { __u >= __t } -> boolean; + { __t < __u } -> __detail::__boolean_testable; + { __t > __u } -> __detail::__boolean_testable; + { __t <= __u } -> __detail::__boolean_testable; + { __t >= __u } -> __detail::__boolean_testable; + { __u < __t } -> __detail::__boolean_testable; + { __u > __t } -> __detail::__boolean_testable; + { __u <= __t } -> __detail::__boolean_testable; + { __u >= __t } -> __detail::__boolean_testable; }; template @@ -351,7 +342,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// [concept.predicate], concept predicate template concept predicate = regular_invocable<_Fn, _Args...> - && boolean>; + && __detail::__boolean_testable>; /// [concept.relation], concept relation template diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare index b2d64ef74a4..ba7db316486 100644 --- a/libstdc++-v3/libsupc++/compare +++ b/libstdc++-v3/libsupc++/compare @@ -416,14 +416,14 @@ namespace std concept __partially_ordered_with = requires(const remove_reference_t<_Tp>& __t, const remove_reference_t<_Up>& __u) { - { __t < __u } -> boolean; - { __t > __u } -> boolean; - { __t <= __u } -> boolean; - { __t >= __u } -> boolean; - { __u < __t } -> boolean; - { __u > __t } -> boolean; - { __u <= __t } -> boolean; - { __u >= __t } -> boolean; + { __t < __u } -> __boolean_testable; + { __t > __u } -> __boolean_testable; + { __t <= __u } -> __boolean_testable; + { __t >= __u } -> __boolean_testable; + { __u < __t } -> __boolean_testable; + { __u > __t } -> __boolean_testable; + { __u <= __t } -> __boolean_testable; + { __u >= __t } -> __boolean_testable; }; } // namespace __detail @@ -879,8 +879,8 @@ namespace std operator()(const _Tp& __t, const _Up& __u) const requires requires { - { __t < __u } -> convertible_to; - { __u < __t } -> convertible_to; + { __t < __u } -> __boolean_testable; + { __u < __t } -> __boolean_testable; } { if constexpr (three_way_comparable_with<_Tp, _Up>)