14#ifndef RANGES_V3_VIEW_VIEW_HPP
15#define RANGES_V3_VIEW_VIEW_HPP
30#include <range/v3/utility/static_const.hpp>
32#include <range/v3/detail/prologue.hpp>
46 constexpr auto CPP_auto_fun(
operator())(I &&i) (
const)
53 struct view_closure_base_
61 template(
typename Rng)(
62 concept (simple_view_impl_)(Rng),
63 same_as<iterator_t<Rng>, iterator_t<Rng const>> AND
64 same_as<sentinel_t<Rng>, sentinel_t<Rng const>>);
68 template<
typename Rng>
69 CPP_concept simple_view_ =
76 template(
typename ViewFn,
typename Rng)(
77 concept (invocable_view_closure_)(ViewFn, Rng),
78 !derived_from<invoke_result_t<ViewFn, Rng>, detail::view_closure_base_>);
82 template<
typename ViewFn,
typename Rng>
83 CPP_concept invocable_view_closure =
84 invocable<ViewFn, Rng> &&
88 template<
typename Rng>
89 constexpr bool simple_view() noexcept
91 return (
bool)simple_view_<Rng>;
96 template<
typename Fun>
109 struct RANGES_STRUCT_WITH_ADL_BARRIER(view_closure_base)
110 : detail::view_closure_base_
114 template(
typename Rng,
typename ViewFn)(
117 friend constexpr auto operator|(Rng && rng, view_closure<ViewFn> vw)
119 return static_cast<ViewFn &&
>(vw)(
static_cast<Rng &&
>(rng));
122#ifndef RANGES_WORKAROUND_CLANG_43400
125 template<
typename Rng,
typename ViewFn>
126 friend constexpr auto
127 operator|(Rng &&, view_closure<ViewFn>
const &)
129 -> CPP_broken_friend_ret(Rng)(
130 requires range<Rng> &&
131 (!viewable_range<Rng>)) =
delete;
141 template<
typename ViewFn,
typename Pipeable>
142 friend constexpr auto operator|(view_closure<ViewFn> vw, Pipeable pipe)
143 -> CPP_broken_friend_ret(view_closure<composed<Pipeable, ViewFn>>)(
144 requires (is_pipeable_v<Pipeable>))
146 return make_view_closure(
147 compose(
static_cast<Pipeable &&
>(pipe),
static_cast<ViewFn &&
>(vw)));
151#ifdef RANGES_WORKAROUND_CLANG_43400
152 namespace RANGES_ADL_BARRIER_FOR(view_closure_base)
156 template(
typename Rng,
typename ViewFn)(
157 requires range<Rng> AND (!viewable_range<Rng>))
159 operator|(Rng &&, view_closure<ViewFn>
const &)
174 template<
typename ViewFn>
182 : ViewFn(
static_cast<ViewFn &&
>(fn))
190 template<
typename ViewFn>
194 template<
typename... Ts,
typename V = ViewFn>
195 static constexpr auto CPP_auto_fun(bind)(Ts &&... ts)
197 return V::bind(
static_cast<Ts &&
>(ts)...)
203 using view_access RANGES_DEPRECATED(
204 "view_access and views::view<> are deprecated. Please "
205 "replace view<> with view_closure<> and discontinue use of view_access.") =
213 template<
typename Fun>
214 constexpr old_view_<Fun> operator()(Fun fun)
const
216 return old_view_<Fun>{
static_cast<Fun &&
>(fun)};
219 using make_view_fn RANGES_DEPRECATED(
220 "make_view_fn is deprecated. Please use "
221 "make_view_closure instead.") = make_view_fn_;
226 "make_view and views::view<> has been deprecated. Please switch to "
227 "make_view_closure and views::view_closure.")
228 RANGES_INLINE_VAR constexpr auto & make_view =
229 static_const<make_view_fn_>::value;
232 template<typename ViewFn>
233 struct old_view_ : pipeable_base
237 friend pipeable_access;
240 template(
typename Rng,
typename Vw)(
241 requires viewable_range<Rng> AND invocable<ViewFn &, Rng>)
242 static constexpr auto pipe(Rng && rng, Vw && v)
244 return v.vw_(
static_cast<Rng &&
>(rng));
248 old_view_() =
default;
250 constexpr explicit old_view_(ViewFn a)
noexcept(
251 std::is_nothrow_move_constructible<ViewFn>::value)
256 template(
typename Rng,
typename... Rest)(
257 requires viewable_range<Rng> AND invocable<ViewFn const &, Rng, Rest...>)
258 constexpr invoke_result_t<ViewFn
const &, Rng, Rest...>
259 operator()(Rng && rng, Rest &&... rest)
const
261 return vw_(
static_cast<Rng &&
>(rng),
static_cast<Rest &&
>(rest)...);
266 template<
typename... Ts,
typename V = ViewFn>
267 constexpr auto CPP_auto_fun(
operator())(Ts &&... ts)(
const)
269 return make_view_fn_{}(
270 view_access_::impl<V>::bind(vw_,
static_cast<Ts &&
>(ts)...))
275 template<
typename ViewFn>
276 using view RANGES_DEPRECATED(
277 "The views::view<> template is deprecated. Please switch to view_closure") =
282 template<
typename ViewFn>
283 RANGES_INLINE_VAR
constexpr bool is_pipeable_v<views::view_closure<ViewFn>> =
true;
287#include <range/v3/detail/epilogue.hpp>
The invocable_view_closure_ concept.
The invocable_view_closure concept.
The simple_view_impl_ concept.
The viewable_range concept.