DiffEq - Modern C++ ODE Integration Library 1.0.0
High-performance C++ library for solving ODEs with async signal processing
Loading...
Searching...
No Matches
signal_processor_clean.hpp
1#pragma once
2
3#include <functional>
4#include <memory>
5#include <vector>
6#include <unordered_map>
7#include <string>
8#include <chrono>
9#include <any>
10
11namespace diffeq::signal {
12
16template<typename T>
17struct Signal {
18 T data;
19 std::chrono::steady_clock::time_point timestamp;
20 std::string type_id;
21 double priority = 1.0;
22
23 template<typename U>
24 Signal(U&& d, std::string_view id = "", double prio = 1.0)
25 : data(std::forward<U>(d))
26 , timestamp(std::chrono::steady_clock::now())
27 , type_id(id)
28 , priority(prio) {}
29};
30
34template<typename S>
35class SignalProcessor {
36public:
37 using state_type = S;
38
39 // Signal handler function types
40 template<typename T>
41 using SignalHandler = std::function<void(const Signal<T>&)>;
42
43private:
44 // Generic signal handlers using type erasure
45 std::unordered_map<std::string, std::function<void(const std::any&)>> custom_handlers_;
46
47public:
48 SignalProcessor() = default;
49
53 template<typename T>
54 void emit_signal(std::string_view signal_type, T&& data, double priority = 1.0) {
55 Signal<std::decay_t<T>> signal(std::forward<T>(data), signal_type, priority);
56 process_signal(signal);
57 }
58
62 template<typename T, typename Handler>
63 void register_handler(std::string_view signal_type, Handler&& handler) {
64 custom_handlers_[std::string(signal_type)] =
65 [h = std::forward<Handler>(handler)](const std::any& signal) {
66 try {
67 const auto& typed_signal = std::any_cast<const Signal<T>&>(signal);
68 h(typed_signal);
69 } catch (const std::bad_any_cast&) {
70 // Type mismatch - ignore
71 }
72 };
73 }
74
75private:
79 template<typename SignalType>
80 void process_signal(const SignalType& signal) {
81 auto it = custom_handlers_.find(signal.type_id);
82 if (it != custom_handlers_.end()) {
83 it->second(std::any(signal));
84 }
85 }
86};
87
91template<typename S>
92std::shared_ptr<SignalProcessor<S>> make_signal_processor() {
93 return std::make_shared<SignalProcessor<S>>();
94}
95
96} // namespace diffeq::signal
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.
Generic signal data structure.