File indexing completed on 2026-05-03 08:13:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___CXX03___RANGES_COMMON_VIEW_H
0011 #define _LIBCPP___CXX03___RANGES_COMMON_VIEW_H
0012
0013 #include <__cxx03/__concepts/constructible.h>
0014 #include <__cxx03/__concepts/copyable.h>
0015 #include <__cxx03/__config>
0016 #include <__cxx03/__iterator/common_iterator.h>
0017 #include <__cxx03/__iterator/iterator_traits.h>
0018 #include <__cxx03/__ranges/access.h>
0019 #include <__cxx03/__ranges/all.h>
0020 #include <__cxx03/__ranges/concepts.h>
0021 #include <__cxx03/__ranges/enable_borrowed_range.h>
0022 #include <__cxx03/__ranges/range_adaptor.h>
0023 #include <__cxx03/__ranges/size.h>
0024 #include <__cxx03/__ranges/view_interface.h>
0025 #include <__cxx03/__utility/forward.h>
0026 #include <__cxx03/__utility/move.h>
0027
0028 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0029 # pragma GCC system_header
0030 #endif
0031
0032 _LIBCPP_PUSH_MACROS
0033 #include <__cxx03/__undef_macros>
0034
0035 _LIBCPP_BEGIN_NAMESPACE_STD
0036
0037 #if _LIBCPP_STD_VER >= 20
0038
0039 namespace ranges {
0040
0041 template <view _View>
0042 requires(!common_range<_View> && copyable<iterator_t<_View>>)
0043 class common_view : public view_interface<common_view<_View>> {
0044 _View __base_ = _View();
0045
0046 public:
0047 _LIBCPP_HIDE_FROM_ABI common_view()
0048 requires default_initializable<_View>
0049 = default;
0050
0051 _LIBCPP_HIDE_FROM_ABI constexpr explicit common_view(_View __v) : __base_(std::move(__v)) {}
0052
0053 _LIBCPP_HIDE_FROM_ABI constexpr _View base() const&
0054 requires copy_constructible<_View>
0055 {
0056 return __base_;
0057 }
0058
0059 _LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }
0060
0061 _LIBCPP_HIDE_FROM_ABI constexpr auto begin() {
0062 if constexpr (random_access_range<_View> && sized_range<_View>)
0063 return ranges::begin(__base_);
0064 else
0065 return common_iterator<iterator_t<_View>, sentinel_t<_View>>(ranges::begin(__base_));
0066 }
0067
0068 _LIBCPP_HIDE_FROM_ABI constexpr auto begin() const
0069 requires range<const _View>
0070 {
0071 if constexpr (random_access_range<const _View> && sized_range<const _View>)
0072 return ranges::begin(__base_);
0073 else
0074 return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::begin(__base_));
0075 }
0076
0077 _LIBCPP_HIDE_FROM_ABI constexpr auto end() {
0078 if constexpr (random_access_range<_View> && sized_range<_View>)
0079 return ranges::begin(__base_) + ranges::size(__base_);
0080 else
0081 return common_iterator<iterator_t<_View>, sentinel_t<_View>>(ranges::end(__base_));
0082 }
0083
0084 _LIBCPP_HIDE_FROM_ABI constexpr auto end() const
0085 requires range<const _View>
0086 {
0087 if constexpr (random_access_range<const _View> && sized_range<const _View>)
0088 return ranges::begin(__base_) + ranges::size(__base_);
0089 else
0090 return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::end(__base_));
0091 }
0092
0093 _LIBCPP_HIDE_FROM_ABI constexpr auto size()
0094 requires sized_range<_View>
0095 {
0096 return ranges::size(__base_);
0097 }
0098
0099 _LIBCPP_HIDE_FROM_ABI constexpr auto size() const
0100 requires sized_range<const _View>
0101 {
0102 return ranges::size(__base_);
0103 }
0104 };
0105
0106 template <class _Range>
0107 common_view(_Range&&) -> common_view<views::all_t<_Range>>;
0108
0109 template <class _View>
0110 inline constexpr bool enable_borrowed_range<common_view<_View>> = enable_borrowed_range<_View>;
0111
0112 namespace views {
0113 namespace __common {
0114 struct __fn : __range_adaptor_closure<__fn> {
0115 template <class _Range>
0116 requires common_range<_Range>
0117 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const noexcept(
0118 noexcept(views::all(std::forward<_Range>(__range)))) -> decltype(views::all(std::forward<_Range>(__range))) {
0119 return views::all(std::forward<_Range>(__range));
0120 }
0121
0122 template <class _Range>
0123 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const noexcept(noexcept(common_view{
0124 std::forward<_Range>(__range)})) -> decltype(common_view{std::forward<_Range>(__range)}) {
0125 return common_view{std::forward<_Range>(__range)};
0126 }
0127 };
0128 }
0129
0130 inline namespace __cpo {
0131 inline constexpr auto common = __common::__fn{};
0132 }
0133 }
0134 }
0135
0136 #endif
0137
0138 _LIBCPP_END_NAMESPACE_STD
0139
0140 _LIBCPP_POP_MACROS
0141
0142 #endif