#pragma once
#include "ctre/phoenix/export.h"
#include <array>
#include <condition_variable>
#include <span>
#include <vector>
namespace ctre {
namespace phoenix {
namespace threading {
class CTREXPORT ManualEvent {
private:
size_t _signal;
mutable std::mutex _m;
mutable std::condition_variable _cv;
mutable std::vector<ManualEvent *> _anyEvents;
public:
ManualEvent(bool initialSignal = false);
bool WaitForSignal(int timeoutMs) const;
template <std::same_as<ManualEvent>... Events>
static bool WaitForAllSignals(int timeoutMs, int minTimeoutMs, Events const &... events)
{
return WaitForAllSignals(timeoutMs, minTimeoutMs, std::array<ManualEvent const *, sizeof...(Events)>{(&events)...});
}
static bool WaitForAllSignals(int timeoutMs, int minTimeoutMs, std::span<ManualEvent const* const> events);
template <std::same_as<ManualEvent>... Events>
static bool WaitForAnySignal(int timeoutMs, Events const &... events)
{
return WaitForAnySignal(timeoutMs, std::array<ManualEvent const *, sizeof...(Events)>{(&events)...});
}
static bool WaitForAnySignal(int timeoutMs, std::span<ManualEvent const* const> events);
void Signal();
void Clear();
void Reset();
};
}
}
}