All checks were successful
continuous-integration/drone/push Build is passing
Allows multiplexing multiple signals together.
71 lines
1.3 KiB
C++
71 lines
1.3 KiB
C++
/*
|
|
* 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_ */
|