Libmacro  0.2
Libmacro is an extensible macro and hotkey library.
wrappers.h
Go to the documentation of this file.
1 /* Libmacro - A multi-platform, extendable macro and hotkey C library
2  Copyright (C) 2013 Jonathan Pelletier, New Paradigm Software
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
23 #ifndef MCR_EXTRAS_WRAPPERS_H_
24 #define MCR_EXTRAS_WRAPPERS_H_
25 
26 #include "mcr/extras/base_cpp.h"
27 
28 namespace mcr
29 {
32 struct MCR_API ISignal
33 {
34  mcr_ISignal self;
35  inline mcr_Interface &interface()
36  {
37  return self.interface;
38  }
39 
46  ISignal(Libmacro *context = nullptr, mcr_signal_fnc send = nullptr,
47  mcr_IDispatcher *dispatcher = nullptr);
48  ISignal(const ISignal &) = default;
49  virtual ~ISignal()
50  {
51  mcr_ISignal_deinit(&self);
52  }
53  ISignal &operator =(const ISignal &copytron) = default;
54 
55  inline mcr_ISignal &operator *()
56  {
57  return self;
58  }
59  inline const mcr_ISignal &operator *() const
60  {
61  return self;
62  }
63 // static inline ISignal *self(mcr_ISignal *originPt)
64 // {
65 // return (ISignal *)originPt;
66 // }
67 
68  inline Libmacro &context() const
69  {
70  return *_context;
71  }
72 
73  template<typename ISignalMemberT>
74  ISignal &build()
75  {
76  interface().data_size = sizeof(ISignalMemberT);
77  interface().allocate = &ISignal::allocate<ISignalMemberT>;
78  interface().deallocate = &ISignal::deallocate<ISignalMemberT>;
79  interface().compare = &ISignal::compare<ISignalMemberT>;
80  interface().copy = &ISignal::copy<ISignalMemberT>;
81  self.send = &ISignal::sendFn<ISignalMemberT>;
82  return *this;
83  }
84 
86  template<typename ISignalMemberT>
87  static void *allocate()
88  {
89  return new ISignalMemberT();
90  }
91 
93  template<typename ISignalMemberT>
94  static void deallocate(void *dataPt)
95  {
96  if (dataPt)
97  delete reinterpret_cast<ISignalMemberT *>(dataPt);
98  }
99 
101  template<typename ISignalMemberT>
102  static int compare(const void *lhsPt, const void *rhsPt)
103  {
104  if (rhsPt) {
105  if (lhsPt) {
106  return reinterpret_cast<const ISignalMemberT *>(lhsPt)->compare(*reinterpret_cast<const ISignalMemberT *>
107  (rhsPt));
108  }
109  return -1;
110  }
111  return !!lhsPt;
112  }
114  template<typename ISignalMemberT>
115  static int copy(void *dstPt, const void *srcPt)
116  {
117  if (!dstPt)
118  return EFAULT;
119  try {
120  reinterpret_cast<ISignalMemberT *>(dstPt)->copy(reinterpret_cast<const ISignalMemberT *>(srcPt));
121  } catch (int err) {
122  return err;
123  }
124  return 0;
125  }
126 
128  template<typename ISignalMemberT>
129  static int sendFn(mcr_Signal *signalPt)
130  {
131  mcr_dassert(signalPt);
132  mcr_dassert(signalPt->isignal);
133  ISignalMemberT *dataPt = reinterpret_cast<ISignalMemberT *>(signalPt->instance.data_member.data);
134  if (dataPt) {
135  try {
136  dataPt->send(signalPt);
137  } catch (int err) {
138  return err;
139  }
140  }
141  return 0;
142  }
143 private:
144  Libmacro *_context;
145 };
146 
149 struct MCR_API IDispatcher
150 {
151  mcr_IDispatcher self;
152 
163  IDispatcher(Libmacro *context = nullptr,
164  void (*deinit)(struct mcr_IDispatcher *) = nullptr,
165  mcr_IDispatcher_add_fnc add = nullptr,
166  void (*clear)(struct mcr_IDispatcher *) = nullptr,
167  mcr_IDispatcher_dispatch_fnc dispatch = nullptr,
168  mcr_IDispatcher_modify_fnc modifier = nullptr,
169  mcr_IDispatcher_remove_fnc remove = nullptr,
170  void (*trim)(struct mcr_IDispatcher *) = nullptr);
171  IDispatcher(const IDispatcher &) = default;
172  virtual ~IDispatcher() {}
173  IDispatcher &operator =(const IDispatcher &) = default;
174 
175  inline mcr_IDispatcher &operator *()
176  {
177  return self;
178  }
179  inline const mcr_IDispatcher &operator *() const
180  {
181  return self;
182  }
183 // static inline IDispatcher *self(mcr_IDispatcher *originPt)
184 // {
185 // return (IDispatcher *)originPt;
186 // }
187 
188  inline Libmacro &context() const
189  {
190  return *_context;
191  }
192 private:
193  Libmacro *_context;
194 };
195 
198 struct MCR_API ITrigger
199 {
200  mcr_ITrigger self;
201  inline mcr_Interface &interface()
202  {
203  return self.interface;
204  }
205 
211  ITrigger(Libmacro *context = nullptr,
212  mcr_Trigger_receive_fnc receive = nullptr);
213  virtual ~ITrigger() {
214  mcr_ITrigger_deinit(&self);
215  }
216  ITrigger(const ITrigger &) = default;
217  ITrigger &operator =(const ITrigger &) = default;
218 
219  inline mcr_ITrigger &operator *()
220  {
221  return self;
222  }
223  inline const mcr_ITrigger &operator *() const
224  {
225  return self;
226  }
227 // static inline ITrigger *self(mcr_ITrigger *originPt)
228 // {
229 // return (ITrigger *)originPt;
230 // }
231 
232  inline Libmacro &context() const
233  {
234  return *_context;
235  }
236 private:
237  Libmacro *_context;
238 };
239 
242 struct MCR_API Signal
243 {
244  mcr_Signal self;
245  inline mcr_ISignal *isignal()
246  {
247  return self.isignal;
248  }
249  inline mcr_Instance &instance()
250  {
251  return self.instance;
252  }
253  inline mcr_Interface *interface()
254  {
255  return self.interface;
256  }
257 
261  Signal(mcr_ISignal *isignal = nullptr, bool dispatchFlag = false)
262  {
263  mcr_Signal_init(&self);
264  self.isignal = isignal;
265  self.dispatch_flag = dispatchFlag;
266  }
267  Signal(const Signal &copytron)
268  {
269  mcr_Signal_init(&self);
270  copy(&copytron.self);
271  }
272  Signal(const mcr_Signal &copytron)
273  {
274  mcr_Signal_init(&self);
275  copy(&copytron);
276  }
277  virtual ~Signal()
278  {
279  mcr_Signal_deinit(&self);
280  }
281  inline Signal &operator =(const Signal &copytron)
282  {
283  copy(&copytron.self);
284  return *this;
285  }
286  inline Signal &operator =(const mcr_Signal &copytron)
287  {
288  copy(&copytron);
289  return *this;
290  }
291  inline Signal &operator =(mcr_ISignal *isignal)
292  {
293  setISignal(isignal);
294  return *this;
295  }
296 
297  inline mcr_Signal &operator *()
298  {
299  return self;
300  }
301  inline const mcr_Signal &operator *() const
302  {
303  return self;
304  }
305 // static inline Signal *self(mcr_Signal *originPt)
306 // {
307 // return (Signal *)originPt;
308 // }
309 
311  void copy(const mcr_Signal *copytron)
312  {
313  if (copytron != &self) {
314  if (mcr_Signal_copy(&self, copytron))
315  throw mcr_read_err();
316  mcr_dassert(instance().data_member.data != copytron->instance.data_member.data);
317  mcr_dassert(instance().data_member.deallocate);
318  }
319  }
321  void setISignal(mcr_ISignal *isignal);
322 
323  void reset()
324  {
325  if (mcr_Instance_reset(&instance()))
326  throw mcr_read_err();
327  }
328 
329  template <typename T>
330  inline const T *data() const
331  {
332  return reinterpret_cast<const T *>(self.instance.data_member.data);
333  }
334  template <typename T>
335  inline T *data()
336  {
337  return reinterpret_cast<T *>(instance().data_member.data);
338  }
339 };
340 
343 struct MCR_API Trigger
344 {
345  mcr_Trigger self;
346  inline mcr_ITrigger *itrigger()
347  {
348  return self.itrigger;
349  }
350  inline mcr_Instance &instance()
351  {
352  return self.instance;
353  }
354  inline mcr_Interface *interface()
355  {
356  return self.interface;
357  }
358 
363  Trigger(mcr_ITrigger *itrigger = nullptr,
364  mcr_Trigger_receive_fnc trigger = nullptr, void *actor = nullptr)
365  {
366  mcr_Trigger_init(&self);
367  self.itrigger = itrigger;
368  self.trigger = trigger;
369  self.actor = actor;
370  }
372  Trigger(const Trigger &copytron)
373  {
374  mcr_Trigger_init(&self);
375  copy(&*copytron);
376  }
378  Trigger(const mcr_Trigger &copytron)
379  {
380  mcr_Trigger_init(&self);
381  copy(&copytron);
382  }
383  virtual ~Trigger()
384  {
385  mcr_Trigger_deinit(&self);
386  }
387  inline Trigger &operator =(const Trigger &copytron)
388  {
389  copy(&*copytron);
390  return *this;
391  }
392  inline Trigger &operator =(const mcr_Trigger &copytron)
393  {
394  copy(&copytron);
395  return *this;
396  }
398  inline Trigger &operator =(mcr_ITrigger *itrigger)
399  {
400  setITrigger(itrigger);
401  return *this;
402  }
403 
404  inline mcr_Trigger &operator *()
405  {
406  return self;
407  }
408  inline const mcr_Trigger &operator *() const
409  {
410  return self;
411  }
412 // static inline Trigger *self(mcr_Trigger *originPt)
413 // {
414 // return (Trigger *)originPt;
415 // }
416 
418  void copy(const mcr_Trigger *copytron)
419  {
420  if (copytron != &self) {
421  if (mcr_Trigger_copy(&self, copytron))
422  throw mcr_read_err();
423  }
424  }
426  void setITrigger(mcr_ITrigger *itrigger);
427 };
428 }
429 
430 #endif
static int compare(const void *lhsPt, const void *rhsPt)
Definition: wrappers.h:102
MCR_API int mcr_Signal_copy(struct mcr_Signal *dstPt, const struct mcr_Signal *srcPt)
void(* mcr_IDispatcher_remove_fnc)(struct mcr_IDispatcher *idispPt, void *remReceiver)
Definition: idispatcher.h:66
MCR_API void mcr_ITrigger_deinit(struct mcr_ITrigger *itrigPt)
Trigger(const Trigger &copytron)
Definition: wrappers.h:372
void copy(const mcr_Trigger *copytron)
Definition: wrappers.h:418
void(* mcr_IDispatcher_modify_fnc)(struct mcr_IDispatcher *idispPt, struct mcr_Signal *sigPt, unsigned int *modsPt)
Definition: idispatcher.h:83
MCR_API void mcr_Signal_init(struct mcr_Signal *signalPt)
Trigger(mcr_ITrigger *itrigger=nullptr, mcr_Trigger_receive_fnc trigger=nullptr, void *actor=nullptr)
Definition: wrappers.h:363
static int copy(void *dstPt, const void *srcPt)
Definition: wrappers.h:115
MCR_API int mcr_Instance_reset(struct mcr_Instance *instancePt)
Trigger(const mcr_Trigger &copytron)
Definition: wrappers.h:378
MCR_API void mcr_Signal_deinit(struct mcr_Signal *signalPt)
static void deallocate(void *dataPt)
Definition: wrappers.h:94
MCR_API void mcr_Trigger_deinit(struct mcr_Trigger *trigPt)
Signal(mcr_ISignal *isignal=nullptr, bool dispatchFlag=false)
Definition: wrappers.h:261
int(* mcr_signal_fnc)(struct mcr_Signal *signalPt)
Definition: isignal.h:39
MCR_API int mcr_Trigger_copy(struct mcr_Trigger *dstPt, const struct mcr_Trigger *srcPt)
static void * allocate()
Definition: wrappers.h:87
Libmacro, by Jonathan Pelletier, New Paradigm Software. Alpha version.
Definition: classes.h:31
MCR_API void mcr_Trigger_init(struct mcr_Trigger *triggerPt)
struct mcr_DataMember data_member
Definition: instance.h:41
int(* mcr_IDispatcher_add_fnc)(struct mcr_IDispatcher *idispPt, struct mcr_Signal *sigPt, void *receiver, mcr_dispatch_receive_fnc receiverFnc)
Definition: idispatcher.h:57
bool(* mcr_IDispatcher_dispatch_fnc)(struct mcr_IDispatcher *idispPt, struct mcr_Signal *sigPt, unsigned int mods)
Definition: idispatcher.h:75
MCR_API void mcr_ISignal_deinit(struct mcr_ISignal *isigPt)
void copy(const mcr_Signal *copytron)
Definition: wrappers.h:311
static int sendFn(mcr_Signal *signalPt)
Definition: wrappers.h:129
#define mcr_dassert(expression)
Definition: defines.h:298