annotate C++/Json.cpp @ 314:4c3019385769

Json: add iterators TODO: - Test operator->, const_iterator must not let modify - Test const and non const operator[]
author David Demelier <markand@malikania.fr>
date Wed, 25 Feb 2015 13:53:41 +0100
parents ea1a73a7d468
children b67b2da45bb0
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 /*
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Json.cpp -- jansson C++11 wrapper
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr>
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
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
19 #include <stdexcept>
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
20
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include "Json.h"
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
23 /* --------------------------------------------------------
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
24 * JsonObject
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
25 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
27 JsonObject JsonValue::toObject() const noexcept
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
29 json_incref(m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
30
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
31 return JsonObject(m_handle.get());
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
32 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
33
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
34 JsonArray JsonValue::toArray() const noexcept
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
35 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
36 json_incref(m_handle.get());
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
38 return JsonArray(m_handle.get());
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
39 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
40
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
41 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
42 * JsonArray
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
43 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
45 JsonValue JsonArray::at(int index) const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
47 auto value = json_array_get(m_handle.get(), index);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
49 if (value == nullptr)
312
ea1a73a7d468 Json: use uniform initializion everywhere
David Demelier <markand@malikania.fr>
parents: 311
diff changeset
50 throw JsonError{"index out of bounds"};
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
51
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
52 json_incref(value);
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
53
312
ea1a73a7d468 Json: use uniform initializion everywhere
David Demelier <markand@malikania.fr>
parents: 311
diff changeset
54 return JsonValue{value};
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
57 JsonValue JsonArray::operator[](int index) const noexcept
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
58 {
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
59 auto value = json_array_get(m_handle.get(), index);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
60
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
61 if (value == nullptr)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
62 return JsonValue();
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
63
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
64 json_incref(value);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
65
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
66 return JsonValue(value);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
67 }
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
68
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
69 JsonArray::Ref JsonArray::operator[](int index) noexcept
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
70 {
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
71 auto value = json_array_get(m_handle.get(), index);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
72
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
73 if (value == nullptr)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
74 value = json_null();
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
75 else
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
76 json_incref(value);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
77
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
78 return Ref(value, *this, index);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
79 }
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
80
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
81 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
82 * JsonObject
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
83 * -------------------------------------------------------- */
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
84
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
85 JsonObject::Ref JsonObject::operator[](const std::string &name)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 {
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
87 if (typeOf() != JsonType::Object)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
88 return Ref(JsonValue(), *this, name);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
89
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
90 auto value = json_object_get(m_handle.get(), name.c_str());
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
91
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
92 json_incref(value);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
93
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
94 return Ref(value, *this, name);
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
95 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
96
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
97 JsonValue JsonObject::operator[](const std::string &name) const
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
98 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
99 if (typeOf() != JsonType::Object)
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
100 return JsonValue();
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
102 auto value = json_object_get(m_handle.get(), name.c_str());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
103
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
104 if (value == nullptr)
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
105 return JsonValue();
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
106
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
107 json_incref(value);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
109 return JsonValue(value);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
111
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
112 /* --------------------------------------------------------
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
113 * JsonDocument
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
114 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
116 JsonValue JsonDocument::read(std::string content, int flags) const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
118 json_error_t error;
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
119 json_t *json = json_loads(content.c_str(), flags, &error);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
121 if (json == nullptr)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
122 throw JsonError(error);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
124 return JsonValue(json);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
127 JsonValue JsonDocument::read(std::ifstream &stream, int flags) const
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
128 {
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
129 if (!stream.is_open())
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
130 throw JsonError("File not opened");
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
131
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
132 stream.seekg(0, stream.end);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
133 auto length = stream.tellg();
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
134 stream.seekg(0, stream.beg);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
135
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
136 std::string buffer;
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
137 buffer.resize(length, ' ');
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
138
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
139 stream.read(&buffer[0], length);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
140 stream.close();
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
141
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
142 return read(std::move(buffer), flags);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 }
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
144
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
145 JsonDocument::JsonDocument(std::ifstream &stream, int flags)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
146 {
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
147 m_value = read(stream, flags);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
148 }
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
149
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
150 JsonDocument::JsonDocument(std::ifstream &&stream, int flags)
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
151 {
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
152 m_value = read(stream, flags);
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
153 }
314
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
154
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
155 JsonDocument::JsonDocument(std::string content, int flags)
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
156 {
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
157 m_value = read(std::move(content), flags);
4c3019385769 Json: add iterators
David Demelier <markand@malikania.fr>
parents: 312
diff changeset
158 }