14#ifndef RANGES_V3_ACTION_PUSH_BACK_HPP
15#define RANGES_V3_ACTION_PUSH_BACK_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_back_detail
40 template<
typename Cont,
typename T>
41 using push_back_t =
decltype(
static_cast<void>(
42 unwrap_reference(std::declval<Cont &>()).push_back(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<sentinel_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_back_t<Cont, T>
push_back(Cont && cont, T && t)
54 unwrap_reference(cont).push_back(
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_back(Cont && cont, Rng && rng)
61 ranges::insert(cont, end(cont),
static_cast<Rng &&
>(rng));
68 template<
typename Rng,
typename T>
69 CPP_requires(can_push_back_frag_,
70 requires(Rng && rng, T && t)
76 template<
typename Rng,
typename T>
77 CPP_concept can_push_back_ =
78 CPP_requires_ref(adl_push_back_detail::can_push_back_frag_, Rng, T);
85 constexpr auto operator()(T && val)
const
87 return make_action_closure(
93 constexpr auto operator()(T & t)
const
95 return make_action_closure(
96 bind_back(
push_back_fn{}, detail::reference_wrapper_<T>(t)));
100 constexpr auto operator()(std::initializer_list<T> val)
const
102 return make_action_closure(bind_back(
push_back_fn{}, val));
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_back(rng,
static_cast<T &&
>(t));
111 return static_cast<Rng &&
>(rng);
114 template(
typename Rng,
typename T)(
116 can_push_back_<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_back_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_back_detail::push_back_fn, push_back)
142 using actions::push_back;
147#include <range/v3/detail/epilogue.hpp>
Definition push_back.hpp:83