7 #include <hilti/rt/extension-points.h> 8 #include <hilti/rt/types/reference.h> 9 #include <hilti/rt/types/stream.h> 11 #include <spicy/rt/debug.h> 12 #include <spicy/rt/typedefs.h> 18 template<
typename T,
typename =
int>
22 struct is_filter<T, decltype((void)T::__forward, 0)> : std::true_type {};
25 using Parse1Function = std::function<hilti::rt::Resumable(hilti::rt::ValueReference<hilti::rt::Stream>&,
26 const std::optional<hilti::rt::stream::View>&)>;
62 template<const
char* debug_type_name>
71 operator bool()
const {
return __filters && (*__filters).size(); }
74 using _ParserDummy =
struct {
const char* name; };
77 inline static _ParserDummy __parser = _ParserDummy{.name = debug_type_name};
80 template<const
char* debug_type_name>
81 inline std::ostream& operator<<(std::ostream& out, State<debug_type_name>& s) {
82 out << s.__parser.name;
95 void disconnect(S& state) {
96 if ( state.__filters ) {
97 for (
auto& f : *state.__filters ) {
98 SPICY_RT_DEBUG_VERBOSE(
99 hilti::rt::fmt(
"- disconnecting existing filter unit from unit %s [%p]", S::__parser.name, &state));
103 (*state.__filters).clear();
107 if ( state.__forward ) {
108 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- sending EOD from filter unit %s [%p] to stream %p on disconnect",
109 S::__parser.name, &state, state.__forward.get()));
110 (*state.__forward).freeze();
117 return disconnect(*unit);
131 template<
typename S,
typename F>
132 void connect(S& state,
UnitRef<F> filter_unit) {
133 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- connecting filter unit %s [%p] to unit %s [%p]", F::__parser.name,
134 &*filter_unit, S::__parser.name, &state));
136 if ( ! state.__filters )
137 state.__filters = hilti::rt::reference::make_strong<::spicy::rt::filter::detail::Filters>();
140 const std::optional<hilti::rt::stream::View>& cur)
mutable 143 auto parse2 = hilti::rt::any_cast<Parse2Function<F>>(F::__parser.parse2);
144 SPICY_RT_DEBUG_VERBOSE(
145 hilti::rt::fmt(
" + parsing from stream %p, forwarding to stream %p",
146 data.
get(), lhs_filter_unit->__forward.get()));
147 return (*parse2)(lhs_filter_unit, data, cur, {});
151 (*state.__filters).push_back(std::move(filter));
152 filter_unit->__forward = (*state.__filters).back().input;
155 template<
typename U,
typename F>
157 return connect(*unit, filter_unit);
171 if ( ! (state.__filters && (*state.__filters).size()) )
176 for (
auto& f : *state.__filters ) {
177 SPICY_RT_DEBUG_VERBOSE(
178 hilti::rt::fmt(
"- beginning to filter input for unit %s [%p]", S::__parser.name, &state));
181 f.resumable = f.parse(data, cur);
183 f.resumable = f.parse(previous->input, previous->input->
view());
196 return init(*unit, data, cur);
207 if ( ! state.__forward ) {
208 SPICY_RT_DEBUG_VERBOSE(
209 hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\", but not connected to any unit",
210 S::__parser.name, &state, data));
214 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\" to stream %p", S::__parser.name,
215 &state, data, state.__forward.get()));
216 state.__forward->append(data);
221 return forward(*unit, data);
231 inline void forward_eod(S& state) {
232 if ( ! state.__forward ) {
233 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD, but not connected to any unit",
234 S::__parser.name, &state));
238 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD to stream %p", S::__parser.name,
239 &state, state.__forward.get()));
240 state.__forward->freeze();
245 return forward_eod(*unit);
254 for (
auto& f : (*filters) )
255 f.resumable.resume();
265 inline void flush(S& state) {
266 flush(state.__filters);
hilti::rt::StrongReference<::spicy::rt::filter::detail::Filters > __filters
Definition: filter.h:65
Definition: reference.h:489
Definition: stream.h:1001
const T * get() const
Definition: reference.h:106
Definition: reference.h:340
hilti::rt::WeakReference<::spicy::rt::filter::detail::Forward > __forward
Definition: filter.h:68
Definition: stream.h:1407
ValueReference< T > derefAsValue() const
Definition: reference.h:382
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:13
View view(bool expanding=true) const
Definition: stream.h:1577