Files
Isaacpp/spawner.h

69 lines
1.4 KiB
C++

//
// Created by Grant Horner on 12/1/25.
//
#pragma once
#include <atomic>
#include <mutex>
#include <thread>
template<typename T, size_t N>
struct Spawner {
std::mutex mutex;
std::condition_variable cv;
std::atomic<bool> paused;
std::jthread timer;
std::atomic<unsigned long long> rate_secs;
std::array<T, N> values;
explicit Spawner(long long rate_secs);
virtual void spawn();
template <typename F>
void for_each(F&& func) {
std::lock_guard lock{mutex};
for (auto& value : values) {
bool cancel = false;
func(value, cancel);
if (cancel) break;;
}
}
void start();
virtual ~Spawner();
};
template<typename T, size_t N>
Spawner<T, N>::Spawner(const long long rate_secs) : rate_secs(rate_secs) {
}
template<typename T, size_t N>
void Spawner<T, N>::spawn() {
}
template<typename T, size_t N>
void Spawner<T, N>::start() {
timer = std::jthread([&] (const std::stop_token &st) {
while (!st.stop_requested()) {
const auto start = std::chrono::steady_clock::now();
std::unique_lock lock{mutex};
if (!paused.load()) {
spawn();
}
auto next = start + std::chrono::seconds(rate_secs);
cv.wait_until(lock, next);
}
});
}
template<typename T, size_t N>
Spawner<T, N>::~Spawner() {
timer.request_stop();
cv.notify_all();
}