HOG2
Json.cpp
Go to the documentation of this file.
1 #include <memory>
2 #include <cassert>
3 #include "Json.h"
4 
5 
7 
8 // Constructors
10  : tag(NIL), value(std::unique_ptr<bool>(new bool(false)))
11 { //value.b.reset(new bool);
12  //*(value.b) = false;
13  std::cout << "Constructed\n"; }
14 
16  : tag(BOOL), value(std::unique_ptr<bool>(new bool(boolVal)))
17 { }
18 
20  : tag(INT), value(std::unique_ptr<int>(new int(intVal)))
21 { }
22 
23 Json::NodeValue::NodeValue(double doubleVal)
24  : tag(DOUBLE), value(std::unique_ptr<double>(new double(doubleVal)))
25 { }
26 
27 Json::NodeValue::NodeValue(std::string stringVal)
28  : tag(STRING), value(std::unique_ptr<std::string>(new std::string(stringVal)))
29 { }
30 
31 Json::NodeValue::NodeValue(const char* stringVal)
32  : tag(STRING), value(std::unique_ptr<std::string>(new std::string(stringVal)))
33 { }
34 
35 Json::NodeValue::NodeValue(std::shared_ptr<Json::Node> nodeVal)
36  : tag(NODE), value(nodeVal)
37 { }
38 
40  switch (nodeVal.tag) {
41  case NIL:
42  NodeValue();
43  break;
44 
45  case BOOL:
46  NodeValue(*(nodeVal.value.b));
47  break;
48 
49  case INT:
50  NodeValue(*(nodeVal.value.i));
51  break;
52 
53  case DOUBLE:
54  NodeValue(*(nodeVal.value.d));
55  break;
56 
57  case STRING:
58  NodeValue(*(nodeVal.value.s));
59  break;
60 
61  case VECTOR:
62  // TODO
63  //NodeValue(*(nodeVal.value.v));
64  break;
65 
66  default:
67  assert(0);
68  }
69 }
70 
71 Json::NodeValue::NodeValue(std::vector<std::unique_ptr<Json::NodeValue>> vectorValue)
72  : tag(VECTOR), value(std::unique_ptr<std::vector<std::unique_ptr<Json::NodeValue>>>(new std::vector<std::unique_ptr<Json::NodeValue>>()))
73 {
74  for (auto &elem : vectorValue) {
75  value.v->push_back(std::unique_ptr<Json::NodeValue>(new NodeValue(*elem)));
76  }
77 }
78 
79 Json::NodeValue::NodeValue(std::unique_ptr<std::vector<std::unique_ptr<Json::NodeValue>>> vectorValue)
80  : tag(VECTOR), value(std::move(vectorValue))
81 { }
82 
83 Json::NodeValue::~NodeValue() { value.destruct(tag); }
84 
85 // Format the value to a stream
86 std::ostream &operator<<(std::ostream &os, Json::NodeValue const &nodeValue)
87 {
88  bool list = false;
89  switch (nodeValue.tag)
90  {
92  os << "null";
93  break;
94 
96  os << (*(nodeValue.value.b) ? "true" : "false");
97  break;
98 
100  os << *(nodeValue.value.i);
101  break;
102 
104  os << *(nodeValue.value.d);
105  break;
106 
108  os << "\"" << *(nodeValue.value.s) << "\"";
109  break;
110 
112  if (nodeValue.value.n->value->tag != Json::NodeValue::NODE && nodeValue.value.n->value->tag != Json::NodeValue::VECTOR) {
113  os << *(nodeValue.value.n);
114  } else {
115  os << "{\n" << *(nodeValue.value.n) << "\n}";
116  }
117  break;
118 
120  for (const auto &elem : *(nodeValue.value.v)) {
121  if (elem->tag != Json::NodeValue::NODE) {
122  list = true;
123  break;
124  }
125  }
126 
127  if (list) {
128  os << "[\n";
129  } else {
130  os << "{\n";
131  }
132  for (const auto &elem : *(nodeValue.value.v))
133  {
134  if (elem != *(nodeValue.value.v->begin())) {
135  os << ", \n";
136  }
137  os << *elem;
138  }
139  if (list) {
140  os << "\n]";
141  } else {
142  os << "\n}";
143  }
144  break;
145 
146  default:
147  assert(0);
148  }
149 
150  return os;
151 }
152 
153 
155 // Constructors
156 Json::Node::Node(std::string name)
157  : name(name), value(std::unique_ptr<NodeValue>(new NodeValue(false))) { }
158 
159 Json::Node::Node(std::string name, std::unique_ptr<NodeValue> val)
160  : name(name), value(std::move(val)) { }
161 
163 
164 // Used to get the "this" smart pointer
165 std::shared_ptr<Json::Node> Json::Node::getPtr()
166 {
167  return shared_from_this();
168 }
169 
170 // Add a default child node to the current node
171 std::shared_ptr<Json::Node> Json::Node::addChild(std::string name) {
172  // If there is no value yet overwrite child
173  if (value->tag == Json::NodeValue::NIL)
174  {
175  std::unique_ptr<Json::NodeValue> newValue(new Json::NodeValue());
176  std::shared_ptr<Json::Node> newNode(new Json::Node(name, std::move(newValue)));
177  std::unique_ptr<Json::NodeValue> nodeValue(new Json::NodeValue(newNode));
178 
179  value = std::move(nodeValue);
180 
181  return newNode;
182  }
183  // Else if it is a vector append new child
184  else if (value->tag == Json::NodeValue::VECTOR)
185  {
186  std::unique_ptr<Json::NodeValue> newValue(new Json::NodeValue());
187  std::shared_ptr<Json::Node> newNode(new Json::Node(name, std::move(newValue)));
188  std::unique_ptr<Json::NodeValue> nodeValue(new Json::NodeValue(newNode));
189 
190  value->value.v->push_back(std::move(nodeValue));
191 
192  return newNode;
193  }
194  // Otherwise make a new vector and add both the old child and the new child to it
195  else
196  {
197  std::unique_ptr<Json::NodeValue> newValue(new Json::NodeValue());
198  std::shared_ptr<Json::Node> newNode(new Json::Node(name, std::move(newValue)));
199  std::unique_ptr<Json::NodeValue> nodeValue(new Json::NodeValue(newNode));
200  std::unique_ptr<std::vector<std::unique_ptr<Json::NodeValue>>> vec(new std::vector<std::unique_ptr<Json::NodeValue>>());
201  vec->push_back(std::move(value));
202  vec->push_back(std::move(nodeValue));
203  value->value.~Values();
204  std::unique_ptr<Json::NodeValue> joinedValue(new Json::NodeValue(std::move(vec)));
205  value = std::move(joinedValue);
206 
207  return newNode;
208  }
209 }
210 
211 // Format a json node to a stream
212 std::ostream &operator<<(std::ostream &os, Json::Node const &node)
213 {
214  os << "\"" << node.name << "\" : ";
215  os << *(node.value);
216  return os;
217 }
218 
219 
222  : root(std::unique_ptr<std::vector<std::shared_ptr<Node>>>(new std::vector<std::shared_ptr<Node>>)) { }
223 
225 
226 // Adds a default child node to the json root
227 std::shared_ptr<Json::Node> Json::addChild(std::string name)
228 {
229  std::unique_ptr<Json::NodeValue> value(new Json::NodeValue());
230  std::shared_ptr<Json::Node> node(new Json::Node(name, std::move(value)));
231 
232  root->push_back(node);
233 
234  return node;
235 }
236 
237 // Format the json tree to a stream
238 std::ostream &operator<<(std::ostream &os, Json const &json)
239 {
240  os << "{\n";
241  for (const auto &elem : *(json.root))
242  {
243  if (elem != *(json.root->begin())) {
244  os << ",\n";
245  }
246  os << *elem;
247  }
248  os << "\n}";
249 
250  return os;
251 }
252 
Json::Node::getPtr
std::shared_ptr< Node > getPtr()
Definition: Json.cpp:165
Json::NodeValue::Values::v
std::unique_ptr< std::vector< std::unique_ptr< NodeValue > > > v
Definition: Json.h:87
Json::NodeValue::DOUBLE
@ DOUBLE
Definition: Json.h:34
Json::Node::~Node
~Node()
Definition: Json.cpp:162
Json::NodeValue::BOOL
@ BOOL
Definition: Json.h:34
node::name
char name[30]
Definition: Graph.h:239
Json::NodeValue::INT
@ INT
Definition: Json.h:34
Json::NodeValue::Values::d
std::unique_ptr< double > d
Definition: Json.h:84
Json::NodeValue::Values::b
std::unique_ptr< bool > b
Definition: Json.h:82
Json::NodeValue
Definition: Json.h:19
Json::Node::Node
Node(std::string)
Definition: Json.cpp:156
Json::root
std::unique_ptr< std::vector< std::shared_ptr< Node > > > root
Definition: Json.h:91
Json::NodeValue::NODE
@ NODE
Definition: Json.h:34
Json::Json
Json()
Definition: Json.cpp:221
Json::addChild
std::shared_ptr< Node > addChild(std::string)
Definition: Json.cpp:227
Json::NodeValue::NIL
@ NIL
Definition: Json.h:34
Json::~Json
~Json()
Definition: Json.cpp:224
operator<<
std::ostream & operator<<(std::ostream &os, Json::NodeValue const &nodeValue)
Definition: Json.cpp:86
Json::NodeValue::tag
enum Json::NodeValue::@15 tag
Json::NodeValue::Values::s
std::unique_ptr< std::string > s
Definition: Json.h:85
Json::NodeValue::STRING
@ STRING
Definition: Json.h:34
Json::operator<<
friend std::ostream & operator<<(std::ostream &, Json const &)
Definition: Json.cpp:238
Json::NodeValue::Values::n
std::shared_ptr< Node > n
Definition: Json.h:86
Json::NodeValue::value
union Json::NodeValue::Values value
std
Definition: CanonicalGraphEnvironment.h:26
Json::Node
Definition: Json.h:103
Json::NodeValue::VECTOR
@ VECTOR
Definition: Json.h:34
Json::NodeValue::~NodeValue
~NodeValue()
Definition: Json.cpp:83
Json.h
Json::Node::addChild
std::shared_ptr< Node > addChild(std::string)
Definition: Json.cpp:171
Json::NodeValue::NodeValue
NodeValue()
Definition: Json.cpp:9
Json::NodeValue::Values::i
std::unique_ptr< int > i
Definition: Json.h:83
node
Nodes to be stored within a Graph.
Definition: Graph.h:170
Json
Simple class that alows for building a tree of data that can be serialized into Json format.
Definition: Json.h:11