Message ID | 20230414040042.1498825-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | [1/2] libstdc++: Move down definitions of ranges::cbegin/cend/cetc | expand |
On Fri, 14 Apr 2023 at 05:02, Patrick Palka via Libstdc++ <libstdc++@gcc.gnu.org> wrote: > > This moves down the definitions of the const range access CPOs to after > the definition of input_range in preparation for implementing P2287R4 > which redefines these CPOs in a way that indirectly uses input_range. > > tested on x86_64-pc-linux-gnu, does this look OK for trunk? OK > > libstdc++-v3/ChangeLog: > > * include/bits/ranges_base.h (__cust_access::__as_const) > (__cust_access::_CBegin, __cust::cbegin) > (__cust_access::_CEnd, __cust::cend) > (__cust_access::_CRBegin, __cust::crbegin) > (__cust_access::_CREnd, __cust::crend) > (__cust_access::_CData, __cust::cdata): Move down definitions to > shortly after the definition of input_range. > --- > libstdc++-v3/include/bits/ranges_base.h | 174 +++++++++++++----------- > 1 file changed, 91 insertions(+), 83 deletions(-) > > diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h > index 86952b34096..c89cb3e976a 100644 > --- a/libstdc++-v3/include/bits/ranges_base.h > +++ b/libstdc++-v3/include/bits/ranges_base.h > @@ -177,45 +177,6 @@ namespace ranges > } > }; > > - // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&. > - template<typename _To, typename _Tp> > - constexpr decltype(auto) > - __as_const(_Tp& __t) noexcept > - { > - static_assert(std::is_same_v<_To&, _Tp&>); > - > - if constexpr (is_lvalue_reference_v<_To>) > - return const_cast<const _Tp&>(__t); > - else > - return static_cast<const _Tp&&>(__t); > - } > - > - struct _CBegin > - { > - template<typename _Tp> > - [[nodiscard]] > - constexpr auto > - operator()(_Tp&& __e) const > - noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e)))) > - requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); } > - { > - return _Begin{}(__cust_access::__as_const<_Tp>(__e)); > - } > - }; > - > - struct _CEnd final > - { > - template<typename _Tp> > - [[nodiscard]] > - constexpr auto > - operator()(_Tp&& __e) const > - noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e)))) > - requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); } > - { > - return _End{}(__cust_access::__as_const<_Tp>(__e)); > - } > - }; > - > template<typename _Tp> > concept __member_rbegin = requires(_Tp& __t) > { > @@ -337,32 +298,6 @@ namespace ranges > } > }; > > - struct _CRBegin > - { > - template<typename _Tp> > - [[nodiscard]] > - constexpr auto > - operator()(_Tp&& __e) const > - noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e)))) > - requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); } > - { > - return _RBegin{}(__cust_access::__as_const<_Tp>(__e)); > - } > - }; > - > - struct _CREnd > - { > - template<typename _Tp> > - [[nodiscard]] > - constexpr auto > - operator()(_Tp&& __e) const > - noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e)))) > - requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); } > - { > - return _REnd{}(__cust_access::__as_const<_Tp>(__e)); > - } > - }; > - > template<typename _Tp> > concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>> > && requires(_Tp& __t) > @@ -547,36 +482,18 @@ namespace ranges > } > }; > > - struct _CData > - { > - template<typename _Tp> > - [[nodiscard]] > - constexpr auto > - operator()(_Tp&& __e) const > - noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e)))) > - requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); } > - { > - return _Data{}(__cust_access::__as_const<_Tp>(__e)); > - } > - }; > - > } // namespace __cust_access > > inline namespace __cust > { > inline constexpr __cust_access::_Begin begin{}; > inline constexpr __cust_access::_End end{}; > - inline constexpr __cust_access::_CBegin cbegin{}; > - inline constexpr __cust_access::_CEnd cend{}; > inline constexpr __cust_access::_RBegin rbegin{}; > inline constexpr __cust_access::_REnd rend{}; > - inline constexpr __cust_access::_CRBegin crbegin{}; > - inline constexpr __cust_access::_CREnd crend{}; > inline constexpr __cust_access::_Size size{}; > inline constexpr __cust_access::_SSize ssize{}; > inline constexpr __cust_access::_Empty empty{}; > inline constexpr __cust_access::_Data data{}; > - inline constexpr __cust_access::_CData cdata{}; > } > > /// [range.range] The range concept. > @@ -690,6 +607,97 @@ namespace ranges > concept common_range > = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>; > > + namespace __cust_access > + { > + // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&. > + template<typename _To, typename _Tp> > + constexpr decltype(auto) > + __as_const(_Tp& __t) noexcept > + { > + static_assert(std::is_same_v<_To&, _Tp&>); > + > + if constexpr (is_lvalue_reference_v<_To>) > + return const_cast<const _Tp&>(__t); > + else > + return static_cast<const _Tp&&>(__t); > + } > + > + struct _CBegin > + { > + template<typename _Tp> > + [[nodiscard]] > + constexpr auto > + operator()(_Tp&& __e) const > + noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e)))) > + requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); } > + { > + return _Begin{}(__cust_access::__as_const<_Tp>(__e)); > + } > + }; > + > + struct _CEnd final > + { > + template<typename _Tp> > + [[nodiscard]] > + constexpr auto > + operator()(_Tp&& __e) const > + noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e)))) > + requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); } > + { > + return _End{}(__cust_access::__as_const<_Tp>(__e)); > + } > + }; > + > + struct _CRBegin > + { > + template<typename _Tp> > + [[nodiscard]] > + constexpr auto > + operator()(_Tp&& __e) const > + noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e)))) > + requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); } > + { > + return _RBegin{}(__cust_access::__as_const<_Tp>(__e)); > + } > + }; > + > + struct _CREnd > + { > + template<typename _Tp> > + [[nodiscard]] > + constexpr auto > + operator()(_Tp&& __e) const > + noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e)))) > + requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); } > + { > + return _REnd{}(__cust_access::__as_const<_Tp>(__e)); > + } > + }; > + > + struct _CData > + { > + template<typename _Tp> > + [[nodiscard]] > + constexpr auto > + operator()(_Tp&& __e) const > + noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e)))) > + requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); } > + { > + return _Data{}(__cust_access::__as_const<_Tp>(__e)); > + } > + }; > + > + } // namespace __cust_access > + > + inline namespace __cust > + { > + inline constexpr __cust_access::_CBegin cbegin{}; > + inline constexpr __cust_access::_CEnd cend{}; > + inline constexpr __cust_access::_CRBegin crbegin{}; > + inline constexpr __cust_access::_CREnd crend{}; > + inline constexpr __cust_access::_CData cdata{}; > + } > + > namespace __detail > { > template<typename _Tp> > -- > 2.40.0.335.g9857273be0 >
diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h index 86952b34096..c89cb3e976a 100644 --- a/libstdc++-v3/include/bits/ranges_base.h +++ b/libstdc++-v3/include/bits/ranges_base.h @@ -177,45 +177,6 @@ namespace ranges } }; - // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&. - template<typename _To, typename _Tp> - constexpr decltype(auto) - __as_const(_Tp& __t) noexcept - { - static_assert(std::is_same_v<_To&, _Tp&>); - - if constexpr (is_lvalue_reference_v<_To>) - return const_cast<const _Tp&>(__t); - else - return static_cast<const _Tp&&>(__t); - } - - struct _CBegin - { - template<typename _Tp> - [[nodiscard]] - constexpr auto - operator()(_Tp&& __e) const - noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e)))) - requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); } - { - return _Begin{}(__cust_access::__as_const<_Tp>(__e)); - } - }; - - struct _CEnd final - { - template<typename _Tp> - [[nodiscard]] - constexpr auto - operator()(_Tp&& __e) const - noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e)))) - requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); } - { - return _End{}(__cust_access::__as_const<_Tp>(__e)); - } - }; - template<typename _Tp> concept __member_rbegin = requires(_Tp& __t) { @@ -337,32 +298,6 @@ namespace ranges } }; - struct _CRBegin - { - template<typename _Tp> - [[nodiscard]] - constexpr auto - operator()(_Tp&& __e) const - noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e)))) - requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); } - { - return _RBegin{}(__cust_access::__as_const<_Tp>(__e)); - } - }; - - struct _CREnd - { - template<typename _Tp> - [[nodiscard]] - constexpr auto - operator()(_Tp&& __e) const - noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e)))) - requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); } - { - return _REnd{}(__cust_access::__as_const<_Tp>(__e)); - } - }; - template<typename _Tp> concept __member_size = !disable_sized_range<remove_cvref_t<_Tp>> && requires(_Tp& __t) @@ -547,36 +482,18 @@ namespace ranges } }; - struct _CData - { - template<typename _Tp> - [[nodiscard]] - constexpr auto - operator()(_Tp&& __e) const - noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e)))) - requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); } - { - return _Data{}(__cust_access::__as_const<_Tp>(__e)); - } - }; - } // namespace __cust_access inline namespace __cust { inline constexpr __cust_access::_Begin begin{}; inline constexpr __cust_access::_End end{}; - inline constexpr __cust_access::_CBegin cbegin{}; - inline constexpr __cust_access::_CEnd cend{}; inline constexpr __cust_access::_RBegin rbegin{}; inline constexpr __cust_access::_REnd rend{}; - inline constexpr __cust_access::_CRBegin crbegin{}; - inline constexpr __cust_access::_CREnd crend{}; inline constexpr __cust_access::_Size size{}; inline constexpr __cust_access::_SSize ssize{}; inline constexpr __cust_access::_Empty empty{}; inline constexpr __cust_access::_Data data{}; - inline constexpr __cust_access::_CData cdata{}; } /// [range.range] The range concept. @@ -690,6 +607,97 @@ namespace ranges concept common_range = range<_Tp> && same_as<iterator_t<_Tp>, sentinel_t<_Tp>>; + namespace __cust_access + { + // If _To is an lvalue-reference, return const _Tp&, otherwise const _Tp&&. + template<typename _To, typename _Tp> + constexpr decltype(auto) + __as_const(_Tp& __t) noexcept + { + static_assert(std::is_same_v<_To&, _Tp&>); + + if constexpr (is_lvalue_reference_v<_To>) + return const_cast<const _Tp&>(__t); + else + return static_cast<const _Tp&&>(__t); + } + + struct _CBegin + { + template<typename _Tp> + [[nodiscard]] + constexpr auto + operator()(_Tp&& __e) const + noexcept(noexcept(_Begin{}(__cust_access::__as_const<_Tp>(__e)))) + requires requires { _Begin{}(__cust_access::__as_const<_Tp>(__e)); } + { + return _Begin{}(__cust_access::__as_const<_Tp>(__e)); + } + }; + + struct _CEnd final + { + template<typename _Tp> + [[nodiscard]] + constexpr auto + operator()(_Tp&& __e) const + noexcept(noexcept(_End{}(__cust_access::__as_const<_Tp>(__e)))) + requires requires { _End{}(__cust_access::__as_const<_Tp>(__e)); } + { + return _End{}(__cust_access::__as_const<_Tp>(__e)); + } + }; + + struct _CRBegin + { + template<typename _Tp> + [[nodiscard]] + constexpr auto + operator()(_Tp&& __e) const + noexcept(noexcept(_RBegin{}(__cust_access::__as_const<_Tp>(__e)))) + requires requires { _RBegin{}(__cust_access::__as_const<_Tp>(__e)); } + { + return _RBegin{}(__cust_access::__as_const<_Tp>(__e)); + } + }; + + struct _CREnd + { + template<typename _Tp> + [[nodiscard]] + constexpr auto + operator()(_Tp&& __e) const + noexcept(noexcept(_REnd{}(__cust_access::__as_const<_Tp>(__e)))) + requires requires { _REnd{}(__cust_access::__as_const<_Tp>(__e)); } + { + return _REnd{}(__cust_access::__as_const<_Tp>(__e)); + } + }; + + struct _CData + { + template<typename _Tp> + [[nodiscard]] + constexpr auto + operator()(_Tp&& __e) const + noexcept(noexcept(_Data{}(__cust_access::__as_const<_Tp>(__e)))) + requires requires { _Data{}(__cust_access::__as_const<_Tp>(__e)); } + { + return _Data{}(__cust_access::__as_const<_Tp>(__e)); + } + }; + + } // namespace __cust_access + + inline namespace __cust + { + inline constexpr __cust_access::_CBegin cbegin{}; + inline constexpr __cust_access::_CEnd cend{}; + inline constexpr __cust_access::_CRBegin crbegin{}; + inline constexpr __cust_access::_CREnd crend{}; + inline constexpr __cust_access::_CData cdata{}; + } + namespace __detail { template<typename _Tp>