NAP
oscargument.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 #include <nap/numeric.h>
8 #include <rtti/rtti.h>
9 #include <utility/dllexport.h>
10 #include <glm/glm.hpp>
11 #include <osc/OscOutboundPacketStream.h>
12 #include <sstream>
13 
14 namespace nap
15 {
16  class OSCBaseValue;
17  using OSCValuePtr = std::unique_ptr<OSCBaseValue>;
18 
25  class NAPAPI OSCArgument final
26  {
27  RTTI_ENABLE()
28  public:
29  // Default Constructor
30  OSCArgument() = default;
31  OSCArgument(OSCValuePtr value);
32 
33  // Default Destructor
34  ~OSCArgument() = default;
35 
39  template<typename T>
40  const T* get() const;
41 
45  template<typename T>
46  T* get();
47 
51  rtti::TypeInfo getValueType() const;
52 
53  public:
57  float asFloat() const;
58 
62  bool isFloat() const;
63 
67  int asInt() const;
68 
72  bool isInt() const;
73 
77  bool asBool() const;
78 
82  bool isBool() const;
83 
87  const std::string& asString() const;
88 
92  bool isString() const;
93 
97  double asDouble() const;
98 
102  bool isDouble() const;
103 
107  char asChar() const;
108 
112  bool isChar() const;
113 
117  bool isNil() const;
118 
122  std::string toString();
123 
127  OSCArgument(OSCArgument&) = delete;
128  OSCArgument& operator=(const OSCArgument&) = delete;
129 
134  void add(osc::OutboundPacketStream& outPacket) const;
135 
139  std::size_t size() const;
140 
141  private:
142  OSCValuePtr mValue = nullptr;
143  };
144 
145 
147  // OSC Values
149 
153  class NAPAPI OSCBaseValue
154  {
155  friend OSCArgument;
156  RTTI_ENABLE()
157  public:
158  OSCBaseValue() = default;
159  virtual ~OSCBaseValue() = default;
160 
165  virtual std::string toString() const = 0;
166  protected:
171  virtual void add(osc::OutboundPacketStream& outPacket) const = 0;
172 
176  virtual std::size_t size() const = 0;
177  };
178 
179 
183  template<typename T>
184  class OSCValue : public OSCBaseValue
185  {
186  RTTI_ENABLE(OSCBaseValue)
187  public:
188  OSCValue(const T& value) : mValue(value) { }
189  OSCValue(const T&& value) : mValue(std::move(value)) { }
191 
195  virtual std::string toString() const override;
196  protected:
197  virtual void add(osc::OutboundPacketStream& outPacket) const override;
198  virtual std::size_t size() const override;
199  };
200 
201 
205  class NAPAPI OSCString : public OSCBaseValue
206  {
207  RTTI_ENABLE(OSCBaseValue)
208  public:
209  OSCString(const std::string& string) : mString(string) { }
210  OSCString(const std::string&& string) : mString(std::move(string)) { }
211  std::string mString;
212 
216  virtual std::string toString() const override;
217  protected:
218  virtual void add(osc::OutboundPacketStream& outPacket) const override;
219  virtual std::size_t size() const override;
220  };
221 
222 
226  class NAPAPI OSCNil : public OSCBaseValue
227  {
228  RTTI_ENABLE(OSCBaseValue)
229  public:
233  virtual std::string toString() const override { return "null"; }
234  protected:
235  virtual void add(osc::OutboundPacketStream& outPacket) const override { outPacket << osc::OscNil; }
236  virtual std::size_t size() const override { return sizeof(osc::OscNil); }
237  };
238 
239 
243  class NAPAPI OSCTimeTag : public OSCBaseValue
244  {
245  RTTI_ENABLE(OSCBaseValue)
246  public:
247  OSCTimeTag(nap::uint64 timeTag) : mTimeTag(timeTag) { }
249 
253  virtual std::string toString() const override { std::ostringstream os; os << mTimeTag; return os.str(); }
254  protected:
255  virtual void add(osc::OutboundPacketStream& outPacket) const override { outPacket << osc::TimeTag(mTimeTag); }
256  virtual size_t size() const override { return sizeof(nap::uint64); }
257  };
258 
259 
263  class NAPAPI OSCBlob : public OSCBaseValue
264  {
265  RTTI_ENABLE(OSCBaseValue)
266  public:
273  OSCBlob(const void* sourceData, int size);
274 
278  virtual ~OSCBlob();
279 
283  void* getCopy();
284 
288  virtual std::string toString() const override { return ""; }
289 
290  // Data associated with the blob
291  void* mData = nullptr;
292 
293  // Size of the blob in bytes
294  int mSize = 0;
295 
296  protected:
297  virtual void add(osc::OutboundPacketStream& outPacket) const override;
298  virtual size_t size() const override { return mSize; }
299  };
300 
301 
305  class NAPAPI OSCColor : public OSCBaseValue
306  {
307  RTTI_ENABLE(OSCBaseValue)
308  public:
309  OSCColor(nap::uint32 color) : mColor(color) { }
310 
314  virtual std::string toString() const override { std::ostringstream os; os << mColor; return os.str(); }
315 
316  protected:
317  virtual void add(osc::OutboundPacketStream& outPacket) const override;
318  virtual size_t size() const override { return sizeof(nap::uint32); }
319 
320  private:
321  nap::uint32 mColor;
322  };
323 
324 
326  // Type definitions for all supported OSC values
328 
334 
336  // Template definitions
338 
339  template<typename T>
340  const T* nap::OSCArgument::get() const
341  {
342  if (!(mValue->get_type().is_derived_from(RTTI_OF(T))))
343  {
344  assert(false);
345  return nullptr;
346  }
347  return static_cast<const T*>(mValue.get());
348  }
349 
350 
351  template<typename T>
353  {
354  if (!(mValue->get_type().is_derived_from(RTTI_OF(T))))
355  {
356  assert(false);
357  return nullptr;
358  }
359  return static_cast<T*>(mValue.get());
360  }
361 
362 
363  template<typename T>
364  void nap::OSCValue<T>::add(osc::OutboundPacketStream& outPacket) const
365  {
366  outPacket << mValue;
367  }
368 
369 
370  template<typename T>
371  size_t nap::OSCValue<T>::size() const
372  {
373  return sizeof(T);
374  }
375 
376 
377  template<typename T>
378  std::string nap::OSCValue<T>::toString() const
379  {
380  std::ostringstream os;
381  os << mValue;
382  return os.str();
383  }
384 }
nap::OSCNil::toString
virtual std::string toString() const override
Definition: oscargument.h:233
nap::OSCTimeTag::toString
virtual std::string toString() const override
Definition: oscargument.h:253
nap::OSCValue::OSCValue
OSCValue(const T &value)
Definition: oscargument.h:188
nap::toString
NAPAPI std::string toString(EDay day)
nap::OSCValue::add
virtual void add(osc::OutboundPacketStream &outPacket) const override
Definition: oscargument.h:364
nap::OSCColor::size
virtual size_t size() const override
Definition: oscargument.h:318
nap::OSCColor
Definition: oscargument.h:305
nap::OSCTimeTag
Definition: oscargument.h:243
nap::OSCValue::mValue
T mValue
Definition: oscargument.h:190
nap::uint64
uint64_t uint64
Definition: numeric.h:22
nap::OSCValue
Definition: oscargument.h:184
nap::OSCBaseValue
Definition: oscargument.h:153
nap::OSCColor::toString
virtual std::string toString() const override
Definition: oscargument.h:314
nap::OSCTimeTag::mTimeTag
nap::uint64 mTimeTag
Definition: oscargument.h:248
nap::OSCTimeTag::size
virtual size_t size() const override
Definition: oscargument.h:256
nap::OSCValuePtr
std::unique_ptr< OSCBaseValue > OSCValuePtr
Definition: oscargument.h:17
nap::OSCString::OSCString
OSCString(const std::string &&string)
Definition: oscargument.h:210
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::OSCBlob::toString
virtual std::string toString() const override
Definition: oscargument.h:288
nap::OSCArgument::get
const T * get() const
Definition: oscargument.h:340
nap::OSCBlob
Definition: oscargument.h:263
nap::OSCTimeTag::add
virtual void add(osc::OutboundPacketStream &outPacket) const override
Definition: oscargument.h:255
nap::OSCArgument
Definition: oscargument.h:25
nap::OSCColor::OSCColor
OSCColor(nap::uint32 color)
Definition: oscargument.h:309
nap::OSCNil::add
virtual void add(osc::OutboundPacketStream &outPacket) const override
Definition: oscargument.h:235
nap::OSCString::OSCString
OSCString(const std::string &string)
Definition: oscargument.h:209
nap::OSCNil::size
virtual std::size_t size() const override
Definition: oscargument.h:236
nap::OSCValue::OSCValue
OSCValue(const T &&value)
Definition: oscargument.h:189
nap
Definition: templateapp.h:17
nap::OSCTimeTag::OSCTimeTag
OSCTimeTag(nap::uint64 timeTag)
Definition: oscargument.h:247
nap::rtti::TypeInfo
rttr::type TypeInfo
Definition: typeinfo.h:140
nap::OSCValue::toString
virtual std::string toString() const override
Definition: oscargument.h:378
nap::OSCString
Definition: oscargument.h:205
nap::OSCNil
Definition: oscargument.h:226
nap::OSCBlob::size
virtual size_t size() const override
Definition: oscargument.h:298
nap::OSCString::mString
std::string mString
Definition: oscargument.h:211
nap::OSCValue::size
virtual std::size_t size() const override
Definition: oscargument.h:371