Libmacro  0.2
Libmacro is an extensible macro and hotkey library.
trigger_builder.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_REFERENCES_TRIGGER_BUILDER_H_
24 #define MCR_EXTRAS_REFERENCES_TRIGGER_BUILDER_H_
25 
27 
28 namespace mcr
29 {
34 class MCR_API TriggerBuilder
35 {
36 public:
40  TriggerBuilder(Libmacro *context = nullptr);
41  TriggerBuilder(const TriggerBuilder &) = default;
42  virtual ~TriggerBuilder() {}
43  inline TriggerBuilder &operator =(const TriggerBuilder &copytron) = delete;
44 
46  inline TriggerBuilder &build(mcr_Trigger *trigPt)
47  {
48  setTrigger(trigPt);
49  return *this;
50  }
51 
52  inline TriggerBuilder &build(mcr_ITrigger *itrigPt)
53  {
54  setITrigger(itrigPt);
55  return *this;
56  }
57  inline TriggerBuilder &build(size_t id)
58  {
59  setId(id);
60  return *this;
61  }
62  inline TriggerBuilder &build(const char *name)
63  {
64  setName(name);
65  return *this;
66  }
67 
69  inline mcr_Trigger *ptr() const
70  {
71  return _trigPt;
72  }
73  inline Libmacro &context() const
74  {
75  return *_context;
76  }
77 
78  /* ITrigger manipulators */
79  virtual inline mcr_ITrigger *itrigger() const
80  {
81  return _trigPt ? _trigPt->itrigger : nullptr;
82  }
83  virtual inline mcr_Interface *interface() const
84  {
85  return _trigPt ? _trigPt->interface : nullptr;
86  }
87  virtual inline ITriggerBuilder itriggerBuilder() const
88  {
89  return ITriggerBuilder(_context).build(itrigger());
90  }
91  virtual void setITrigger(mcr_ITrigger *itrigPt);
92 
93  virtual inline size_t id() const
94  {
95  return itriggerBuilder().id();
96  }
97  virtual void setId(size_t val)
98  {
99  setITrigger(itriggerBuilder().build(val).itrigger());
100  }
101  virtual inline const char *name() const
102  {
103  return itriggerBuilder().name();
104  }
105  virtual void setName(const char *val)
106  {
107  setITrigger(itriggerBuilder().build(val).itrigger());
108  }
109 
110  /* Trigger properties */
111  virtual inline mcr_Trigger *trigger() const
112  {
113  return _trigPt;
114  }
115  virtual inline mcr_Instance *instance() const
116  {
117  return _trigPt ? &_trigPt->instance : nullptr;
118  }
119  virtual inline mcr_DataMember *dataMember() const
120  {
121  return _trigPt ? &_trigPt->instance.data_member : nullptr;
122  }
123  virtual inline void setTrigger(mcr_Trigger *trigPt)
124  {
125  _trigPt = trigPt;
126  }
127  inline void setTrigger(const TriggerBuilder &copytron)
128  {
129  setTrigger(copytron.trigger());
130  }
131 
132  inline bool empty() const
133  {
134  return !data<void>();
135  }
136  virtual inline TriggerBuilder &clear()
137  {
138  return deinit();
139  }
140  virtual inline TriggerBuilder &deinit()
141  {
142  if (_trigPt)
143  mcr_Trigger_deinit(_trigPt);
144  return *this;
145  }
146 
147  virtual inline mcr_Trigger_receive_fnc triggerDispatch() const
148  {
149  return _trigPt ? _trigPt->trigger : nullptr;
150  }
151  virtual inline void setTriggerDispatch(mcr_Trigger_receive_fnc val)
152  {
153  if (_trigPt)
154  _trigPt->trigger = val;
155  }
156  virtual inline void *actor() const
157  {
158  return _trigPt ? _trigPt->actor : nullptr;
159  }
160  virtual inline void setActor(void *val)
161  {
162  if (_trigPt)
163  _trigPt->actor = val;
164  }
165 
166  /* Trigger functions */
167  template <typename T>
168  inline const T *data() const
169  {
170  return data<T>(_trigPt);
171  }
172  template <typename T>
173  inline T *data()
174  {
175  return data<T>(_trigPt);
176  }
177  template <typename T>
178  static inline const T *data(const mcr_Trigger *trigPt)
179  {
180  return trigPt ? reinterpret_cast<T *>(trigPt->instance.data_member.data) : nullptr;
181  }
182  template <typename T>
183  static inline T *data(mcr_Trigger *trigPt)
184  {
185  return trigPt ? reinterpret_cast<T *>(trigPt->instance.data_member.data) : nullptr;
186  }
187  virtual inline TriggerBuilder &mkdata()
188  {
189  if (trigger() && itrigger() && empty()) {
190  if (mcr_Instance_reset(&_trigPt->instance))
191  throw mcr_read_err();
192  if (empty())
193  throw mcr_read_err();
194  }
195  return *this;
196  }
197 
198  virtual void copy(const mcr_Trigger *copytron);
199  inline void copy(const TriggerBuilder &copytron)
200  {
201  copy(copytron.trigger());
202  }
203  virtual inline int compare(const mcr_Trigger *rhs) const
204  {
205  return mcr_Trigger_compare(_trigPt, rhs);
206  }
207  virtual inline int compare(const TriggerBuilder &rhs) const
208  {
209  return mcr_Trigger_compare(_trigPt, rhs._trigPt);
210  }
211 private:
212  Libmacro *_context;
213  mcr_Trigger *_trigPt;
214 };
215 }
216 
217 #endif
MCR_API int mcr_Instance_reset(struct mcr_Instance *instancePt)
MCR_API void mcr_Trigger_deinit(struct mcr_Trigger *trigPt)
mcr_Trigger * ptr() const
Libmacro, by Jonathan Pelletier, New Paradigm Software. Alpha version.
Definition: classes.h:31
MCR_API int mcr_Trigger_compare(const struct mcr_Trigger *lhsTriggerPt, const struct mcr_Trigger *rhsTriggerPt)
struct mcr_DataMember data_member
Definition: instance.h:41
TriggerBuilder & build(mcr_Trigger *trigPt)