14#ifndef RANGES_V3_ACTION_PUSH_FRONT_HPP
15#define RANGES_V3_ACTION_PUSH_FRONT_HPP
25#include <range/v3/detail/with_braced_init_args.hpp>
27#include <range/v3/utility/static_const.hpp>
29#include <range/v3/detail/prologue.hpp>
37 namespace adl_push_front_detail
40 template<
typename Cont,
typename T>
41 using push_front_t =
decltype(
static_cast<void>(
42 unwrap_reference(std::declval<Cont &>()).push_front(std::declval<T>())));
44 template<
typename Cont,
typename Rng>
45 using insert_t =
decltype(
static_cast<void>(
46 ranges::insert(std::declval<Cont &>(), std::declval<iterator_t<Cont>>(),
47 std::declval<Rng>())));
49 template(
typename Cont,
typename T)(
50 requires lvalue_container_like<Cont> AND
51 (!range<T>) AND constructible_from<range_value_t<Cont>, T>)
52 push_front_t<Cont, T>
push_front(Cont && cont, T && t)
54 unwrap_reference(cont).push_front(
static_cast<T &&
>(t));
57 template(
typename Cont,
typename Rng)(
58 requires lvalue_container_like<Cont> AND range<Rng>)
59 insert_t<Cont, Rng>
push_front(Cont && cont, Rng && rng)
61 ranges::insert(cont, begin(cont),
static_cast<Rng &&
>(rng));
68 template<
typename Rng,
typename T>
69 CPP_requires(can_push_front_frag_,
70 requires(Rng && rng, T && t)
76 template<
typename Rng,
typename T>
77 CPP_concept can_push_front_ =
78 CPP_requires_ref(adl_push_front_detail::can_push_front_frag_, Rng, T);
85 constexpr auto operator()(T && val)
const
87 return make_action_closure(
92 constexpr auto operator()(std::initializer_list<T> val)
const
99 constexpr auto operator()(T & t)
const
101 return make_action_closure(
102 bind_back(
push_front_fn{}, detail::reference_wrapper_<T>(t)));
105 template(
typename Rng,
typename T)(
107 (
range<T> || constructible_from<range_value_t<Rng>, T>))
108 Rng
operator()(Rng && rng, T && t)
const
110 push_front(rng,
static_cast<T &&
>(t));
111 return static_cast<Rng &&
>(rng);
114 template(
typename Rng,
typename T)(
116 can_push_front_<Rng, std::initializer_list<T>> AND
117 constructible_from<range_value_t<Rng>, T
const &>)
118 Rng operator()(Rng && rng, std::initializer_list<T> t)
const
121 return static_cast<Rng &&
>(rng);
125 template<
typename Rng,
typename T>
126 invoke_result_t<push_front_fn, Rng, T &>
127 operator()(Rng && rng, detail::reference_wrapper_<T> r)
const
129 return (*
this)(
static_cast<Rng &&
>(rng), r.get());
139 RANGES_INLINE_VARIABLE(adl_push_front_detail::push_front_fn, push_front)
142 using actions::push_front;
147#include <range/v3/detail/epilogue.hpp>
Definition push_front.hpp:83