C++ API Reference RNBO: src/RNBO_PatcherState.h Source File

RNBO: src/RNBO_PatcherState.h Source File

1 //
2 // RNBO_PatcherState.h
3 // Created: 27 Jan 2016 1:43:53pm
4 // Author: Stefan Brunner
5 //
6 //
7 
8 #ifndef _RNBO_Patcherstate_H_
9 #define _RNBO_Patcherstate_H_
10 
11 #include <unordered_map>
12 #include <vector>
13 #include <memory>
14 
15 #include "RNBO_String.h"
16 #include "RNBO_Types.h"
17 #include "RNBO_ExternalPtr.h"
18 #include "RNBO_PatcherEventTarget.h"
19 #include "RNBO_PatcherStateInterface.h"
20 #include "RNBO_List.h"
21 #include "RNBO_DataRef.h"
22 #include "RNBO_Debug.h"
23 
24 #include "3rdparty/MPark_variant/variant.hpp"
25 
26 namespace RNBO {
27 
28  class ValueHolder;
29  class PatcherState;
30  using StateMapPtr = std::shared_ptr<PatcherState>;
31  using SubStateMapType = std::unordered_map<Index,std::shared_ptr<ValueHolder> >;
32  using SubStateMapPtr = std::shared_ptr<SubStateMapType>;
33 
37  class ValueHolder {
38  public:
39 
43  enum Type {
44  NONE,
47  EXTERNAL,
50  EVENTTARGET,
51  LIST,
52  DATAREF,
53  MULTIREF,
54  SIGNAL,
55  STRING,
56  UINT32,
57  BOOLEAN,
58  INTVALUE,
59  UINT64
60  };
61 
65  ValueHolder(float val);
66 
70  ValueHolder(double val);
71 
76 
80  ValueHolder(UInt32 val);
81 
85  ValueHolder(UInt64 val);
86 
90  ValueHolder(bool val);
91 
95  ValueHolder(ExternalPtr& ext);
96 
102  ValueHolder(StateMapPtr substate);
103 
107  ValueHolder(PatcherEventTarget* patcherEventTarget);
108 
112  ValueHolder(const list& theList);
113 
117  ValueHolder(DataRef&& dataRef);
118 
122  ValueHolder(MultiDataRef&& dataRef);
123 
127  ValueHolder(const signal sig);
128 
132  ValueHolder(const char* str);
133 
138 
139  explicit operator float() const;
140  explicit operator double() const;
141  explicit operator Int() const;
142  explicit operator UInt32() const;
143  explicit operator UInt64() const;
144  explicit operator bool() const;
145  explicit operator PatcherEventTarget*();
146  explicit operator signal();
147 
148  operator ExternalPtr();
149  operator const list&() const;
150  operator DataRef&();
151  operator MultiDataRef&();
152  operator const char*() const;
153 
154  operator PatcherState&();
155  PatcherState& operator[](Index i);
156 
157  operator const PatcherState&() const;
158  const PatcherState& operator[](Index i) const;
159 
164 
168  Type getType() const;
169 
170  private:
171 
172  void allocateSubState();
173  void allocateSubStateMap();
174 
175  mpark::variant<
176  mpark::monostate,
177  float,
178  double,
179  Int,
180  UInt32,
181  bool,
182  ExternalPtr,
183  StateMapPtr,
184  PatcherEventTarget*,
185  SubStateMapPtr,
186  list,
187  DataRef,
188  MultiDataRef,
189  signal,
190  String,
191  UInt64
192  > _value;
193  };
194 
195  using StateMap = std::unordered_map<String, ValueHolder, StringHasher>;
196 
200  class PatcherState : public PatcherStateInterface {
201 
202  public:
203 
204  using Iterator = typename StateMap::iterator;
205  using ConstIterator = typename StateMap::const_iterator;
206 
207  Iterator begin()
208  {
209  return _map.begin();
210  }
211 
212  Iterator end()
213  {
214  return _map.end();
215  }
216 
217  ConstIterator begin() const
218  {
219  return _map.begin();
220  }
221 
222  ConstIterator end() const
223  {
224  return _map.end();
225  }
226 
233  PatcherState& getSubState(const char* key) override;
234 
242  PatcherState& getSubStateAt(const char* key, Index i) override;
243 
244  StateHelper<PatcherState> operator[](const char* key) {
245  StateHelper<PatcherState> helper(key, *this);
246  return helper;
247  }
248 
249  virtual bool isDummy() const { return false; }
250 
251  private:
252 
253  friend class StateHelper<PatcherState>;
254 
255  void add(const char* key, float val) override;
256  void add(const char* key, double val) override;
257  void add(const char* key, Int val) override;
258  void add(const char* key, UInt32 val) override;
259  void add(const char* key, UInt64 val) override;
260  void add(const char* key, bool val) override;
261  void add(const char* key, ExternalPtr& ext) override;
262  void add(const char* key, PatcherEventTarget* patcherEventTarget) override;
263  void add(const char* key, const list& theList) override;
264  void add(const char* key, DataRef& dataRef) override;
265  void add(const char* key, MultiDataRef& dataRef) override;
266  void add(const char* key, signal sig) override;
267  void add(const char* key, const char* str) override;
268 
269  float getFloat(const char* key) override;
270  double getDouble(const char* key) override;
271  Int getInt(const char* key) override;
272  UInt32 getUInt32(const char* key) override;
273  UInt64 getUInt64(const char* key) override;
274  bool getBool(const char* key) override;
275  ExternalPtr getExternalPtr(const char* key) override;
276  PatcherEventTarget* getEventTarget(const char* key) override;
277  const PatcherState& getSubState(const char* key) const override;
278  const PatcherState& getSubStateAt(const char* key, Index i) const override;
279  bool isEmpty() const override;
280  list getList(const char* key) override;
281  DataRef& getDataRef(const char *key) override;
282  MultiDataRef& getMultiDataRef(const char *key) override;
283  signal getSignal(const char *key) override;
284  const char* getString(const char *key) override;
285 
286  bool containsValue(const char* key) const override;
287 
288  StateMap _map;
289  };
290 
291 }
292 
293 #endif // _RNBO_Patcherstate_H_