File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ #pragma once
2+
3+ #include < condition_variable>
4+ #include < chrono>
5+ #include < mutex>
6+ #include < optional>
7+ #include < queue>
8+
9+ template <typename T>
10+ class Channel {
11+ std::queue<T> queue;
12+ std::mutex mutex;
13+ std::condition_variable cv;
14+
15+ public:
16+ void send (T message) {
17+ std::lock_guard<std::mutex> guard (mutex);
18+ queue.push (message);
19+ cv.notify_one ();
20+ }
21+
22+ template <typename U, typename V>
23+ std::optional<T> recv_timeout (const std::chrono::duration<U, V>& duration) {
24+ T message;
25+ std::unique_lock<std::mutex> lock (mutex);
26+ auto time = std::chrono::system_clock::now () + duration;
27+ if (!cv.wait_until (lock, time, [&] { return !queue.empty (); })) {
28+ return std::nullopt ;
29+ }
30+ message = std::move (queue.front ());
31+ queue.pop ();
32+ return message;
33+ }
34+
35+ bool empty () {
36+ std::lock_guard<std::mutex> guard (mutex);
37+ return queue.empty ();
38+ }
39+ };
Original file line number Diff line number Diff line change 11#include < atomic>
2- #include < condition_variable>
32#include < chrono>
4- #include < mutex>
5- #include < queue>
3+ #include < optional>
64#include < string>
75#include < vector>
86
119#include < rice/rice.hpp>
1210#include < rice/stl.hpp>
1311
12+ #include " channel.h"
13+
1414using operations_research::Domain;
1515using operations_research::sat::BoolVar;
1616using operations_research::sat::Constraint;
@@ -78,38 +78,6 @@ namespace Rice::detail {
7878 };
7979} // namespace Rice::detail
8080
81- template <typename T>
82- class Channel {
83- std::queue<T> queue;
84- std::mutex mutex;
85- std::condition_variable cv;
86-
87- public:
88- void send (T message) {
89- std::lock_guard<std::mutex> guard (mutex);
90- queue.push (message);
91- cv.notify_one ();
92- }
93-
94- template <typename U, typename V>
95- std::optional<T> recv_timeout (const std::chrono::duration<U, V>& duration) {
96- T message;
97- std::unique_lock<std::mutex> lock (mutex);
98- auto time = std::chrono::system_clock::now () + duration;
99- if (!cv.wait_until (lock, time, [&] { return !queue.empty (); })) {
100- return std::nullopt ;
101- }
102- message = std::move (queue.front ());
103- queue.pop ();
104- return message;
105- }
106-
107- bool empty () {
108- std::lock_guard<std::mutex> guard (mutex);
109- return queue.empty ();
110- }
111- };
112-
11381void init_constraint (Rice::Module& m) {
11482 Rice::define_class_under<Domain>(m, " Domain" )
11583 .define_constructor (Rice::Constructor<Domain, int64_t , int64_t >())
You can’t perform that action at this time.
0 commit comments