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 {
const char* name; };
84 inline static _ParserDummy __parser = _ParserDummy{.name = debug_type_name};
87 template<const
char* debug_type_name>
88 inline std::ostream& operator<<(std::ostream& out, State<debug_type_name>& s) {
89 out << s.__parser.name;
102 void disconnect(S& state) {
103 if ( state.__filters ) {
104 for (
auto& f : *state.__filters ) {
105 SPICY_RT_DEBUG_VERBOSE(
106 hilti::rt::fmt(
"- disconnecting existing filter unit from unit %s [%p]", S::__parser.name, &state));
110 (*state.__filters).clear();
114 if ( state.__forward ) {
115 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- sending EOD from filter unit %s [%p] to stream %p on disconnect",
116 S::__parser.name, &state, state.__forward.get()));
117 (*state.__forward).freeze();
124 return disconnect(*unit);
138 template<
typename S,
typename F>
139 void connect(S& state,
UnitRef<F> filter_unit) {
140 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- connecting filter unit %s [%p] to unit %s [%p]", F::__parser.name,
141 &*filter_unit, S::__parser.name, &state));
143 if ( ! state.__filters )
144 state.__filters = hilti::rt::reference::make_strong<::spicy::rt::filter::detail::Filters>();
147 const std::optional<hilti::rt::stream::View>& cur)
mutable 150 auto parse2 = hilti::rt::any_cast<Parse2Function<F>>(F::__parser.parse2);
151 SPICY_RT_DEBUG_VERBOSE(
152 hilti::rt::fmt(
" + parsing from stream %p, forwarding to stream %p",
153 data.
get(), lhs_filter_unit->__forward.get()));
154 return (*parse2)(lhs_filter_unit, data, cur, {});
159 (*state.__filters).push_back(std::move(filter));
160 filter_unit->__forward = (*state.__filters).back().input;
163 template<
typename U,
typename F>
165 return connect(*unit, filter_unit);
179 if ( ! (state.__filters && (*state.__filters).size()) )
184 for (
auto& f : *state.__filters ) {
185 SPICY_RT_DEBUG_VERBOSE(
186 hilti::rt::fmt(
"- beginning to filter input for unit %s [%p]", S::__parser.name, &state));
189 f.resumable = f.parse(data, cur);
191 f.resumable = f.parse(previous->input, previous->input->
view());
204 return init(*unit, data, cur);
215 if ( ! state.__forward ) {
216 SPICY_RT_DEBUG_VERBOSE(
217 hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\", but not connected to any unit",
218 S::__parser.name, &state, data));
222 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding \"%s\" to stream %p", S::__parser.name,
223 &state, data, state.__forward.get()));
224 state.__forward->append(data);
229 return forward(*unit, data);
239 inline void forward_eod(S& state) {
240 if ( ! state.__forward ) {
241 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD, but not connected to any unit",
242 S::__parser.name, &state));
246 SPICY_RT_DEBUG_VERBOSE(
hilti::rt::fmt(
"- filter unit %s [%p] is forwarding EOD to stream %p", S::__parser.name,
247 &state, state.__forward.get()));
248 state.__forward->freeze();
253 return forward_eod(*unit);
262 for (
auto& f : (*filters) )
263 f.resumable.resume();
273 inline void flush(S& state) {
274 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:1407
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:1580