divide WaitQueue from queue.hh

This commit is contained in:
falsycat 2022-06-04 10:34:01 +09:00
parent 04d3dd67cf
commit 763d884a2d
4 changed files with 51 additions and 40 deletions

View File

@ -65,6 +65,7 @@ target_sources(nf7
common/ptr_selector.hh
common/queue.hh
common/value.hh
common/wait_queue.hh
common/yas.hh
file/node_network.cc

View File

@ -1,6 +1,5 @@
#pragma once
#include <condition_variable>
#include <deque>
#include <functional>
#include <mutex>
@ -39,43 +38,4 @@ class Queue {
std::deque<T> tasks_;
};
// Queue<T> with Wait() method
template <typename T>
class WaitQueue : private Queue<T> {
public:
WaitQueue() = default;
WaitQueue(const WaitQueue&) = default;
WaitQueue(WaitQueue&&) = default;
WaitQueue& operator=(const WaitQueue&) = default;
WaitQueue& operator=(WaitQueue&&) = default;
void Push(T&& task) noexcept {
Queue<T>::Push(std::move(task));
cv_.notify_all();
}
using Queue<T>::Pop;
void Notify() noexcept {
cv_.notify_all();
}
void Wait() noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait(k);
}
void WaitFor(auto dur) noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait_for(k, dur);
}
void WaitUntil(auto time) noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait_until(k, time);
}
private:
using Queue<T>::mtx_;
std::condition_variable cv_;
};
} // namespace nf7

48
common/wait_queue.hh Normal file
View File

@ -0,0 +1,48 @@
#include <condition_variable>
#include <deque>
#include <mutex>
#include "common/queue.hh"
namespace nf7 {
// Queue<T> with Wait() method
template <typename T>
class WaitQueue : private Queue<T> {
public:
WaitQueue() = default;
WaitQueue(const WaitQueue&) = default;
WaitQueue(WaitQueue&&) = default;
WaitQueue& operator=(const WaitQueue&) = default;
WaitQueue& operator=(WaitQueue&&) = default;
void Push(T&& task) noexcept {
Queue<T>::Push(std::move(task));
cv_.notify_all();
}
using Queue<T>::Pop;
void Notify() noexcept {
cv_.notify_all();
}
void Wait() noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait(k);
}
void WaitFor(auto dur) noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait_for(k, dur);
}
void WaitUntil(auto time) noexcept {
std::unique_lock<std::mutex> k(mtx_);
cv_.wait_until(k, time);
}
private:
using Queue<T>::mtx_;
std::condition_variable cv_;
};
} // namespace nf7

View File

@ -1,5 +1,6 @@
#include <algorithm>
#include <cassert>
#include <condition_variable>
#include <filesystem>
#include <fstream>
#include <thread>
@ -15,6 +16,7 @@
#include "nf7.hh"
#include "common/queue.hh"
#include "common/wait_queue.hh"
#include "common/yas.hh"
// Include glfw lastly to prevent conflict with windows.h.