Monopoly — Portage moderne 0.1.0
Portage moderne C/C++23 du Monopoly de 1999
Loading...
Searching...
No Matches
UIMessages.cpp
Go to the documentation of this file.
1#include "UIMessages.hpp"
2
3#include <algorithm>
4#include <condition_variable>
5#include <deque>
6#include <mutex>
7
8namespace monopoly::uimsg
9{
10 namespace
11 {
12 std::deque<Message> eventQueue;
13 std::mutex eventMutex;
14 std::condition_variable eventReady;
15 bool initialized = false;
16 }
17
19 {
20 {
21 const std::scoped_lock lock(eventMutex);
22 eventQueue.clear();
23 initialized = true;
24 }
25 eventReady.notify_all();
26 return true;
27 }
28
29 void shutdown()
30 {
31 {
32 const std::scoped_lock lock(eventMutex);
33 eventQueue.clear();
34 initialized = false;
35 }
36 eventReady.notify_all();
37 }
38
39 bool send(const Message& message)
40 {
41 {
42 const std::scoped_lock lock(eventMutex);
43 if (!initialized)
44 return false;
45
46 // L_UIMsg.cpp original protege la file contre les evenements
47 // repetitifs non essentiels. Les timers periodiques appliquent la
48 // meme regle dans Timers.cpp; MouseMoved est le seul autre type
49 // moderne correspondant actuellement a ce contrat.
50 if (message.type == Type::MouseMoved &&
51 eventQueue.size() > QueueCapacity / 2)
52 return false;
53
54 if (eventQueue.size() >= QueueCapacity)
55 return false;
56
57 eventQueue.push_back(message);
58 }
59 eventReady.notify_one();
60 return true;
61 }
62
63 bool receive(Message& message)
64 {
65 const std::scoped_lock lock(eventMutex);
66 if (!initialized || eventQueue.empty())
67 return false;
68
69 message = eventQueue.front();
70 eventQueue.pop_front();
71 return true;
72 }
73
74 bool wait(Message& message)
75 {
76 std::unique_lock lock(eventMutex);
77 eventReady.wait(lock, []
78 {
79 return !initialized || !eventQueue.empty();
80 });
81 if (!initialized || eventQueue.empty())
82 return false;
83
84 message = eventQueue.front();
85 eventQueue.pop_front();
86 return true;
87 }
88
90 {
91 const std::scoped_lock lock(eventMutex);
92 eventQueue.clear();
93 }
94
96 {
97 const std::scoped_lock lock(eventMutex);
98 return static_cast<int>(
99 (eventQueue.size() * 100U) / QueueCapacity);
100 }
101
102 std::size_t size()
103 {
104 const std::scoped_lock lock(eventMutex);
105 return eventQueue.size();
106 }
107
108 std::size_t discardTimerEvents(std::size_t timerIndex)
109 {
110 const std::scoped_lock lock(eventMutex);
111 return std::erase_if(eventQueue, [timerIndex](const Message& message)
112 {
113 return message.type == Type::TimerReachedZero &&
114 message.numberA >= 0 &&
115 static_cast<std::uint64_t>(message.numberA) == timerIndex;
116 });
117 }
118}
unsigned index
constexpr std::size_t QueueCapacity
Definition UIMessages.hpp:9
std::size_t discardTimerEvents(std::size_t timerIndex)
bool wait(Message &message)
bool send(const Message &message)
bool receive(Message &message)
std::size_t size()