Go to the documentation of this file.
4 #ifndef LEXY_CALLBACK_CONTAINER_HPP_INCLUDED
5 #define LEXY_CALLBACK_CONTAINER_HPP_INCLUDED
13 template <
typename Container>
15 template <
typename Container>
16 constexpr
auto _has_reserve = _detail::is_detected<_detect_reserve, Container>;
18 template <
typename Container>
20 template <
typename Container>
21 constexpr
auto _has_append = _detail::is_detected<_detect_append, Container>;
27 template <
typename Container>
34 template <
typename C = Container,
typename U>
40 template <
typename C = Container,
typename... Args>
52 template <
typename Container,
typename AllocFn>
59 template <
typename State>
65 constexpr Container
operator()(Container&& container)
const
74 template <
typename... Args>
80 if constexpr (_has_reserve<Container>)
81 result.reserve(
sizeof...(args));
82 (result.emplace_back(
LEXY_FWD(args)), ...);
87 template <
typename State>
93 template <
typename State>
94 constexpr
auto sink(State& state)
const
100 template <
typename Container>
114 template <
typename... Args>
120 if constexpr (_has_reserve<Container>)
121 result.reserve(
sizeof...(args));
122 (result.emplace_back(
LEXY_FWD(args)), ...);
125 template <
typename C = Container,
typename... Args>
130 if constexpr (_has_reserve<Container>)
131 result.reserve(
sizeof...(args));
132 (result.emplace_back(
LEXY_FWD(args)), ...);
140 template <
typename C = Container>
146 template <
typename AllocFn>
153 return allocator([](
const auto& alloc) {
return alloc; });
159 template <
typename Container>
166 template <
typename Container>
173 template <
typename C = Container,
typename U>
179 template <
typename C = Container,
typename... Args>
191 template <
typename Container,
typename AllocFn>
198 template <
typename State>
213 template <
typename... Args>
219 if constexpr (_has_reserve<Container>)
220 result.reserve(
sizeof...(args));
221 (result.emplace(
LEXY_FWD(args)), ...);
226 template <
typename State>
232 template <
typename State>
233 constexpr
auto sink(State& state)
const
239 template <
typename Container>
253 template <
typename... Args>
259 if constexpr (_has_reserve<Container>)
260 result.reserve(
sizeof...(args));
261 (result.emplace(
LEXY_FWD(args)), ...);
265 template <
typename C = Container,
typename... Args>
270 if constexpr (_has_reserve<Container>)
271 result.reserve(
sizeof...(args));
272 (result.emplace(
LEXY_FWD(args)), ...);
280 template <
typename C = Container>
286 template <
typename AllocFn>
293 return allocator([](
const auto& alloc) {
return alloc; });
299 template <
typename T>
306 template <
typename Container>
316 template <
typename... Tail>
317 constexpr Container
_call(Container&& head, Tail&&... tail)
const
319 if constexpr (
sizeof...(Tail) == 0)
323 if constexpr (_has_reserve<Container>)
325 auto total_size = (head.size() + ... + tail.size());
326 head.reserve(total_size);
329 auto append = [&head](Container&& container) {
330 if constexpr (_has_append<Container>)
336 for (
auto& elem : container)
346 template <
typename... Args>
366 else if constexpr (_has_append<Container>)
372 if constexpr (_has_reserve<Container>)
374 auto capacity =
_result.capacity();
375 auto total_size =
_result.size() + container.size();
376 if (total_size > capacity)
379 auto exp_capacity = 2 * capacity;
380 if (total_size > exp_capacity)
387 for (
auto& elem : container)
404 template <
typename Container>
411 template <
typename Container,
typename Callback>
416 template <
typename C = Container>
423 template <
typename... Args>
439 template <
typename Callback>
448 template <
typename... Args>
466 template <
typename Container,
typename Callback>
476 template <
typename C = Container>
477 constexpr
auto sink(
const typename C::allocator_type& allocator)
const
488 template <
typename Callback>
491 using callback_t = std::decay_t<Callback>;
492 static_assert(std::is_void_v<typename callback_t::return_type>,
493 "need to specify a container to collect into for non-void callbacks");
498 template <
typename Container,
typename Callback>
501 using callback_t = std::decay_t<Callback>;
502 static_assert(!std::is_void_v<typename callback_t::return_type>,
503 "cannot collect a void callback into a container");
508 #endif // LEXY_CALLBACK_CONTAINER_HPP_INCLUDED
constexpr _collect_sink(Callback callback)
constexpr auto operator()(Args &&... args) const -> LEXY_DECAY_DECLTYPE((LEXY_DECLVAL(Container &).insert(LEXY_FWD(args)),...), LEXY_DECLVAL(Container))
constexpr auto collect(Callback &&callback)
constexpr auto operator()(Args &&... args) const -> LEXY_DECAY_DECLTYPE((LEXY_DECLVAL(Container &).push_back(LEXY_FWD(args)),...), LEXY_DECLVAL(Container))
constexpr auto sink(const typename C::allocator_type &allocator) const
void operator()(Container &&container)
constexpr _collect_sink(Callback callback, const typename C::allocator_type &allocator)
constexpr auto allocator() const
constexpr auto _has_append
constexpr Container operator()(Container &&container) const
constexpr auto allocator() const
constexpr Container operator()(Container &&container) const
auto operator()(Args &&... args) -> decltype(LEXY_DECLVAL(C &).emplace_back(LEXY_FWD(args)...))
constexpr auto as_collection
constexpr auto operator()(Args &&... args) -> decltype(void(LEXY_DECLVAL(Callback)(LEXY_FWD(args)...)))
constexpr Container operator()(nullopt &&) const
auto operator()(U &&obj) -> decltype(LEXY_DECLVAL(C &).push_back(LEXY_FWD(obj)))
constexpr auto operator()(const typename C::allocator_type &allocator, Args &&... args) const -> decltype((LEXY_DECLVAL(C &).push_back(LEXY_FWD(args)),...), C(allocator))
constexpr auto sink() const
constexpr auto callback(Fns &&... fns)
Creates a callback.
constexpr auto sink() const
constexpr auto operator[](State &state) const
constexpr Container operator()(nullopt &&) const
constexpr auto operator()(Args &&... args) const -> decltype(_call(Container(LEXY_FWD(args))...))
LEXY_EMPTY_MEMBER Callback _callback
constexpr auto allocator(AllocFn alloc_fn) const
constexpr _collect_sink(Callback callback)
constexpr auto sink(const typename C::allocator_type &allocator) const
constexpr auto sink(State &state) const
#define LEXY_DECAY_DECLTYPE(...)
LEXY_EMPTY_MEMBER Callback _callback
constexpr auto sink() const
constexpr auto invoke(F ClassT::*f, Args &&... args) -> decltype(_mem_invoker< F ClassT::* >::invoke(f, LEXY_FWD(args)...))
constexpr Container operator()(Container &&container) const
auto operator()(U &&obj) -> decltype(LEXY_DECLVAL(C &).insert(LEXY_FWD(obj)))
constexpr Container operator()(nullopt &&) const
decltype(LEXY_DECLVAL(Container &).reserve(std::size_t())) _detect_reserve
constexpr auto _has_reserve
constexpr Container operator()(nullopt &&) const
constexpr auto operator()(Args &&... args) -> decltype(void(LEXY_DECLVAL(Callback)(LEXY_FWD(args)...)))
constexpr auto operator[](State &state) const
constexpr auto sink(State &state) const
constexpr Container _call(Container &&head, Tail &&... tail) const
constexpr auto finish() &&
constexpr _collect(Callback callback)
constexpr auto sink() const
constexpr auto allocator(AllocFn alloc_fn) const
constexpr auto sink(const typename C::allocator_type &allocator) const
constexpr Container operator()(nullopt &&) const
constexpr auto operator()(Args &&... args) const -> LEXY_DECAY_DECLTYPE((LEXY_DECLVAL(Container &).push_back(LEXY_FWD(args)),...), LEXY_DECLVAL(Container))
constexpr auto operator()(Args &&... args) const -> LEXY_DECAY_DECLTYPE((LEXY_DECLVAL(Container &).insert(LEXY_FWD(args)),...), LEXY_DECLVAL(Container))
#define LEXY_EMPTY_MEMBER
LEXY_EMPTY_MEMBER Callback _callback
#define LEXY_DECLVAL(...)
constexpr Container operator()(Container &&container) const
auto operator()(Args &&... args) -> decltype(LEXY_DECLVAL(C &).emplace(LEXY_FWD(args)...))
constexpr auto operator()(const typename C::allocator_type &allocator, Args &&... args) const -> decltype((LEXY_DECLVAL(C &).insert(LEXY_FWD(args)),...), C(allocator))
decltype(LEXY_DECLVAL(Container &).append(LEXY_DECLVAL(Container &&))) _detect_append
constexpr auto finish() &&