Path: blob/main/contrib/llvm-project/libcxx/include/__ranges/common_view.h
35236 views
// -*- C++ -*-1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#ifndef _LIBCPP___RANGES_COMMON_VIEW_H10#define _LIBCPP___RANGES_COMMON_VIEW_H1112#include <__concepts/constructible.h>13#include <__concepts/copyable.h>14#include <__config>15#include <__iterator/common_iterator.h>16#include <__iterator/iterator_traits.h>17#include <__ranges/access.h>18#include <__ranges/all.h>19#include <__ranges/concepts.h>20#include <__ranges/enable_borrowed_range.h>21#include <__ranges/range_adaptor.h>22#include <__ranges/size.h>23#include <__ranges/view_interface.h>24#include <__utility/forward.h>25#include <__utility/move.h>2627#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)28# pragma GCC system_header29#endif3031_LIBCPP_PUSH_MACROS32#include <__undef_macros>3334_LIBCPP_BEGIN_NAMESPACE_STD3536#if _LIBCPP_STD_VER >= 203738namespace ranges {3940template <view _View>41requires(!common_range<_View> && copyable<iterator_t<_View>>)42class common_view : public view_interface<common_view<_View>> {43_View __base_ = _View();4445public:46_LIBCPP_HIDE_FROM_ABI common_view()47requires default_initializable<_View>48= default;4950_LIBCPP_HIDE_FROM_ABI constexpr explicit common_view(_View __v) : __base_(std::move(__v)) {}5152_LIBCPP_HIDE_FROM_ABI constexpr _View base() const&53requires copy_constructible<_View>54{55return __base_;56}5758_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }5960_LIBCPP_HIDE_FROM_ABI constexpr auto begin() {61if constexpr (random_access_range<_View> && sized_range<_View>)62return ranges::begin(__base_);63else64return common_iterator<iterator_t<_View>, sentinel_t<_View>>(ranges::begin(__base_));65}6667_LIBCPP_HIDE_FROM_ABI constexpr auto begin() const68requires range<const _View>69{70if constexpr (random_access_range<const _View> && sized_range<const _View>)71return ranges::begin(__base_);72else73return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::begin(__base_));74}7576_LIBCPP_HIDE_FROM_ABI constexpr auto end() {77if constexpr (random_access_range<_View> && sized_range<_View>)78return ranges::begin(__base_) + ranges::size(__base_);79else80return common_iterator<iterator_t<_View>, sentinel_t<_View>>(ranges::end(__base_));81}8283_LIBCPP_HIDE_FROM_ABI constexpr auto end() const84requires range<const _View>85{86if constexpr (random_access_range<const _View> && sized_range<const _View>)87return ranges::begin(__base_) + ranges::size(__base_);88else89return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::end(__base_));90}9192_LIBCPP_HIDE_FROM_ABI constexpr auto size()93requires sized_range<_View>94{95return ranges::size(__base_);96}9798_LIBCPP_HIDE_FROM_ABI constexpr auto size() const99requires sized_range<const _View>100{101return ranges::size(__base_);102}103};104105template <class _Range>106common_view(_Range&&) -> common_view<views::all_t<_Range>>;107108template <class _View>109inline constexpr bool enable_borrowed_range<common_view<_View>> = enable_borrowed_range<_View>;110111namespace views {112namespace __common {113struct __fn : __range_adaptor_closure<__fn> {114template <class _Range>115requires common_range<_Range>116[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const noexcept(117noexcept(views::all(std::forward<_Range>(__range)))) -> decltype(views::all(std::forward<_Range>(__range))) {118return views::all(std::forward<_Range>(__range));119}120121template <class _Range>122[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Range&& __range) const noexcept(noexcept(common_view{123std::forward<_Range>(__range)})) -> decltype(common_view{std::forward<_Range>(__range)}) {124return common_view{std::forward<_Range>(__range)};125}126};127} // namespace __common128129inline namespace __cpo {130inline constexpr auto common = __common::__fn{};131} // namespace __cpo132} // namespace views133} // namespace ranges134135#endif // _LIBCPP_STD_VER >= 20136137_LIBCPP_END_NAMESPACE_STD138139_LIBCPP_POP_MACROS140141#endif // _LIBCPP___RANGES_COMMON_VIEW_H142143144