23 #pragma message "C++ support is required for extras module" 27 #ifndef MCR_EXTRAS_DISPATCH_RECEIVER_MAP_H_ 28 #define MCR_EXTRAS_DISPATCH_RECEIVER_MAP_H_ 48 std::binary_function<mcr_ReceiverMapElement, mcr_ReceiverMapElement, bool> {
51 return reinterpret_cast<const kT &
>(s1) < reinterpret_cast<const kT &>(s2);
56 size_t *applyCountPt =
nullptr)
57 : _applyReceiversPt(applyReceiversPt), _applyCountPt(applyCountPt)
61 : _applyReceiversPt(
nullptr), _applyCountPt(0),
62 _receiverMap(copytron._receiverMap),
63 _receivers(copytron._receivers)
74 if (©tron !=
this) {
76 _receiverMap = copytron._receiverMap;
77 _receivers = copytron._receivers;
86 auto mapIt = _receiverMap.find(key);
88 if (mapIt == _receiverMap.end()) {
90 auto success = _receiverMap.insert({key, {}});
92 mapIt = success.first;
96 receiverSet.add(receiver, receiverFnc);
97 updateVector(key, receiverSet.array(), receiverSet.count());
103 _receiverMap.clear();
106 void remove(
void *remReceiver)
110 for (
auto rit = _receiverMap.rbegin(); rit != _receiverMap.rend(); ++rit) {
112 if (receiverSet.empty()) {
114 removeKey(rit->first);
115 _receiverMap.erase(rit.base());
116 }
else if (receiverSet.find(remReceiver)) {
118 receiverSet.remove(remReceiver);
120 if (receiverSet.empty()) {
121 removeKey(rit->first);
122 _receiverMap.erase(rit.base());
127 updateVector(rit->first, receiverSet.array(), receiverSet.count());
136 for (
auto it = _receiverMap.begin(); it != _receiverMap.end(); it++) {
141 _receivers.shrink_to_fit();
147 return _receivers.empty() ?
nullptr : &_receivers.front();
151 return _receiverMap.size();
153 inline size_t size()
const 161 apply(array(), count());
168 *_applyReceiversPt = receivers;
169 *_applyCountPt = count;
175 return _applyReceiversPt;
179 if (applyReceiversPt != _applyReceiversPt) {
181 _applyReceiversPt = applyReceiversPt;
185 size_t *applyCountPt()
const 187 return _applyCountPt;
189 void setApplyCountPt(
size_t *applyCountPt)
191 if (applyCountPt != _applyCountPt) {
193 _applyCountPt = applyCountPt;
197 inline bool applicable()
const 199 return _applyReceiversPt && _applyCountPt;
202 size_t *applyCountPt)
204 if (applyReceiversPt != _applyReceiversPt ||
205 applyCountPt != _applyCountPt ) {
207 _applyReceiversPt = applyReceiversPt;
208 _applyCountPt = applyCountPt;
214 size_t *_applyCountPt;
216 std::map<kT, DispatchReceiverSet> _receiverMap;
217 std::vector<mcr_ReceiverMapElement> _receivers;
219 void removeKey(
const kT &key)
222 reinterpret_cast<kT &
>(insert) = key;
223 auto found = std::lower_bound(_receivers.begin(), _receivers.end(), insert,
225 if (found != _receivers.end())
226 _receivers.erase(found);
231 reinterpret_cast<kT &
>(insert) = key;
232 auto found = std::lower_bound(_receivers.begin(), _receivers.end(), insert,
235 if (found == _receivers.end() || compare(&*found, &key)) {
238 _receivers.insert(found, insert);
240 found->receivers = array;
241 found->receiver_count = count;
246 _receivers.resize(_receiverMap.size());
247 auto receiverArray = _receivers.begin();
248 for (
auto it = _receiverMap.begin(); it != _receiverMap.end();
249 it++, receiverArray++) {
250 reinterpret_cast<kT &
>(*receiverArray) = it->first;
251 receiverArray->receivers = it->second.array();
252 receiverArray->receiver_count = it->second.count();
256 static int compare(
const void *lhsPt,
const void *rhsPt)
#define mcr_throwif(condition, errorNumber)
bool(* mcr_dispatch_receive_fnc)(struct mcr_DispatchReceiver *dispatchReceiver, struct mcr_Signal *dispatchSignal, unsigned int mods)
#define MCR_CMP_PTR(T, lhsPtr, rhsPtr)
Raise a compiler error. Usage: #include "mcr/err.h"
struct mcr_DispatchReceiver * receivers
Libmacro, by Jonathan Pelletier, New Paradigm Software. Alpha version.
void apply(mcr_ReceiverMapElement *receivers, size_t count)