14 #ifndef RANGES_V3_VIEW_VIEW_HPP
15 #define RANGES_V3_VIEW_VIEW_HPP
17 #include <type_traits>
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>
72 CPP_concept_ref(ranges::simple_view_impl_, Rng);
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>
84 invocable<ViewFn, Rng> &&
85 CPP_concept_ref(ranges::invocable_view_closure_, 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)(
115 requires viewable_range<Rng> AND
116 invocable_view_closure<ViewFn, Rng>)
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;
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>
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector >>, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
CPP_concept simple_view_
\concept simple_view_
Definition: view.hpp:69
template(typename ViewFn, typename Rng)(concept(invocable_view_closure_)(ViewFn
\concept invocable_view_closure_
CPP_concept invocable_view_closure
\concept invocable_view_closure
Definition: view.hpp:83