VL
VLBackwardTraversable.h
Go to the documentation of this file.
1#pragma once
2#include <functional>
3#include <string>
4#include <unordered_map>
5#include <vector>
6#include <memory>
7#include "vl_fwd.h"
8#include "Observer.h"
9
10namespace vl
11{
12 // VarTreeNode
13 class VarTreeNode;
14 typedef std::shared_ptr<VarTreeNode> VarTreeNodePtr;
15 class ObjectTreeNode;
16 typedef std::shared_ptr<ObjectTreeNode> ObjectTreeNodePtr;
17 class ListTreeNode;
18 typedef std::shared_ptr<ListTreeNode> ListTreeNodePtr;
19 class VarNodeRegistry;
20
21 class VarTreeNode : public Observer {
22 friend class VarNodeRegistry;
23 friend class ListTreeNode;
24 friend class ObjectTreeNode;
25
26 public:
27 VarTreeNode(VarNodeRegistry& registry, vl::AbstractVar* data, VarTreeNode* parent);
28 virtual ~VarTreeNode();
29 const std::string& GetId() const;
30 int GetIndex() const;
31 std::string GetPath() const;
32 const VarNodeRegistry& GetRegistry() const;
33 virtual bool IsList() const;
34 virtual bool IsObject() const;
35 virtual ObjectTreeNode* AsObject();
36 virtual const ObjectTreeNode* AsObject() const;
37 virtual ListTreeNode* AsList();
38 virtual const ListTreeNode* AsList() const;
39 void Update(Observable* sender, vl::VarPtr info) override;
40 virtual int ChildCount() const;
41 inline const vl::Var* GetData() const {
42 return mData;
43 }
44 // Needed because of non-virtuality of std::shared_from_this()
46 inline bool IsRoot() const {
47 return mParent == nullptr;
48 }
49 inline const VarTreeNode* GetParent() const {
50 return mParent;
51 }
52 inline const void* DataPtr() const {
53 return mDataPtr;
54 }
55
56 protected:
57 bool ForeachChildren(const std::function<bool(VarTreeNode&)>& pred);
58 inline void SetParent(VarTreeNode* newParent) {
59 mParent = newParent;
60 }
61 protected:
62 vl::AbstractVar* mData = nullptr;
63 const void* mDataPtr = nullptr;
64 VarTreeNode* mParent = nullptr;
66 bool mToBeReplaced = false;
67 };
68
69
70 // ObjectTreeNode
71 class ObjectTreeNode : public VarTreeNode, public std::enable_shared_from_this<ObjectTreeNode> {
72 typedef VarTreeNode Base;
73 public:
74 ObjectTreeNode(VarNodeRegistry& registry, vl::AbstractVar* data, VarTreeNode* parent);
76 void Update(Observable* sender, vl::VarPtr info) override;
77 bool Has(const std::string& childId) const;
78 void Set(const std::string& childId, const VarTreeNodePtr& node);
79 const VarTreeNodePtr& Get(const std::string& childId) const;
80 int ChildCount() const override;
81 ObjectTreeNode* AsObject() override;
82 const ObjectTreeNode* AsObject() const override;
83 bool IsObject() const override;
84 bool Remove(const std::string& childId);
87
88 protected:
89 bool ForeachChildren(const std::function<bool(VarTreeNode&)>& pred);
90
91 private:
92 std::unordered_map<std::string, VarTreeNodePtr> mChildren;
93 };
94 typedef std::shared_ptr<ObjectTreeNode> ObjectTreeNodePtr;
95
96 // ListTreeNode
97 class ListTreeNode : public VarTreeNode, public std::enable_shared_from_this<ListTreeNode> {
98 typedef VarTreeNode Base;
99 public:
100 ListTreeNode(VarNodeRegistry& registry, vl::AbstractVar* data, VarTreeNode* parent);
102 void Update(Observable* sender, vl::VarPtr info) override;
103 inline int ChildCount() const override {
104 return mChildren.size();
105 }
106 void Set(int index, const VarTreeNodePtr& node);
107 void Add(const VarTreeNodePtr& node);
108 inline void Resize(int newSize) {
109 mChildren.resize(newSize);
110 }
111 const VarTreeNodePtr& At(int index) const;
112 bool Clear(int index);
113 ListTreeNode* AsList() override;
114 bool IsList() const override;
115 const ListTreeNode* AsList() const override;
116 void Remove(int index);
119
120 protected:
121 bool ForeachChildren(const std::function<bool(VarTreeNode&)>& pred);
122 private:
123 std::vector<VarTreeNodePtr> mChildren;
124 };
125 typedef std::shared_ptr<ListTreeNode> ListTreeNodePtr;
126
127 // VarNodeRegistry
129 // The tree in the registry consists of these classes:
130 friend class VarTreeNode;
131 friend class ObjectTreeNode;
132 friend class ListTreeNode;
133
134 public:
135 // Initialize interface
136 VarNodeRegistry(vl::AbstractVar* rootData);
137
138 public:
139 // Public interface
140 const std::string& GetId(const VarTreeNode* node) const;
141 int GetIndex(const VarTreeNode* node) const;
142 const VarTreeNode* GetNode(const vl::Var& varPtr) const;
143 const VarTreeNode* GetNode(const std::string& path) const;
145 return mTree;
146 }
147
148 protected:
149 // Protected interface
150 VarTreeNodePtr CreateNode(vl::Var& data, VarTreeNode* parent);
151 VarTreeNodePtr CreateNamedNode(const std::string& nodeId, vl::Var& data, VarTreeNode* parent);
152 VarTreeNodePtr CreateIndexedNode(int index, vl::Var& data, VarTreeNode* parent);
153 bool RemoveNode(const VarTreeNode* node);
154
155 private:
156 // Data
157 std::unordered_multimap<const void*, VarTreeNode*> mVarToNode;
158 std::unordered_map<const VarTreeNode*, std::string> mNamedNodes;
159 std::unordered_map<const VarTreeNode*, int> mIndexedNodes;
160 ObjectTreeNode mTree; // Reflects the root vl::Object
161 };
162}
Definition: VLBackwardTraversable.h:97
VarTreeNodePtr SharedFromThis() override
Definition: VLBackwardTraversable.cpp:578
void Update(Observable *sender, vl::VarPtr info) override
Definition: VLBackwardTraversable.cpp:414
void Resize(int newSize)
Definition: VLBackwardTraversable.h:108
void Add(const VarTreeNodePtr &node)
Definition: VLBackwardTraversable.cpp:567
bool IsList() const override
Definition: VLBackwardTraversable.cpp:610
ListTreeNode * AsList() override
Definition: VLBackwardTraversable.cpp:600
~ListTreeNode()
Definition: VLBackwardTraversable.cpp:411
void Set(int index, const VarTreeNodePtr &node)
Definition: VLBackwardTraversable.cpp:562
void Remove(int index)
Definition: VLBackwardTraversable.cpp:572
bool ForeachChildren(const std::function< bool(VarTreeNode &)> &pred)
Definition: VLBackwardTraversable.cpp:615
int ChildCount() const override
Definition: VLBackwardTraversable.h:103
const VarTreeNodePtr & At(int index) const
Definition: VLBackwardTraversable.cpp:588
bool Clear(int index)
Definition: VLBackwardTraversable.cpp:593
ListTreeNodePtr ListSharedFromThis()
Definition: VLBackwardTraversable.cpp:583
Definition: VLBackwardTraversable.h:71
const VarTreeNodePtr & Get(const std::string &childId) const
Definition: VLBackwardTraversable.cpp:502
ObjectTreeNode * AsObject() override
Definition: VLBackwardTraversable.cpp:539
bool IsObject() const override
Definition: VLBackwardTraversable.cpp:549
void Update(Observable *sender, vl::VarPtr info) override
Definition: VLBackwardTraversable.cpp:325
VarTreeNodePtr SharedFromThis() override
Definition: VLBackwardTraversable.cpp:524
bool Has(const std::string &childId) const
Definition: VLBackwardTraversable.cpp:492
ObjectTreeNodePtr ObjectSharedFromThis()
Definition: VLBackwardTraversable.cpp:529
bool ForeachChildren(const std::function< bool(VarTreeNode &)> &pred)
Definition: VLBackwardTraversable.cpp:554
int ChildCount() const override
Definition: VLBackwardTraversable.cpp:534
~ObjectTreeNode()
Definition: VLBackwardTraversable.cpp:322
void Set(const std::string &childId, const VarTreeNodePtr &node)
Definition: VLBackwardTraversable.cpp:497
bool Remove(const std::string &childId)
Definition: VLBackwardTraversable.cpp:510
Definition: VLBackwardTraversable.h:128
VarTreeNodePtr CreateNamedNode(const std::string &nodeId, vl::Var &data, VarTreeNode *parent)
Definition: VLBackwardTraversable.cpp:240
const std::string & GetId(const VarTreeNode *node) const
Definition: VLBackwardTraversable.cpp:145
bool RemoveNode(const VarTreeNode *node)
Definition: VLBackwardTraversable.cpp:186
VarNodeRegistry(vl::AbstractVar *rootData)
Definition: VLBackwardTraversable.cpp:140
const VarTreeNode * GetNode(const vl::Var &varPtr) const
Definition: VLBackwardTraversable.cpp:261
VarTreeNode & GetTree()
Definition: VLBackwardTraversable.h:144
VarTreeNodePtr CreateIndexedNode(int index, vl::Var &data, VarTreeNode *parent)
Definition: VLBackwardTraversable.cpp:252
int GetIndex(const VarTreeNode *node) const
Definition: VLBackwardTraversable.cpp:153
VarTreeNodePtr CreateNode(vl::Var &data, VarTreeNode *parent)
Definition: VLBackwardTraversable.cpp:161
Definition: VLBackwardTraversable.h:21
virtual ListTreeNode * AsList()
Definition: VLBackwardTraversable.cpp:109
virtual ~VarTreeNode()
Definition: VLBackwardTraversable.cpp:26
void Update(Observable *sender, vl::VarPtr info) override
Definition: VLBackwardTraversable.cpp:119
const VarNodeRegistry & GetRegistry() const
Definition: VLBackwardTraversable.cpp:84
friend class ListTreeNode
Definition: VLBackwardTraversable.h:23
void SetParent(VarTreeNode *newParent)
Definition: VLBackwardTraversable.h:58
std::string GetPath() const
Definition: VLBackwardTraversable.cpp:62
VarTreeNode * mParent
Definition: VLBackwardTraversable.h:64
bool ForeachChildren(const std::function< bool(VarTreeNode &)> &pred)
Definition: VLBackwardTraversable.cpp:135
VarNodeRegistry & mRegistry
Definition: VLBackwardTraversable.h:65
VarTreeNode(VarNodeRegistry &registry, vl::AbstractVar *data, VarTreeNode *parent)
Definition: VLBackwardTraversable.cpp:17
const void * DataPtr() const
Definition: VLBackwardTraversable.h:52
virtual int ChildCount() const
Definition: VLBackwardTraversable.cpp:124
const VarTreeNode * GetParent() const
Definition: VLBackwardTraversable.h:49
const void * mDataPtr
Definition: VLBackwardTraversable.h:63
virtual VarTreeNodePtr SharedFromThis()
Definition: VLBackwardTraversable.cpp:130
bool IsRoot() const
Definition: VLBackwardTraversable.h:46
bool mToBeReplaced
Definition: VLBackwardTraversable.h:66
vl::AbstractVar * mData
Definition: VLBackwardTraversable.h:62
friend class ObjectTreeNode
Definition: VLBackwardTraversable.h:24
const vl::Var * GetData() const
Definition: VLBackwardTraversable.h:41
const std::string & GetId() const
Definition: VLBackwardTraversable.cpp:32
virtual ObjectTreeNode * AsObject()
Definition: VLBackwardTraversable.cpp:99
int GetIndex() const
Definition: VLBackwardTraversable.cpp:47
virtual bool IsList() const
Definition: VLBackwardTraversable.cpp:89
virtual bool IsObject() const
Definition: VLBackwardTraversable.cpp:94
Definition: JSONConverter.h:8
std::shared_ptr< ObjectTreeNode > ObjectTreeNodePtr
Definition: VLBackwardTraversable.h:15
std::shared_ptr< VarTreeNode > VarTreeNodePtr
Definition: VLBackwardTraversable.h:13
std::shared_ptr< ListTreeNode > ListTreeNodePtr
Definition: VLBackwardTraversable.h:17