9#include "arg_wrappers.hpp"
11#include "data_types.hpp"
12#include "int_arith.hpp"
13#include "introspect.hpp"
14#include "processor.hpp"
23template <
typename DataTypes,
typename Downstream>
class delay {
24 typename DataTypes::abstime_type delta;
25 Downstream downstream;
28 explicit delay(arg::delta<typename DataTypes::abstime_type> delta,
29 Downstream downstream)
30 : delta(delta.value), downstream(std::move(downstream)) {}
32 [[nodiscard]]
auto introspect_node() const -> processor_info {
33 return processor_info(
this,
"delay");
36 [[nodiscard]]
auto introspect_graph() const -> processor_graph {
37 return downstream.introspect_graph().push_entry_point(
this);
46 template <
typename TimeTaggedEvent>
47 requires handler_for<Downstream, std::remove_cvref_t<TimeTaggedEvent>>
48 void handle(TimeTaggedEvent
const &event) {
49 static_assert(std::is_same_v<
decltype(
event.abstime),
50 typename DataTypes::abstime_type>);
51 TimeTaggedEvent copy(event);
52 copy.abstime = add_with_wrap(copy.abstime, delta);
53 downstream.handle(std::move(copy));
56 void flush() { downstream.flush(); }
59template <
typename DataTypes,
typename Downstream>
class zero_base_abstime {
60 bool initialized =
false;
61 typename DataTypes::abstime_type minus_delta{};
62 Downstream downstream;
65 explicit zero_base_abstime(Downstream downstream)
66 : downstream(std::move(downstream)) {}
68 [[nodiscard]]
auto introspect_node() const -> processor_info {
69 return processor_info(
this,
"zero_base_abstime");
72 [[nodiscard]]
auto introspect_graph() const -> processor_graph {
73 return downstream.introspect_graph().push_entry_point(
this);
78 template <
typename TimeTaggedEvent>
79 requires handler_for<Downstream, std::remove_cvref_t<TimeTaggedEvent>>
80 void handle(TimeTaggedEvent
const &event) {
81 static_assert(std::is_same_v<
decltype(
event.abstime),
82 typename DataTypes::abstime_type>);
83 if (not initialized) {
84 minus_delta =
event.abstime;
87 TimeTaggedEvent copy(event);
88 copy.abstime = subtract_with_wrap(event.abstime, minus_delta);
89 downstream.handle(std::move(copy));
92 void flush() { downstream.flush(); }
122template <
typename DataTypes = default_data_types,
typename Downstream>
124 Downstream downstream) {
125 return internal::delay<DataTypes, Downstream>(delta,
126 std::move(downstream));
154template <
typename DataTypes = default_data_types,
typename Downstream>
156 return internal::zero_base_abstime<DataTypes, Downstream>(
157 std::move(downstream));
auto delay(arg::delta< typename DataTypes::abstime_type > delta, Downstream downstream)
Create a processor that applies an abstime offset to all events.
Definition delay.hpp:123
auto zero_base_abstime(Downstream downstream)
Create a processor that offsets abstime so that the first event is at time zero.
Definition delay.hpp:155
libtcspc namespace.
Definition acquire.hpp:29
Function argument wrapper for delta parameter.
Definition arg_wrappers.hpp:127