VL
vl.h
Go to the documentation of this file.
1#pragma once
2
3#include <assert.h>
4#include <string>
5#include <vector>
6#include <unordered_map>
7#include <memory>
8#include <functional>
9#include "vl_fwd.h"
10#include "Observable.h"
11#include "Observer.h"
12
13namespace vl
14{
15 // Return proto name if assigned
16 // Polymorphic variable (pointer) creation with any supported type
17 VarPtr MakePtr(bool value);
18 VarPtr MakePtr(int value);
19 VarPtr MakePtr(float value);
20 VarPtr MakePtr(const char* value);
21 VarPtr MakePtr(const std::string& value);
22 VarPtr MakePtr(const ObjectVar& value);
23 VarPtr MakePtr(const ListVar& value);
24 VarPtr MakePtr(const NullVar& value);
25 VarPtr MakePtr(const Var& value);
26 VarPtr MakePtr(); // Return a null var
27
28 // AbstractVar
29 // Make it possible to store a list of various variables
31 {
32 public:
33 virtual const BoolVar& AsBool() const;
34 virtual const NumberVar& AsNumber() const;
35 virtual const StringVar& AsString() const;
36 virtual const ObjectVar& AsObject() const;
37 virtual const ListVar& AsList() const;
38 virtual BoolVar& AsBool();
39 virtual NumberVar& AsNumber();
40 virtual StringVar& AsString();
41 virtual ObjectVar& AsObject();
42 virtual ListVar& AsList();
43 virtual bool IsBool() const { return false; }
44 virtual bool IsNumber() const { return false; }
45 virtual bool IsString() const { return false; }
46 virtual bool IsObject() const { return false; }
47 virtual bool IsList() const { return false; }
48 virtual bool IsNull() const { return true; }
49 virtual Type GetType() const;
50 virtual VarPtr Ptr() const = 0;
51 virtual bool Accept(Visitor& v, const char* name = nullptr) const { return true; }
52 virtual operator bool() const { return !IsNull(); }
53 virtual std::string ToStr() const { return ""; }
54 virtual const void* Data() const;
55 virtual vl::VarPtr Copy() const;
56
57 protected:
58 template <typename T>
59 VarPtr PtrImpl(const T* body) const {
60 auto p = std::make_shared<T>();
61 *(p.get()) = *body;
62 return std::dynamic_pointer_cast<AbstractVar>(p);
63 }
64 };
65
66 // ======= Concrete Vars =======
67 // BoolVar declaration
68 // Non sharable
69 class BoolVar : public AbstractVar
70 {
71 public:
72 BoolVar() = default;
73 BoolVar(bool value) : mData(value) {}
74 bool IsBool() const override { return true; }
75 const BoolVar& AsBool() const override { return *this; }
76 BoolVar& AsBool() override { return *this; }
77 Type GetType() const override;
78 VarPtr Ptr() const override { return PtrImpl(this); }
79 bool Val() const { return mData; }
80 bool IsNull() const override { return false; }
81 bool Accept(Visitor& v, const char* name = nullptr) const override;
82 std::string ToStr() const override;
83 BoolVar& operator=(bool val);
84
85 private:
86 bool mData = false;
87 };
88
89 // NumberVar declaration
90 // Non sharable
91 class NumberVar : public AbstractVar
92 {
93 public:
94 NumberVar() = default;
95 NumberVar(float value) : mData(value) {}
96 bool IsNumber() const override { return true; }
97 const NumberVar& AsNumber() const override { return *this; }
98 NumberVar& AsNumber() override { return *this; }
99 Type GetType() const override;
100 VarPtr Ptr() const override { return PtrImpl(this); }
101 bool IsNull() const override { return false; }
102 bool Accept(Visitor& v, const char* name = nullptr) const override;
103 float Val() const { return mData; }
104 std::string ToStr() const override;
105 NumberVar& operator=(int val);
106 NumberVar& operator=(double val);
107 NumberVar& operator=(float val);
108
109 private:
110 float mData = 0.f;
111 };
112
113 // StringVar declaration
114 // Non sharable
115 class StringVar : public AbstractVar
116 {
117 public:
118 StringVar() = default;
119 StringVar(const std::string& value) : mData(value) {}
120 bool IsString() const override { return true; }
121 const StringVar& AsString() const override { return *this; }
122 StringVar& AsString() override { return *this; }
123 Type GetType() const override;
124 VarPtr Ptr() const override { return PtrImpl(this); }
125 const std::string& Val() const { return mData; }
126 bool IsNull() const override { return false; }
127 bool Accept(Visitor& v, const char* name = nullptr) const override;
128 std::string ToStr() const override;
129 StringVar& operator=(const std::string& val) {
130 mData = val;
131 return *this;
132 }
133
134 private:
135 std::string mData;
136 };
137
138 typedef std::unordered_map<std::string, VarPtr> PropsContainerType;
139
140 // Return type of ObjectVar::Set
141 // Includes id and data
142 // TODO: support
143 //struct ObjectSetRet {
144 // bool addition = false
145 // ObjectInsertRet() = default;
146 // ObjectSetRet(bool addition, vl::Var& data)
147 // : addition(addition)
148 // , mData(&data)
149 // {}
150 // vl::Var& data();
151 // inline operator bool() { return mData != nullptr; }
152 // static ObjectSetRet Null();
153
154 //private:
155 // vl::Var* mData = nullptr;
156 //};
157
158 // ObjectVar declaration
159 // Sharable
165 struct PropsDataType : public Observable, public Observer
166 {
167 void Notify(vl::VarPtr info) override;
168 void Update(Observable* sender, vl::VarPtr info = nullptr) override;
170 };
171 typedef std::shared_ptr<PropsDataType> ObjectDataType;
172 class ObjectVar : public AbstractVar
173 {
174 public:
175 ObjectVar() = default;
176 ObjectVar(const ObjectDataType& dataPtr);
177 bool IsObject() const override { return true; }
178 bool operator == (const ObjectVar& right) const;
179 bool operator == (const ObjectVar& right);
180 operator bool() const override;
181 const ObjectVar& AsObject() const override;
182 ObjectVar& AsObject() override;
183 Type GetType() const override;
184 int Size() const;
185 Var& Set(const std::string& propName);
186 Var& Set(const std::string& propName, const Var& value);
187 Var& Set(const std::string& propName, const VarPtr& varPtr);
188 template <typename T>
189 Var& Set(const std::string& propName, const T& value)
190 {
191 return Set(propName, MakePtr(value));
192 }
193 const Var& Get(const std::string& propName) const;
194 Var& Get(const std::string& propName);
195 bool Has(const std::string& propName) const;
196 bool HasOwn(const std::string& propName) const;
197 std::shared_ptr<std::string> GetRelativePath(const std::string& propName) const;
198 bool Overridden(const std::string& propName) const;
199 int PropCount() const;
200 bool RemoveProperty(const std::string& propName);
201 bool RenameProperty(const std::string& propName, const std::string& newName);
202 VarPtr Ptr() const override { return PtrImpl(this); }
203 bool IsNull() const override { return mData == nullptr; }
204 bool Accept(Visitor& v, const char* name = nullptr) const override;
205 vl::VarPtr Copy() const;
206 bool ForeachProp(const std::function<bool(const std::string&, const vl::Var&)>& pred, bool recursive = false) const;
207 bool ForeachProp(const std::function<bool(const std::string&, vl::Var&)>& pred, bool recursive = false);
208 void SetPrototype(const vl::Object& proto);
209 Object& GetPrototype() const;
210 std::string ToStr() const override;
211 inline void Attach(Observer* o, const std::string& title = "") {
212 mData->Attach(o, title);
213 }
214 inline void Detach(Observer* o) {
215 mData->Detach(o);
216 }
217 inline const void* Data() const override {
218 return mData.get();
219 }
220
222 return mData.get();
223 }
224 void Clear(bool recursive = false);
225 protected:
226 std::shared_ptr<std::string> getRelativePathRecursive(const std::string& propName, const std::string& path = "") const;
227 bool overriddenRecursive(const std::string& propName, int count = 0) const;
228
229 protected:
230 ObjectDataType mData = std::make_shared<PropsDataType>();
231 };
232
234
235 // Empty var used to return it by reference to some functions
236 extern vl::NullVar emptyVar;
237
238 // ListVar declaration
239 // Sharable
240 struct ListDataType : public Observable, public Observer
241 {
242 void Notify(vl::VarPtr info);
243 void Update(Observable* sender, vl::VarPtr info = nullptr) override;
244 std::vector<VarPtr> data;
245 };
246 typedef std::shared_ptr<ListDataType> ListVarDataType;
247
248 // Return type of ListVar::Add and Set operations
249 // Includes index and data
251 int index = -1;
252 ListInsertRet() = default;
254 : index(index)
255 , mData(&data)
256 {}
257 vl::Var& data();
258 inline operator bool() { return index >= 0; }
259 static ListInsertRet Null();
260 private:
261 vl::Var* mData = nullptr;
262 };
263
264 class ListVar : public AbstractVar
265 {
266 public:
267 bool IsList() const override { return true; }
268 const ListVar& AsList() const override { return *this; }
269 ListVar& AsList() override { return *this; }
270 Type GetType() const override;
271 VarPtr Ptr() const override { return PtrImpl(this); }
272 bool IsNull() const override { return mData == nullptr; }
273 bool Accept(Visitor& v, const char* name = nullptr) const override;
274 inline int Size() const {
275 return mData ? mData->data.size() : 0;
276 }
277 void Clear(bool recursive = false);
278 bool Remove(int index);
279 const Var& At(int index) const;
280 Var& At(int index);
281 ListInsertRet Add(const VarPtr& varPtr, int indexBefore = -1);
282 template <typename T>
283 ListInsertRet Add(const T& value, int indexBefore = -1)
284 {
285 return Add(MakePtr(value), indexBefore);
286 }
287 ListInsertRet Set(int index);
288 ListInsertRet Set(int index, const Var& value);
289 ListInsertRet Set(int index, const VarPtr& varPtr);
290 template <typename T>
291 ListInsertRet Set(int index, const T& value)
292 {
293 return Set(index, MakePtr(value));
294 }
295 Var& Back();
296 bool IsEmpty() const;
297 std::string ToStr() const override;
298 inline void Attach(Observer* o, const std::string& title = "") {
299 mData->Attach(o);
300 }
301 inline void Detach(Observer* o) {
302 mData->Detach(o);
303 }
304 inline const void* Data() const override {
305 return mData.get();
306 }
307 vl::VarPtr Copy() const override;
308
309 private:
310 ListVarDataType mData = std::make_shared<ListDataType>();
311 };
312
313 extern vl::ListVar emptyList;
314
315 // NullVar declaration
316 // Non sharable
317 class NullVar : public AbstractVar
318 {
319 public:
320 bool IsNull() const override { return true; }
321 Type GetType() const override;
322 VarPtr Ptr() const override { return PtrImpl(this); }
323 bool Accept(Visitor& v, const char* name = nullptr) const override;
324 inline const void* Data() const override {
325 return nullptr;
326 }
327 };
328
329
330}
Definition: vl.h:31
virtual const ObjectVar & AsObject() const
Definition: vl.cpp:106
virtual const BoolVar & AsBool() const
Definition: vl.cpp:85
virtual bool IsNumber() const
Definition: vl.h:44
virtual vl::VarPtr Copy() const
Definition: vl.cpp:154
virtual bool IsNull() const
Definition: vl.h:48
virtual const StringVar & AsString() const
Definition: vl.cpp:99
virtual bool IsList() const
Definition: vl.h:47
virtual const NumberVar & AsNumber() const
Definition: vl.cpp:92
virtual bool IsObject() const
Definition: vl.h:46
virtual bool IsBool() const
Definition: vl.h:43
virtual const void * Data() const
Definition: vl.cpp:148
virtual const ListVar & AsList() const
Definition: vl.cpp:113
virtual bool Accept(Visitor &v, const char *name=nullptr) const
Definition: vl.h:51
virtual std::string ToStr() const
Definition: vl.h:53
VarPtr PtrImpl(const T *body) const
Definition: vl.h:59
virtual Type GetType() const
Definition: vl.cpp:144
virtual bool IsString() const
Definition: vl.h:45
virtual VarPtr Ptr() const =0
Definition: vl.h:70
const BoolVar & AsBool() const override
Definition: vl.h:75
BoolVar & AsBool() override
Definition: vl.h:76
BoolVar(bool value)
Definition: vl.h:73
std::string ToStr() const override
Definition: vl.cpp:607
Type GetType() const override
Definition: vl.cpp:597
BoolVar()=default
BoolVar & operator=(bool val)
Definition: vl.cpp:612
bool Val() const
Definition: vl.h:79
VarPtr Ptr() const override
Definition: vl.h:78
bool IsNull() const override
Definition: vl.h:80
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:602
bool IsBool() const override
Definition: vl.h:74
Definition: vl.h:265
Type GetType() const override
Definition: vl.cpp:674
bool Remove(int index)
Definition: vl.cpp:762
int Size() const
Definition: vl.h:274
void Attach(Observer *o, const std::string &title="")
Definition: vl.h:298
ListInsertRet Add(const VarPtr &varPtr, int indexBefore=-1)
Definition: vl.cpp:790
std::string ToStr() const override
Definition: vl.cpp:869
const Var & At(int index) const
Definition: vl.cpp:777
void Detach(Observer *o)
Definition: vl.h:301
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:715
ListInsertRet Set(int index)
Definition: vl.cpp:815
const void * Data() const override
Definition: vl.h:304
bool IsList() const override
Definition: vl.h:267
ListInsertRet Set(int index, const T &value)
Definition: vl.h:291
vl::VarPtr Copy() const override
Definition: vl.cpp:851
ListInsertRet Add(const T &value, int indexBefore=-1)
Definition: vl.h:283
VarPtr Ptr() const override
Definition: vl.h:271
bool IsNull() const override
Definition: vl.h:272
const ListVar & AsList() const override
Definition: vl.h:268
void Clear(bool recursive=false)
Definition: vl.cpp:729
Var & Back()
Definition: vl.cpp:841
ListVar & AsList() override
Definition: vl.h:269
bool IsEmpty() const
Definition: vl.cpp:846
Definition: vl.h:318
const void * Data() const override
Definition: vl.h:324
VarPtr Ptr() const override
Definition: vl.h:322
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:875
bool IsNull() const override
Definition: vl.h:320
Type GetType() const override
Definition: vl.cpp:880
Definition: vl.h:92
NumberVar & operator=(int val)
Definition: vl.cpp:638
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:626
float Val() const
Definition: vl.h:103
NumberVar(float value)
Definition: vl.h:95
std::string ToStr() const override
Definition: vl.cpp:631
VarPtr Ptr() const override
Definition: vl.h:100
const NumberVar & AsNumber() const override
Definition: vl.h:97
bool IsNull() const override
Definition: vl.h:101
NumberVar()=default
Type GetType() const override
Definition: vl.cpp:621
NumberVar & AsNumber() override
Definition: vl.h:98
bool IsNumber() const override
Definition: vl.h:96
Definition: vl.h:173
bool ForeachProp(const std::function< bool(const std::string &, const vl::Var &)> &pred, bool recursive=false) const
Definition: vl.cpp:488
void Detach(Observer *o)
Definition: vl.h:214
bool IsNull() const override
Definition: vl.h:203
bool overriddenRecursive(const std::string &propName, int count=0) const
Definition: vl.cpp:356
bool IsObject() const override
Definition: vl.h:177
vl::VarPtr Copy() const
Definition: vl.cpp:472
Var & Set(const std::string &propName)
Definition: vl.cpp:236
Type GetType() const override
Definition: vl.cpp:226
ObjectDataType mData
Definition: vl.h:230
void Attach(Observer *o, const std::string &title="")
Definition: vl.h:211
bool RenameProperty(const std::string &propName, const std::string &newName)
Definition: vl.cpp:420
Object & GetPrototype() const
Definition: vl.cpp:543
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:449
const ObjectVar & AsObject() const override
Definition: vl.cpp:216
std::shared_ptr< std::string > getRelativePathRecursive(const std::string &propName, const std::string &path="") const
Definition: vl.cpp:337
int Size() const
Definition: vl.cpp:231
void SetPrototype(const vl::Object &proto)
Definition: vl.cpp:538
Var & Set(const std::string &propName, const T &value)
Definition: vl.h:189
bool RemoveProperty(const std::string &propName)
Definition: vl.cpp:387
bool operator==(const ObjectVar &right) const
Definition: vl.cpp:201
const Var & Get(const std::string &propName) const
Definition: vl.cpp:290
int PropCount() const
Definition: vl.cpp:380
ObjectVar()=default
std::shared_ptr< std::string > GetRelativePath(const std::string &propName) const
Definition: vl.cpp:332
std::string ToStr() const override
Definition: vl.cpp:585
const void * Data() const override
Definition: vl.h:217
Observable * Observable()
Definition: vl.h:221
void Clear(bool recursive=false)
Definition: vl.cpp:555
bool Overridden(const std::string &propName) const
Definition: vl.cpp:351
bool HasOwn(const std::string &propName) const
Definition: vl.cpp:324
bool Has(const std::string &propName) const
Definition: vl.cpp:310
VarPtr Ptr() const override
Definition: vl.h:202
Definition: Observable.h:12
Definition: Observer.h:17
Definition: vl.h:116
const StringVar & AsString() const override
Definition: vl.h:121
bool Accept(Visitor &v, const char *name=nullptr) const override
Definition: vl.cpp:663
VarPtr Ptr() const override
Definition: vl.h:124
StringVar & AsString() override
Definition: vl.h:122
bool IsString() const override
Definition: vl.h:120
bool IsNull() const override
Definition: vl.h:126
std::string ToStr() const override
Definition: vl.cpp:668
StringVar(const std::string &value)
Definition: vl.h:119
Type GetType() const override
Definition: vl.cpp:657
StringVar()=default
const std::string & Val() const
Definition: vl.h:125
StringVar & operator=(const std::string &val)
Definition: vl.h:129
Definition: visitor.h:11
Definition: JSONConverter.h:9
AbstractVar Var
Definition: vl_fwd.h:39
vl::Object nullObject(nullptr)
Definition: vl.h:233
Type
Definition: vl_fwd.h:9
std::unordered_map< std::string, VarPtr > PropsContainerType
Definition: vl.h:138
vl::ListVar emptyList
Definition: vl.cpp:17
std::shared_ptr< Var > VarPtr
Definition: vl_fwd.h:41
vl::NullVar emptyVar
Definition: vl.cpp:15
std::shared_ptr< PropsDataType > ObjectDataType
Definition: vl.h:171
VarPtr MakePtr(bool value)
Definition: vl.cpp:19
std::shared_ptr< ListDataType > ListVarDataType
Definition: vl.h:246
Definition: vl.h:241
void Notify(vl::VarPtr info)
Definition: vl.cpp:681
void Update(Observable *sender, vl::VarPtr info=nullptr) override
Definition: vl.cpp:687
std::vector< VarPtr > data
Definition: vl.h:244
Definition: vl.h:250
vl::Var & data()
Definition: vl.cpp:710
int index
Definition: vl.h:251
ListInsertRet(int index, vl::Var &data)
Definition: vl.h:253
ListInsertRet()=default
static ListInsertRet Null()
Definition: vl.cpp:705
Object is both an observable and observer. It observes its nested objects's changes
Definition: vl.h:166
PropsContainerType data
Definition: vl.h:169
void Notify(vl::VarPtr info) override
Definition: vl.cpp:173
void Update(Observable *sender, vl::VarPtr info=nullptr) override
Definition: vl.cpp:179