/* * threads_signal_mux.hpp * * Created on: Jun 26, 2021 * Author: erki */ #ifndef SKULLC_THREADS_SIGNAL_MUX_HPP_ #define SKULLC_THREADS_SIGNAL_MUX_HPP_ #include "threads_signal.hpp" #include #include namespace Threads { template struct SignalMux : Signallable { std::tuple signals; SignalMux(Ss... args) : signals(std::make_tuple(args...)) {} SignalMux(Ss&&... args) : signals(std::make_tuple(args...)) {} void emit(const T& t) override { std::apply([&t](auto&... sig) { (..., sig.emit(t)); }, signals); } BaseType_t emitFromIsr(const T& t) override { BaseType_t higher_was_awoken = pdFALSE; auto emitSignal = [&higher_was_awoken, &t](auto& sig) { const BaseType_t awoken = sig.emitFromIsr(t); higher_was_awoken = awoken || higher_was_awoken; }; std::apply([&t, &emitSignal](auto&... sig) { (..., emitSignal(sig)); }, signals); return higher_was_awoken; } }; template SignalMux makeSignalMux(Ss&&... args) { return SignalMux(std::forward(args...)); } template SignalMux makeSignalMux(Ss... args) { return SignalMux(args...); } }// namespace Threads #endif /* SKULLC_THREADS_SIGNAL_MUX_HPP_ */