annotate C++/modules/Json/Json.cpp @ 475:b681299e6987

Json: removal of json::Object, json::Array, json::Document
author David Demelier <markand@malikania.fr>
date Mon, 09 Nov 2015 16:52:38 +0100
parents 902b034df6e3
children c7825b8c6145
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
2 * Json.cpp -- C++14 JSON manipulation using jansson parser
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
403
d5ec1174b707 Massive cleanup
David Demelier <markand@malikania.fr>
parents: 334
diff changeset
4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr>
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
19 #include "Json.h"
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
20
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
21 #include <jansson.h>
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
404
9ab878fb9fa2 Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
23 namespace json {
9ab878fb9fa2 Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
24
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
25 namespace {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
26
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
27 void readObject(Value &parent, json_t *object);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
28 void readArray(Value &parent, json_t *array);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
29
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
30 Value readValue(json_t *v)
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
31 {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
32 if (json_is_null(v)) {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
33 return Value{nullptr};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
34 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
35 if (json_is_string(v)) {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
36 return Value{json_string_value(v)};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
37 }
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
38 if (json_is_real(v)) {
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
39 return Value{json_number_value(v)};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
40 }
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
41 if (json_is_integer(v)) {
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
42 return Value{static_cast<int>(json_integer_value(v))};
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
43 }
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
44 if (json_is_boolean(v)) {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
45 return Value{json_boolean_value(v)};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
46 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
47 if (json_is_object(v)) {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
48 Value object{Type::Object};
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
49
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
50 readObject(object, v);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
51
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
52 return object;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
53 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
54 if (json_is_array(v)) {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
55 Value array{Type::Array};
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
56
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
57 readArray(array, v);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
58
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
59 return array;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
60 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
61
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
62 return Value{};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
63 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
64
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
65 void readObject(Value &parent, json_t *object)
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
66 {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
67 const char *key;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
68 json_t *value;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
69
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
70 json_object_foreach(object, key, value) {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
71 parent.insert(key, readValue(value));
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
72 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
73 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
74
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
75 void readArray(Value &parent, json_t *array)
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
76 {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
77 size_t index;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
78 json_t *value;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
79
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
80 json_array_foreach(array, index, value) {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
81 parent.append(readValue(value));
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
82 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
83 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
84
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
85 template <typename Func, typename... Args>
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
86 Value convert(Func fn, Args&&... args)
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
87 {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
88 json_error_t error;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
89 json_t *json = fn(std::forward<Args>(args)..., &error);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
90
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
91 if (json == nullptr) {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
92 throw Error{error.text, error.source, error.line, error.column, error.position};
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
93 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
94
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
95 Value value;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
96
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
97 if (json_is_object(json)) {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
98 value = Value{Type::Object};
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
99 readObject(value, json);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
100 } else {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
101 value = Value{Type::Array};
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
102 readArray(value, json);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
103 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
104
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
105 json_decref(json);
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
106
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
107 return value;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
108 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
109
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
110 } // !namespace
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
111
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
112 void Value::copy(const Value &other)
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
113 {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
114 switch (other.m_type) {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
115 case Type::String:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
116 new (&m_string) std::string();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
117 m_string = std::move(other.m_string);
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
118 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
119 case Type::Real:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
120 m_number = other.m_number;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
121 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
122 case Type::Int:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
123 m_integer = other.m_integer;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
124 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
125 case Type::Boolean:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
126 m_boolean = other.m_boolean;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
127 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
128 case Type::Object:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
129 new (&m_object) std::map<std::string, Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
130 m_object = std::move(other.m_object);
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
131 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
132 case Type::Array:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
133 new (&m_array) std::deque<Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
134 m_array = std::move(other.m_array);
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
135 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
136 default:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
137 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
138 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
139
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
140 m_type = other.m_type;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
141 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
142
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
143 void Value::move(Value &&other)
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
144 {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
145 switch (other.m_type) {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
146 case Type::String:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
147 new (&m_string) std::string(std::move(other.m_string));
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
148 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
149 case Type::Real:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
150 m_number = other.m_number;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
151 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
152 case Type::Int:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
153 m_integer = other.m_integer;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
154 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
155 case Type::Boolean:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
156 m_boolean = other.m_boolean;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
157 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
158 case Type::Object:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
159 new (&m_object) std::map<std::string, Value>(std::move(other.m_object));
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
160 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
161 case Type::Array:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
162 new (&m_array) std::deque<Value>(std::move(other.m_array));
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
163 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
164 default:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
165 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
166 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
167
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
168 m_type = other.m_type;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
169 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
170
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
171 Value::Value(Type type)
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
172 : m_type{type}
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
173 {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
174 switch (type) {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
175 case Type::String:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
176 new (&m_string) std::string();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
177 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
178 case Type::Array:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
179 new (&m_array) std::deque<Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
180 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
181 case Type::Object:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
182 new (&m_object) std::map<std::string, Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
183 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
184 case Type::Real:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
185 m_number = 0;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
186 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
187 case Type::Int:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
188 m_integer = 0;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
189 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
190 case Type::Boolean:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
191 m_boolean = false;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
192 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
193 default:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
194 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
195 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
196 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
197
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
198 Value::~Value()
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
199 {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
200 switch (m_type) {
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
201 case Type::String:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
202 m_string.~basic_string();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
203 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
204 case Type::Object:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
205 m_object.~map<std::string, Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
206 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
207 case Type::Array:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
208 m_array.~deque<Value>();
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
209 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
210 default:
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
211 break;
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
212 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
213 }
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
214
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
215 bool Value::toBool() const noexcept
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
216 {
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
217 if (m_type != Type::Boolean) {
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
218 return false;
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
219 }
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
220
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
221 return m_boolean;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
222 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
223
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
224 double Value::toReal() const noexcept
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
225 {
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
226 if (m_type != Type::Real) {
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
227 return 0;
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
228 }
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
229
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
230 return m_number;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
231 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
232
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
233 int Value::toInt() const noexcept
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
234 {
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
235 if (m_type != Type::Int) {
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
236 return 0;
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
237 }
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
238
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
239 return m_integer;
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
240 }
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
241
405
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
242 std::string Value::toString() const noexcept
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
243 {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
244 if (m_type != Type::String) {
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
245 return "";
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
246 }
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
247
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
248 return m_string;
David Demelier <markand@malikania.fr>
parents: 404
diff changeset
249 }
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
251 Value::Value(const Buffer &buffer)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
253 *this = convert(json_loads, buffer.text.c_str(), 0);
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
254 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
255
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
256 Value::Value(const File &file)
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
257 {
475
b681299e6987 Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
258 *this = convert(json_load_file, file.path.c_str(), 0);
404
9ab878fb9fa2 Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
259 }
9ab878fb9fa2 Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents: 403
diff changeset
260
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
261 std::string escape(const std::string &value)
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
262 {
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
263 std::string result;
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
264
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
265 for (auto it = value.begin(); it != value.end(); ++it) {
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
266 switch (*it) {
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
267 case '\\':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
268 result += "\\\\";
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
269 break;
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
270 case '/':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
271 result += "\\/";
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
272 break;
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
273 case '"':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
274 result += "\\\"";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
275 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
276 case '\b':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
277 result += "\\b";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
278 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
279 case '\f':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
280 result += "\\f";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
281 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
282 case '\n':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
283 result += "\\n";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
284 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
285 case '\r':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
286 result += "\\r";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
287 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
288 case '\t':
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
289 result += "\\t";
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
290 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
291 default:
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
292 result += *it;
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
293 break;
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
294 }
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
295 }
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
296
451
902b034df6e3 Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
297 return result;
445
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
298 }
f5e62f6c1475 Json: add escape free function
David Demelier <markand@malikania.fr>
parents: 406
diff changeset
299
406
David Demelier <markand@malikania.fr>
parents: 405
diff changeset
300 } // !json