Threads: SignalMux
All checks were successful
continuous-integration/drone/push Build is passing

Allows multiplexing multiple signals together.
This commit is contained in:
Erki 2021-06-26 13:11:20 +03:00
parent 9620c2206e
commit f4649142e5

View File

@ -0,0 +1,70 @@
/*
* 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 <algorithm>
#include <tuple>
namespace Threads
{
template<typename T, typename... Ss>
struct SignalMux : Signallable<T>
{
std::tuple<Ss...> 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<typename T, typename... Ss>
SignalMux<T, Ss...> makeSignalMux(Ss&&... args)
{
return SignalMux<T, Ss...>(std::forward(args...));
}
template<typename T, typename... Ss>
SignalMux<T, Ss...> makeSignalMux(Ss... args)
{
return SignalMux<T, Ss...>(args...);
}
}// namespace Threads
#endif /* SKULLC_THREADS_SIGNAL_MUX_HPP_ */