Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:40

0001 // -*- C++ -*-
0002 //===----------------------------------------------------------------------===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 } // namespace __common
0129 
0130 inline namespace __cpo {
0131 inline constexpr auto common = __common::__fn{};
0132 } // namespace __cpo
0133 } // namespace views
0134 } // namespace ranges
0135 
0136 #endif // _LIBCPP_STD_VER >= 20
0137 
0138 _LIBCPP_END_NAMESPACE_STD
0139 
0140 _LIBCPP_POP_MACROS
0141 
0142 #endif // _LIBCPP___CXX03___RANGES_COMMON_VIEW_H