1 #ifndef OPERATIONS_BASE_HH
2 #define OPERATIONS_BASE_HH
8 #include <unordered_map>
12 #include "Mu2e-STMDAQ/buffers/data_struct.hh"
22 virtual void execute(
const std::string& operation_name,
23 std::shared_ptr<DataStruct>& buffer) = 0;
26 virtual void execute(
const std::string& operation_name,
27 std::shared_ptr<DataStruct>& buffer,
28 std::shared_ptr<DataStruct>& prev_buffer) = 0;
31 virtual bool requires_two_buffers(
const std::string& methodName)
const = 0;
35 using op1 = std::function<void(std::shared_ptr<DataStruct>&)>;
36 using op2 = std::function<void(std::shared_ptr<DataStruct>&,
37 std::shared_ptr<DataStruct>&)>;
38 using op_any = std::variant<op1, op2>;
48 std::unordered_map<std::string, op_any> operation_map;
51 void register_operation(
const std::string& name, op1 fn) {
52 operation_map.emplace(name, op_any{std::move(fn)});
56 void register_operation(
const std::string& name, op2 fn) {
57 operation_map.emplace(name, op_any{std::move(fn)});
61 virtual const char* op_name()
const {
return "Operation"; }
66 void execute(
const std::string& operation_name,
67 std::shared_ptr<DataStruct>& buffer)
override {
68 auto it = operation_map.find(operation_name);
69 if (it == operation_map.end()) {
70 std::cerr <<
"Error: Invalid operation name '" << operation_name
71 <<
"' in " << op_name() <<
"\n";
75 if (
auto* f1 = std::get_if<op1>(&it->second)) {
81 std::cerr <<
"Error: Operation '" << operation_name <<
"' in " << op_name()
82 <<
" requires 2 buffers.\n";
86 void execute(
const std::string& operation_name,
87 std::shared_ptr<DataStruct>& buffer,
88 std::shared_ptr<DataStruct>& prev_buffer)
override {
89 auto it = operation_map.find(operation_name);
90 if (it == operation_map.end()) {
91 std::cerr <<
"Error: Invalid operation name '" << operation_name
92 <<
"' in " << op_name() <<
"\n";
96 if (
auto* f2 = std::get_if<op2>(&it->second)) {
97 (*f2)(buffer, prev_buffer);
102 auto* f1 = std::get_if<op1>(&it->second);
106 bool requires_two_buffers(
const std::string& operation_name)
const override {
107 auto it = operation_map.find(operation_name);
108 if (it == operation_map.end()) {
111 return std::holds_alternative<op2>(it->second);