-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMessaging.ixx
48 lines (41 loc) · 924 Bytes
/
Messaging.ixx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
module;
export module Messaging;
import <mutex>;
import <condition_variable>;
import <memory>;
import <queue>;
export namespace messaging
{
struct message_base
{
virtual ~message_base() {};
};
template <typename Msg>
struct wrapped_message : message_base
{
Msg contents;
explicit wrapped_message(Msg const& contents_) : contents(contents_) {}
};
class queue
{
std::mutex m;
std::condition_variable c;
std::deque<std::shared_ptr<message_base>> q;
public:
template <typename T>
void push(T const& msg)
{
std::scoped_lock<std::mutex> lk(m);
q.push_back(std::make_shared<wrapped_message<T>>(msg));
c.notify_all();
}
std::shared_ptr<message_base> wait_and_pop()
{
std::unique_lock<std::mutex> lk(m);
c.wait(lk, [&] { return !q.empty(); });
auto res = q.front();
q.pop_front();
return res;
}
};
};