Skip to content

Commit

Permalink
libstdc++: Move down definitions of ranges::cbegin/cend/cetc
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Patrick Palka committed Apr 14, 2023
1 parent 7639bf3 commit 2ab0d83
Showing 1 changed file with 91 additions and 83 deletions.
174 changes: 91 additions & 83 deletions libstdc++-v3/include/bits/ranges_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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>
Expand Down

0 comments on commit 2ab0d83

Please sign in to comment.