mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 14:30:59 +08:00
libstdc++: Move down definitions of ranges::cbegin/cend/cetc
This moves down the definitions of the range const-access CPOs to after the definition of input_range in preparation for implementing P2278R4 which redefines these CPOs in a way that indirectly uses input_range. 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.
This commit is contained in:
parent
7639bf34fa
commit
2ab0d83e88
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user