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>&)>;
33 : parse(std::move(_parse)), input(std::move(_input)), resumable(std::move(_resumable)) {}
69 template<const
char* debug_type_name>
78 operator bool()
const {
return __filters && (*__filters).size(); }
81 using _ParserDummy =
struct {
86 inline static _ParserDummy __parser = _ParserDummy{.name = debug_type_name};
89 template<const
char* debug_type_name>
90 inline std::ostream& operator<<(std::ostream& out, State<debug_type_name>& s) {
91 out << s.__parser.name;
104 void disconnect(S& state) {
105 if ( state.__filters ) {
106 for (
auto& f : *state.__filters ) {
107 SPICY_RT_DEBUG_VERBOSE(
108 hilti::rt::fmt(
"- disconnecting existing filter unit from unit %s [%p]", S::__parser.name, &state));
112 (*state.__filters).clear();
116 if ( state.__forward ) {
117 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- sending EOD from filter unit %s [%p] to stream %p on disconnect",
118 S::__parser.name, &state, state.__forward.get()));
119 (*state.__forward).freeze();
126 return disconnect(*unit);
140 template<
typename S,
typename F>
141 void connect(S& state,
UnitRef<F> filter_unit) {
142 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- connecting filter unit %s [%p] to unit %s [%p]", F::__parser.name,
143 &*filter_unit, S::__parser.name, &state));
145 if ( ! state.__filters )
146 state.__filters = hilti::rt::reference::make_strong<::spicy::rt::filter::detail::Filters>();
149 const std::optional<hilti::rt::stream::View>& cur)
mutable 152 auto parse2 = hilti::rt::any_cast<Parse2Function<F>>(F::__parser.parse2);
153 SPICY_RT_DEBUG_VERBOSE(
154 hilti::rt::fmt(
" + parsing from stream %p, forwarding to stream %p",
155 data.
get(), lhs_filter_unit->__forward.get()));
156 return (*parse2)(lhs_filter_unit, data, cur, {});
161 (*state.__filters).push_back(std::move(filter));
162 filter_unit->__forward = (*state.__filters).back().input;
165 template<
typename U,
typename F>
167 return connect(*unit, filter_unit);
181 if ( ! (state.__filters && (*state.__filters).size()) )
186 for (
auto& f : *state.__filters ) {
187 SPICY_RT_DEBUG_VERBOSE(
188 hilti::rt::fmt(
"- beginning to filter input for unit %s [%p]", S::__parser.name, &state));
191 f.resumable = f.parse(data, cur);
193 f.resumable = f.parse(previous->input, previous->input->
view());
206 return init(*unit, data, cur);
217 if ( ! state.__forward ) {
218 SPICY_RT_DEBUG_VERBOSE(
219 hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\", but not connected to any unit",
220 S::__parser.name, &state, data));
224 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\" to stream %p", S::__parser.name,
225 &state, data, state.__forward.get()));
226 state.__forward->append(data);
231 return forward(*unit, data);
241 inline void forward_eod(S& state) {
242 if ( ! state.__forward ) {
243 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD, but not connected to any unit",
244 S::__parser.name, &state));
248 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD to stream %p", S::__parser.name,
249 &state, state.__forward.get()));
250 state.__forward->freeze();
255 return forward_eod(*unit);
264 for (
auto& f : (*filters) )
265 f.resumable.resume();
275 inline void flush(S& state) {
276 flush(state.__filters);
hilti::rt::StrongReference<::spicy::rt::filter::detail::Filters > __filters
Definition: filter.h:72
Definition: reference.h:497
const T * get() const
Definition: reference.h:106
Definition: reference.h:345
hilti::rt::WeakReference<::spicy::rt::filter::detail::Forward > __forward
Definition: filter.h:75
Definition: stream.h:1408
ValueReference< T > derefAsValue() const
Definition: reference.h:387
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:13
View view(bool expanding=true) const
Definition: stream.h:1581