6#include <unordered_map>
12namespace diffeq::async {
14 class AsyncIntegrator;
17namespace diffeq::signal {
28 std::chrono::steady_clock::time_point timestamp;
30 double priority = 1.0;
33 Signal(U&& d, std::string_view
id =
"",
double prio = 1.0)
34 : data(std::forward<U>(d))
35 , timestamp(std::chrono::steady_clock::now())
47class SignalProcessor {
50 using time_type =
typename S::value_type;
54 using SignalHandler = std::function<void(
const Signal<T>&)>;
58 std::unordered_map<std::string, std::function<void(
const std::any&)>> custom_handlers_;
61 std::unordered_map<std::string, std::function<void(
double)>> parameter_handlers_;
64 SignalProcessor() =
default;
70 void emit_signal(std::string_view signal_type, T&& data,
double priority = 1.0) {
72 process_signal(signal);
78 template<
typename T,
typename Handler>
80 static_assert(std::is_invocable_v<Handler, const Signal<T>&>,
81 "Handler must be callable with Signal<T>");
83 custom_handlers_[std::string(signal_type)] =
84 [h = std::forward<Handler>(handler)](
const std::any& signal) {
86 const auto& typed_signal = std::any_cast<const Signal<T>&>(signal);
88 }
catch (
const std::bad_any_cast&) {
98 auto it = parameter_handlers_.find(param_name);
99 if (it != parameter_handlers_.end()) {
108 template<
typename SignalType>
109 void process_signal(
const SignalType& signal) {
111 auto it = custom_handlers_.find(signal.type_id);
112 if (it != custom_handlers_.end()) {
113 it->second(std::any(signal));
122auto make_signal_processor(std::shared_ptr<async::AsyncIntegrator<S>> integrator =
nullptr) {
123 return std::make_shared<SignalProcessor<S>>();
130auto make_signal_processor() {
131 return std::make_shared<SignalProcessor<S>>();
void emit_signal(std::string_view signal_type, T &&data, double priority=1.0)
Emit a signal with arbitrary data.
void register_handler(std::string_view signal_type, Handler &&handler)
Register a typed signal handler.
void update_parameter(const std::string ¶m_name, double value)
Update integration parameters.
Generic signal data structure.