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