CommRaT 2.0.0
C++20 Real-Time Messaging Framework
Loading...
Searching...
No Matches
processor_bases.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <iostream>
5#include <tuple>
6
7namespace commrat {
8
9// ============================================================================
10// Helper Base Classes for Conditional Virtual Functions
11// ============================================================================
12
13// Base class providing process when InputData is not void
14template<typename InputData_, typename OutputData_>
16protected:
17 virtual void process(const InputData_& input, OutputData_& output) {
18 std::cerr << "[Module] ERROR: process(const Input&, Output&) not overridden in derived class!\n";
19 (void)input; // Suppress unused warning
20 output = OutputData_{};
21 }
22};
23
24// Specialization for void InputData (no process function)
25template<typename OutputData_>
26class ContinuousProcessorBase<void, OutputData_> {
27 // No process for periodic/loop modes
28};
29
30// Specialization for void OutputData (multi-output)
31template<typename InputData_>
32class ContinuousProcessorBase<InputData_, void> {
33 // No process for multi-output modules (use MultiOutputProcessorBase instead)
34};
35
36// Full specialization for both void
37template<>
38class ContinuousProcessorBase<void, void> {
39 // No process for multi-output periodic/loop modules
40};
41
42// ============================================================================
43// Multi-Output Processor Base (Phase 5.3)
44// ============================================================================
45
46// Helper to generate multi-output process signature
47template<typename OutputTypesTuple, typename InputData_>
49
50// Single output: OutputData process() or OutputData process(const InputData&)
51template<typename T>
52class MultiOutputProcessorBase<std::tuple<T>, void> {
53 // Single output handled by normal process() - no additional signature
54};
55
56template<typename T, typename InputData_>
57class MultiOutputProcessorBase<std::tuple<T>, InputData_> {
58 // Single output with continuous input - handled by process()
59};
60
61// Multi-output without continuous input: void process(T1& out1, T2& out2, ...)
62template<typename... Ts>
63 requires (sizeof...(Ts) > 1)
64class MultiOutputProcessorBase<std::tuple<Ts...>, void> {
65public:
66 // Public virtual function for polymorphic calls from Module
67 virtual void process(Ts&... outputs) {
68 std::cerr << "[Module] ERROR: Multi-output process(...) not overridden in derived class!\n";
69 // Leave outputs as default-constructed
70 }
71};
72
73// Multi-output with continuous input: void process(const InputData&, T1& out1, T2& out2, ...)
74template<typename... Ts, typename InputData_>
75 requires (sizeof...(Ts) > 1)
76class MultiOutputProcessorBase<std::tuple<Ts...>, InputData_> {
77public:
78 // Public virtual function for polymorphic calls from Module
79 virtual void process(const InputData_& input, Ts&... outputs) {
80 std::cerr << "[Module] ERROR: Multi-output process(...) not overridden in derived class!\n";
81 // Leave outputs as default-constructed
82 (void)input; // Suppress unused warning
83 }
84};
85
86// ============================================================================
87// Single-Output Processor Base (conditional process() function)
88// ============================================================================
89
90// Helper base class that provides virtual process() only for single-output modules WITHOUT input
91// Takes InputData_ to check if it's void (PeriodicInput/LoopInput)
92template<typename InputData_, typename OutputData_>
94 // Empty - when InputData is not void, use ContinuousProcessorBase instead
95};
96
97// Specialization for void InputData (PeriodicInput/LoopInput): provides process(output&)
98template<typename OutputData_>
99class SingleOutputProcessorBase<void, OutputData_> {
100protected:
101 // Single output with no input: provide virtual process(output&)
102 virtual void process(OutputData_& output) {
103 std::cerr << "[Module] ERROR: process(Output&) not overridden in derived class!\\n";
104 output = OutputData_{};
105 }
106};
107
108// Specialization for void OutputData (multi-output): no process() function
109template<typename InputData_>
110class SingleOutputProcessorBase<InputData_, void> {
111 // Empty - multi-output modules use MultiOutputProcessorBase::process(Ts&...) instead
112};
113
114// Full specialization for both void (multi-output with PeriodicInput/LoopInput)
115template<>
116class SingleOutputProcessorBase<void, void> {
117 // Empty - multi-output modules use MultiOutputProcessorBase::process(Ts&...) instead
118};
119
120// ============================================================================
121// Phase 6.7: Multi-Input Processor Base
122// ============================================================================
123
124// Helper base class that provides virtual multi-input process signatures
125// Only enabled when InputCount > 1 (multi-input modules)
126
127template<typename InputTypesTuple_, typename OutputData_, size_t InputCount_>
129 // Primary template - should not be instantiated
130 // Use specializations for InputCount == 0, 1, or > 1
131};
132
133// No multi-input (single input or no input): empty base
134template<typename InputTypesTuple_, typename OutputData_>
135class MultiInputProcessorBase<InputTypesTuple_, OutputData_, 0> {
136 // Empty - not multi-input
137};
138
139template<typename InputTypesTuple_, typename OutputData_>
140class MultiInputProcessorBase<InputTypesTuple_, OutputData_, 1> {
141 // Empty - single input, not multi-input
142};
143
144// Multi-input with single output: void process(const T1&, const T2&, ..., OutputData&)
145template<typename... Ts, typename OutputData_>
146 requires (sizeof...(Ts) > 1 && !std::is_void_v<OutputData_>)
147class MultiInputProcessorBase<std::tuple<Ts...>, OutputData_, sizeof...(Ts)> {
148public:
149 virtual void process(const Ts&... inputs, OutputData_& output) {
150 std::cerr << "[Module] ERROR: Multi-input process(..., Output&) not overridden in derived class!\n";
151 (void)std::make_tuple(inputs...); // Suppress unused warnings
152 output = OutputData_{};
153 }
154};
155
156// Multi-input with multi-output: void process(const T1&, const T2&, ..., O1& out1, O2& out2, ...)
157template<typename... InputTs, typename... OutputTs>
158 requires (sizeof...(InputTs) > 1 && sizeof...(OutputTs) > 1)
159class MultiInputProcessorBase<std::tuple<InputTs...>, std::tuple<OutputTs...>, sizeof...(InputTs)> {
160public:
161 virtual void process(const InputTs&... inputs, OutputTs&... outputs) {
162 std::cerr << "[Module] ERROR: Multi-input+multi-output process(...) not overridden!\n";
163 (void)std::make_tuple(inputs...); // Suppress unused warnings
164 }
165};
166
167} // namespace commrat
virtual void process(const InputData_ &input, OutputData_ &output)
virtual void process(const InputData_ &input, Ts &... outputs)
Input/Output specifications for multi-I/O modules.
CommRaT - Modern C++ Real-Time Communication Framework.