composition.hpp
Go to the documentation of this file.
1 // Copyright (C) 2020-2023 Jonathan Müller and lexy contributors
2 // SPDX-License-Identifier: BSL-1.0
3 
4 #ifndef LEXY_CALLBACK_COMPOSITION_HPP_INCLUDED
5 #define LEXY_CALLBACK_COMPOSITION_HPP_INCLUDED
6 
7 #include <lexy/callback/base.hpp>
8 
9 namespace lexy
10 {
11 template <typename Cb, typename State, typename = void>
13 {
14  const Cb& _cb;
15  State& _state;
16 
17  using return_type = typename Cb::return_type;
18 
19  template <typename... Args>
20  constexpr auto operator()(Args&&... args) const -> decltype(_cb(LEXY_FWD(args)...))
21  {
22  return _cb(LEXY_FWD(args)...);
23  }
24 };
25 template <typename Cb, typename State>
26 struct _compose_state<Cb, State, std::enable_if_t<lexy::is_callback_state<Cb, State>>>
27 {
28  const Cb& _cb;
29  State& _state;
30 
31  using return_type = typename Cb::return_type;
32 
33  template <typename... Args>
34  constexpr auto operator()(Args&&... args) const -> decltype(_cb[_state](LEXY_FWD(args)...))
35  {
36  return _cb[_state](LEXY_FWD(args)...);
37  }
38 };
39 
40 template <typename First, typename Second>
42 {
45 
46  constexpr explicit _compose_cb(First&& first, Second&& second)
47  : _first(LEXY_MOV(first)), _second(LEXY_MOV(second))
48  {}
49 
50  using return_type = typename Second::return_type;
51 
52  template <typename State,
53  typename = std::enable_if_t<lexy::is_callback_state<First, State> //
54  || lexy::is_callback_state<Second, State>>>
55  constexpr auto operator[](State& state) const
56  {
57  auto first = _compose_state<First, State>{_first, state};
58  auto second = _compose_state<Second, State>{_second, state};
59  return lexy::_compose_cb(LEXY_MOV(first), LEXY_MOV(second));
60  }
61 
62  template <typename... Args>
63  constexpr auto operator()(Args&&... args) const
65  {
66  return _second(_first(LEXY_FWD(args)...));
67  }
68 };
69 
70 template <typename Sink, typename Callback>
71 struct _compose_s
72 {
75 
76  using return_type = typename Callback::return_type;
77 
78  template <typename... Args>
79  constexpr auto sink(Args&&... args) const -> decltype(_sink.sink(LEXY_FWD(args)...))
80  {
81  return _sink.sink(LEXY_FWD(args)...);
82  }
83 
84  template <typename State, typename = std::enable_if_t<lexy::is_callback_state<Callback, State>>>
85  constexpr auto operator[](State& state) const
86  {
88  }
89 
90  template <typename... Args>
91  constexpr auto operator()(Args&&... args) const -> decltype(_callback(LEXY_FWD(args)...))
92  {
93  return _callback(LEXY_FWD(args)...);
94  }
95 };
96 
98 template <typename First, typename Second, typename = _detect_callback<First>,
99  typename = _detect_callback<Second>>
100 constexpr auto operator|(First first, Second second)
101 {
102  return _compose_cb(LEXY_MOV(first), LEXY_MOV(second));
103 }
104 template <typename S, typename Cb, typename Second>
105 constexpr auto operator|(_compose_s<S, Cb> composed, Second second)
106 {
107  auto cb = LEXY_MOV(composed._callback) | LEXY_MOV(second);
108  return _compose_s<S, decltype(cb)>{LEXY_MOV(composed._sink), LEXY_MOV(cb)};
109 }
110 
112 template <typename Sink, typename Callback, typename = _detect_callback<Callback>>
113 constexpr auto operator>>(Sink sink, Callback cb)
114 {
115  return _compose_s<Sink, Callback>{LEXY_MOV(sink), LEXY_MOV(cb)};
116 }
117 } // namespace lexy
118 
119 #endif // LEXY_CALLBACK_COMPOSITION_HPP_INCLUDED
120 
LEXY_MOV
#define LEXY_MOV(...)
Definition: config.hpp:21
lexy::_compose_s::operator[]
constexpr auto operator[](State &state) const
Definition: composition.hpp:85
base.hpp
lexy::_compose_state::operator()
constexpr auto operator()(Args &&... args) const -> decltype(_cb(LEXY_FWD(args)...))
Definition: composition.hpp:20
lexy::_compose_state::_cb
const Cb & _cb
Definition: composition.hpp:14
lexy::_compose_state< Cb, State, std::enable_if_t< lexy::is_callback_state< Cb, State > > >::_state
State & _state
Definition: composition.hpp:29
lexy::_compose_state< Cb, State, std::enable_if_t< lexy::is_callback_state< Cb, State > > >::operator()
constexpr auto operator()(Args &&... args) const -> decltype(_cb[_state](LEXY_FWD(args)...))
Definition: composition.hpp:34
LEXY_FWD
#define LEXY_FWD(...)
Definition: config.hpp:22
lexy::_compose_state::return_type
typename Cb::return_type return_type
Definition: composition.hpp:17
lexy
Definition: any_ref.hpp:12
lexy::_compose_state< Cb, State, std::enable_if_t< lexy::is_callback_state< Cb, State > > >::_cb
const Cb & _cb
Definition: composition.hpp:28
lexy::operator|
constexpr auto operator|(First first, Second second)
Composes two callbacks.
Definition: composition.hpp:100
lexy::_compose_cb
Definition: composition.hpp:41
lexy::_compose_s::return_type
typename Callback::return_type return_type
Definition: composition.hpp:76
lexy::_compose_s::sink
constexpr auto sink(Args &&... args) const -> decltype(_sink.sink(LEXY_FWD(args)...))
Definition: composition.hpp:79
lexy::_compose_cb::_first
LEXY_EMPTY_MEMBER First _first
Definition: composition.hpp:43
lexy::_compose_cb::operator()
constexpr auto operator()(Args &&... args) const -> LEXY_DECAY_DECLTYPE(_first(LEXY_FWD(args)...), LEXY_DECLVAL(return_type))
Definition: composition.hpp:63
lexy::_compose_s::operator()
constexpr auto operator()(Args &&... args) const -> decltype(_callback(LEXY_FWD(args)...))
Definition: composition.hpp:91
LEXY_DECAY_DECLTYPE
#define LEXY_DECAY_DECLTYPE(...)
Definition: config.hpp:26
lexy::_compose_cb::_compose_cb
constexpr _compose_cb(First &&first, Second &&second)
Definition: composition.hpp:46
lexy::_compose_cb::operator[]
constexpr auto operator[](State &state) const
Definition: composition.hpp:55
lexy::_compose_state
Definition: composition.hpp:12
lexy::_compose_s::_sink
LEXY_EMPTY_MEMBER Sink _sink
Definition: composition.hpp:73
lexy::_compose_s
Definition: composition.hpp:71
lexy::_compose_state::_state
State & _state
Definition: composition.hpp:15
lexy::_compose_cb::_second
LEXY_EMPTY_MEMBER Second _second
Definition: composition.hpp:44
std
Definition: std.hpp:30
lexy::operator>>
constexpr auto operator>>(Sink sink, Callback cb)
Composes a sink with a callback.
Definition: composition.hpp:113
lexy::_compose_state< Cb, State, std::enable_if_t< lexy::is_callback_state< Cb, State > > >::return_type
typename Cb::return_type return_type
Definition: composition.hpp:31
LEXY_EMPTY_MEMBER
#define LEXY_EMPTY_MEMBER
Definition: config.hpp:170
lexy::_compose_s::_callback
LEXY_EMPTY_MEMBER Callback _callback
Definition: composition.hpp:74
LEXY_DECLVAL
#define LEXY_DECLVAL(...)
Definition: config.hpp:24
lexy::_compose_cb::return_type
typename Second::return_type return_type
Definition: composition.hpp:50
detail::enable_if_t
typename std::enable_if< B, T >::type enable_if_t
Definition: json.hpp:3095


behaviortree_cpp_v4
Author(s): Davide Faconti
autogenerated on Fri Jun 28 2024 02:20:07