annotate common/json.h @ 2:3fe22529f66c

Irccdctl: invalid alias arguments destructuration
author David Demelier <markand@malikania.fr>
date Tue, 09 Feb 2016 12:49:27 +0100
parents 1158cffe5a5e
children 03068f5ed79d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * json.h -- C++14 JSON manipulation using jansson parser
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _JSON_H_
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _JSON_H_
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * @file json.h
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * @brief Jansson C++14 wrapper
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * These classes can be used to build or parse JSON documents using jansson library. It is designed to be safe
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 * and explicit. It does not implement implicit sharing like jansson so when you access (e.g. Value::toObject) values
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 * you get real copies, thus when you read big documents it can has a performance cost.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 #include <cassert>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <exception>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include <initializer_list>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <map>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <string>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <utility>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <vector>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 namespace irccd {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 * Json namespace.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 namespace json {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 * @enum Type
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 * @brief Type of Value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 enum class Type {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 Array, //!< Value is an array []
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 Boolean, //!< Value is boolean
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 Int, //!< Value is integer
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 Null, //!< Value is defined to null
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 Object, //!< Value is object {}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 Real, //!< Value is float
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 String //!< Value is unicode string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 * @class Error
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 * @brief Error description.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 class Error : public std::exception {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 private:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 std::string m_text;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 std::string m_source;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 int m_line;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 int m_column;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 int m_position;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * Create the error.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 * @param text the text message
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 * @param source the source (e.g. file name)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 * @param line the line number
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 * @param column the column number
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 inline Error(std::string text, std::string source, int line, int column, int position) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 : m_text{std::move(text)}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 , m_source{std::move(source)}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 , m_line{line}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 , m_column{column}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 , m_position{position}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * Get the error message.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * @return the text
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 inline const std::string &text() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 return m_text;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * Get the source (e.g. a file name).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 * @return the source
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 inline const std::string &source() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 return m_source;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 * Get the line.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * @return the line
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 inline int line() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 return m_line;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 * Get the column.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 * @return the column
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 inline int column() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 return m_column;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 * Get the position.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 * @return the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 inline int position() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 return m_position;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 * Get the error message.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 * @return the message
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 const char *what() const noexcept override
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 return m_text.c_str();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 * @class Buffer
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 * @brief Open JSON document from text.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 class Buffer {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 std::string text; //!< The JSON text
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 * @class File
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 * @brief Open JSON document from a file.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 class File {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 std::string path; //!< The path to the file
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 * @class Value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 * @brief Generic JSON value wrapper.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 class Value {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 private:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 Type m_type{Type::Null};
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 union {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 double m_number;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 bool m_boolean;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 int m_integer;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 std::string m_string;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 std::vector<Value> m_array;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 std::map<std::string, Value> m_object;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 void copy(const Value &);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 void move(Value &&);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 std::string toJson(int indent, int current) const;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 * @class BaseIterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 * @brief This is the base class for iterator and const_iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 * This iterator works for both arrays and objects. Because of that purpose, it is only available
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 * as forward iterator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 * When iterator comes from an object, you can use key() otherwise you can use index().
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 template <typename ValueType, typename ArrayIteratorType, typename ObjectIteratorType>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 class BaseIterator : public std::iterator<std::forward_iterator_tag, ValueType> {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 private:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 friend class Value;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 ValueType &m_value;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 ArrayIteratorType m_ita;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 ObjectIteratorType m_itm;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 inline void increment()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if (m_value.isObject()) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 m_itm++;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 m_ita++;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 BaseIterator(ValueType &value, ObjectIteratorType it)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 : m_value(value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 , m_itm(it)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 BaseIterator(ValueType &value, ArrayIteratorType it)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 : m_value(value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 , m_ita(it)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 * Get the iterator key (for objects).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 * @pre iterator must be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * @pre iterator must come from object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 * @return the key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 inline const std::string &key() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 assert(m_value.isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 assert(m_itm != m_value.m_object.end());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 return m_itm->first;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 * Get the iterator position (for arrays).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 * @pre iterator must be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 * @pre iterator must come from arrays
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 * @return the index
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 inline unsigned index() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 assert(m_value.isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 assert(m_ita != m_value.m_array.end());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 return std::distance(m_value.m_array.begin(), m_ita);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 * Dereference the iterator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 * @pre iterator be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 inline ValueType &operator*() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 assert((m_value.isArray() && m_ita != m_value.m_array.end()) ||
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 (m_value.isObject() && m_itm != m_value.m_object.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 return (m_value.m_type == Type::Object) ? m_itm->second : *m_ita;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
274
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 * Dereference the iterator as a pointer.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 * @pre iterator must be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 inline ValueType *operator->() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 assert((m_value.isArray() && m_ita != m_value.m_array.end()) ||
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 (m_value.isObject() && m_itm != m_value.m_object.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
285
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 return (m_value.m_type == Type::Object) ? &m_itm->second : &(*m_ita);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
288
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 * Increment the iterator. (Prefix version).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 * @pre iterator must be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 * @return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 inline BaseIterator &operator++() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 assert((m_value.isArray() && m_ita != m_value.m_array.end()) ||
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 (m_value.isObject() && m_itm != m_value.m_object.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
299
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 increment();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 * Increment the iterator. (Postfix version).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 * @pre iterator must be dereferenceable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 * @return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 inline BaseIterator &operator++(int) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 assert((m_value.isArray() && m_ita != m_value.m_array.end()) ||
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 (m_value.isObject() && m_itm != m_value.m_object.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
315
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 increment();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
317
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 * Compare two iterators.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 * @param it1 the first iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 * @param it2 the second iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 * @return true if they are same
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 bool operator==(const BaseIterator &it) const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 if (m_value.isObject() && it.m_value.isObject())
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 return m_itm == it.m_itm;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 if (m_value.isArray() && it.m_value.isArray())
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 return m_ita == it.m_ita;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
334
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 return false;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
337
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 * Test if the iterator is different.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 * @param it the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 * @return true if they are different
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 inline bool operator!=(const BaseIterator &it) const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 return !(*this == it);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 public:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 * Forward iterator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 using iterator = BaseIterator<Value, typename std::vector<Value>::iterator, typename std::map<std::string, Value>::iterator>;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
355
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 * Const forward iterator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 using const_iterator = BaseIterator<const Value, typename std::vector<Value>::const_iterator, typename std::map<std::string, Value>::const_iterator>;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
360
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 * Construct a null value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 inline Value()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
367
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 * Create a value with a specified type, this is usually only needed when you want to create an object or
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 * an array.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 * For any other types, initialize with sane default value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 * @param type the type
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 Value(Type type);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
377
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 * Construct a null value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 inline Value(std::nullptr_t) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
382 : m_type{Type::Null}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
385
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 * Construct a boolean value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 * @param value the boolean value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 inline Value(bool value) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 : m_type{Type::Boolean}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 , m_boolean{value}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
396
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 * Create value from integer.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 inline Value(int value) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 : m_type{Type::Int}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 , m_integer{value}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
407
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 * Construct a value from a C-string.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 * @param value the C-string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 inline Value(const char *value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 : m_type{Type::String}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 new (&m_string) std::string{value ? value : ""};
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
418
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 * Construct a number value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 * @param value the real value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 inline Value(double value) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 : m_type{Type::Real}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 , m_number{value}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
429
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 * Construct a string value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 * @param value the string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 inline Value(std::string value) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 : m_type{Type::String}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 new (&m_string) std::string{std::move(value)};
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
440
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 * Create an object from a map.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
444 * @param values the values
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 * @see fromObject
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
446 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 inline Value(std::map<std::string, Value> values)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 : Value{Type::Object}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 for (const auto &pair : values) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 insert(pair.first, pair.second);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
454
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 * Create an array from a vector.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 * @param values the values
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 * @see fromArray
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 inline Value(std::vector<Value> values)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 : Value{Type::Array}
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 for (Value value : values) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 append(std::move(value));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
468
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
470 * Construct a value from a buffer.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
471 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 * @param buffer the text
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
473 * @throw Error on errors
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 Value(const Buffer &buffer);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
476
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
478 * Construct a value from a file.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 * @param file the file
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 * @throw Error on errors
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 Value(const File &file);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
484
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 * Move constructor.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 * @param other the value to move from
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
490 inline Value(Value &&other)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
492 move(std::move(other));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
494
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 * Copy constructor.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 * @param other the value to copy from
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
500 inline Value(const Value &other)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 copy(other);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
503 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
504
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 * Copy operator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 * @param other the value to copy from
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
509 * @return *this
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
510 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 inline Value &operator=(const Value &other)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
512 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 copy(other);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
514
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
516 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
517
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
518 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
519 * Move operator.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
520 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
521 * @param other the value to move from
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
523 inline Value &operator=(Value &&other)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
524 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
525 move(std::move(other));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
526
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
527 return *this;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
529
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
530 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
531 * Destructor.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
532 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
533 ~Value();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
534
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
535 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
536 * Get an iterator to the beginning.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
537 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
539 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
540 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 inline iterator begin() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
542 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
543 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
544
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 return m_type == Type::Object ? iterator(*this, m_object.begin()) : iterator(*this, m_array.begin());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
547
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
548 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
549 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
551 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
552 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
553 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 inline const_iterator begin() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
555 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
556 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
557
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
558 return m_type == Type::Object ? const_iterator(*this, m_object.begin()) : const_iterator(*this, m_array.begin());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
559 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
560
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
561 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
562 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
563 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
564 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
565 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
566 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
567 inline const_iterator cbegin() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
568 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
569 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
570
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
571 return m_type == Type::Object ? const_iterator(*this, m_object.cbegin()) : const_iterator(*this, m_array.cbegin());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
572 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
573
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
574 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
575 * Get an iterator to the end.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
576 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
579 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
580 inline iterator end() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
581 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
582 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
583
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
584 return m_type == Type::Object ? iterator(*this, m_object.end()) : iterator(*this, m_array.end());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
586
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 * Get an iterator to the end.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
589 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
591 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
592 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
593 inline const_iterator end() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
594 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
595 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
596
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
597 return m_type == Type::Object ? const_iterator(*this, m_object.end()) : const_iterator(*this, m_array.end());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
598 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
599
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
600 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
601 * Get an iterator to the end.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
603 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
604 * @return the iterator
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
605 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
606 inline const_iterator cend() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
607 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
608 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
609
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
610 return m_type == Type::Object ? const_iterator(*this, m_object.cend()) : const_iterator(*this, m_array.cend());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
612
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
613 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
614 * Get the value type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
615 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
616 * @return the type
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
617 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
618 inline Type typeOf() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
619 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
620 return m_type;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
621 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
622
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
623 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
624 * Get the value as boolean.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
625 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
626 * @return the value or false if not a boolean
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
627 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
628 bool toBool() const noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
629
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
630 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
631 * Get the value as integer.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
632 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
633 * @return the value or 0 if not a integer
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
634 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
635 int toInt() const noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
636
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
637 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
638 * Get the value as real.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
639 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
640 * @return the value or 0 if not a real
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
641 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
642 double toReal() const noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
643
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
644 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
645 * Get the value as string.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
646 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
647 * @param coerce set to true to coerce the value if not a string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
648 * @return the value or empty string if not a string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
649 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
650 std::string toString(bool coerce = false) const noexcept;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
651
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
652 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
653 * Check if the value is boolean type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
654 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
655 * @return true if boolean
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
656 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
657 inline bool isBool() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
658 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
659 return m_type == Type::Boolean;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
660 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
661
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
662 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
663 * Check if the value is integer type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
664 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
665 * @return true if integer
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
666 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
667 inline bool isInt() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
668 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
669 return m_type == Type::Int;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
670 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
671
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
672 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
673 * Check if the value is object type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
674 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
675 * @return true if object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
677 inline bool isObject() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
679 return m_type == Type::Object;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
680 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
681
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
682 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
683 * Check if the value is array type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
684 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
685 * @return true if array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
686 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
687 inline bool isArray() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
688 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
689 return m_type == Type::Array;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
690 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
691
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
692 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
693 * Check if the value is integer or real type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
694 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
695 * @return true if integer or real
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
696 * @see toInt
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
697 * @see toReal
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
698 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
699 inline bool isNumber() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
700 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
701 return m_type == Type::Real || m_type == Type::Int;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
702 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
703
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
704 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
705 * Check if the value is real type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
706 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
707 * @return true if real
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
708 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
709 inline bool isReal() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
710 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
711 return m_type == Type::Real;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
712 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
713
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
714 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
715 * Check if the value is null type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
716 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
717 * @return true if null
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
718 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
719 inline bool isNull() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
720 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
721 return m_type == Type::Null;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
722 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
723
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
724 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
725 * Check if the value is string type.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
726 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
727 * @return true if string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
728 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
729 inline bool isString() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
730 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
731 return m_type == Type::String;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
732 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
733
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
734 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
735 * Get the array or object size.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
736 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
737 * @pre must be an array or object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
738 * @return the size
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
739 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
740 inline unsigned size() const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
741 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
742 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
743
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
744 if (m_type == Type::Object) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
745 return m_object.size();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
746 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
747
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
748 return m_array.size();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
749 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
750
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
751 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
752 * Remove all the values.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
753 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
754 * @pre must be an array or an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
755 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
756 inline void clear() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
757 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
758 assert(isArray() || isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
759
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
760 if (m_type == Type::Array) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
761 m_array.clear();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
762 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
763 m_object.clear();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
764 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
765 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
766
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
767 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
768 * Array functions
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
769 * ----------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
770 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
771
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
772 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
773 * Get the value at the specified position or the defaultValue if position is out of bounds.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
774 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
775 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
776 * @param defaultValue the value replacement
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
777 * @return the value or defaultValue
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
778 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
779 template <typename DefaultValue>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
780 inline Value valueOr(unsigned position, DefaultValue &&defaultValue) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
781 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
782 if (m_type != Type::Array || position >= m_array.size()) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
783 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
784 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
785
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
786 return m_array[position];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
787 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
788
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
789 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
790 * Overloaded function with type check.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
791 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
792 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
793 * @param type the requested type
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
794 * @param defaultValue the value replacement
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
795 * @return the value or defaultValue
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
796 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
797 template <typename DefaultValue>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
798 inline Value valueOr(unsigned position, Type type, DefaultValue &&defaultValue) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
799 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
800 if (m_type != Type::Array || position >= m_array.size() || m_array[position].typeOf() != type) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
801 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
802 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
803
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
804 return m_array[position];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
805 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
806
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
807 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
808 * Get a value at the specified index.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
809 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
810 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
811 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
812 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
813 * @throw std::out_of_range if out of bounds
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
814 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
815 inline const Value &at(unsigned position) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
816 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
817 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
818
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
819 return m_array.at(position);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
820 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
821
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
822 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
823 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
824 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
825 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
826 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
827 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
828 * @throw std::out_of_range if out of bounds
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
829 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
830 inline Value &at(unsigned position)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
831 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
832 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
833
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
834 return m_array.at(position);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
835 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
836
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
837 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
838 * Get a value at the specified index.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
839 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
840 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
841 * @pre position must be valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
842 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
843 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
844 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
845 inline const Value &operator[](unsigned position) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
846 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
847 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
848 assert(position < m_array.size());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
849
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
850 return m_array[position];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
851 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
852
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
853 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
854 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
855 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
856 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
857 * @pre position must be valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
858 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
859 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
860 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
861 inline Value &operator[](unsigned position)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
862 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
863 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
864 assert(position < m_array.size());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
865
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
866 return m_array[position];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
867 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
868
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
869 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
870 * Push a value to the beginning of the array.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
871 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
872 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
873 * @param value the value to push
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
874 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
875 inline void push(const Value &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
876 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
877 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
878
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
879 m_array.insert(m_array.begin(), value);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
880 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
881
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
882 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
883 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
884 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
885 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
886 * @param value the value to push
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
887 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
888 inline void push(Value &&value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
889 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
890 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
891
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
892 m_array.insert(m_array.begin(), std::move(value));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
893 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
894
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
895 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
896 * Insert a value at the specified position.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
897 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
898 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
899 * @pre position must be valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
900 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
901 * @param value the value to push
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
902 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
903 inline void insert(unsigned position, const Value &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
904 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
905 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
906 assert(position <= m_array.size());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
907
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
908 m_array.insert(m_array.begin() + position, value);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
909 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
910
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
911 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
912 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
913 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
914 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
915 * @pre position must be valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
916 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
917 * @param value the value to push
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
918 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
919 inline void insert(unsigned position, Value &&value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
920 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
921 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
922 assert(position <= m_array.size());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
923
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
924 m_array.insert(m_array.begin() + position, std::move(value));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
925 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
926
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
927 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
928 * Add a new value to the end.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
929 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
930 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
931 * @param value the value to append
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
932 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
933 inline void append(const Value &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
934 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
935 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
936
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
937 m_array.push_back(value);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
938 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
939
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
940 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
941 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
942 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
943 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
944 * @param value the value to append
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
945 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
946 inline void append(Value &&value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
947 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
948 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
949
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
950 m_array.push_back(std::move(value));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
951 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
952
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
953 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
954 * Remove a value at the specified position.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
955 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
956 * @pre must be an array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
957 * @pre position must be valid
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
958 * @param position the position
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
959 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
960 inline void erase(unsigned position)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
961 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
962 assert(isArray());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
963 assert(position < m_array.size());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
964
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
965 m_array.erase(m_array.begin() + position);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
966 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
967
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
968 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
969 * Object functions
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
970 * ----------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
971 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
972
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
973 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
974 * Get the value at the specified key or the defaultValue if key is absent.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
975 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
976 * @param name the name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
977 * @param defaultValue the value replacement
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
978 * @return the value or defaultValue
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
979 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
980 template <typename DefaultValue>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
981 Value valueOr(const std::string &name, DefaultValue &&defaultValue) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
982 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
983 if (m_type != Type::Object) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
984 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
985 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
986
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
987 auto it = m_object.find(name);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
988
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
989 if (it == m_object.end()) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
990 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
991 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
992
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
993 return it->second;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
994 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
995
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
996 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
997 * Overloaded function with type check.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
998 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
999 * @param name the name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1000 * @param type the requested type
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1001 * @param defaultValue the value replacement
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1002 * @return the value or defaultValue
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1003 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1004 template <typename DefaultValue>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1005 Value valueOr(const std::string &name, Type type, DefaultValue &&defaultValue) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1006 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1007 if (m_type != Type::Object) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1008 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1009 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1010
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1011 auto it = m_object.find(name);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1012
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1013 if (it == m_object.end() || it->second.typeOf() != type) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1014 return defaultValue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1015 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1016
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1017 return it->second;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1018 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1019
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1020 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1021 * Get a value from the object.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1022 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1023 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1024 * @param name the value key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1025 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1026 * @throw std::out_of_range if not found
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1027 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1028 inline const Value &at(const std::string &name) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1029 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1030 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1031
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1032 return m_object.at(name);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1033 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1034
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1035 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1036 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1037 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1038 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1039 * @param name the value key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1040 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1041 * @throw std::out_of_range if not found
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1042 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1043 inline Value &at(const std::string &name)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1044 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1045 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1046
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1047 return m_object.at(name);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1048 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1049
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1050 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1051 * Get a value from the object.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1052 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1053 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1054 * @param name the value key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1055 * @return the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1056 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1057 inline Value &operator[](const std::string &name)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1058 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1059 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1060
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1061 return m_object[name];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1062 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1063
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1064 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1065 * Find a value by key.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1066 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1067 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1068 * @param key the property key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1069 * @return the iterator or past the end if not found
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1070 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1071 inline iterator find(const std::string &key)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1072 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1073 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1074
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1075 return iterator(*this, m_object.find(key));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1076 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1077
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1078 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1079 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1080 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1081 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1082 * @param key the property key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1083 * @return the iterator or past the end if not found
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1084 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1085 inline const_iterator find(const std::string &key) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1086 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1087 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1088
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1089 return const_iterator(*this, m_object.find(key));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1090 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1091
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1092 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1093 * Insert a new value.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1094 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1095 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1096 * @param name the key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1097 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1098 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1099 inline void insert(std::string name, const Value &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1100 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1101 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1102
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1103 m_object.insert({std::move(name), value});
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1104 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1105
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1106 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1107 * Overloaded function.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1108 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1109 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1110 * @param name the key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1111 * @param value the value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1112 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1113 inline void insert(std::string name, Value &&value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1114 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1115 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1116
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1117 m_object.insert({std::move(name), std::move(value)});
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1118 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1119
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1120 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1121 * Check if a value exists.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1122 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1123 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1124 * @param key the key value
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1125 * @return true if exists
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1126 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1127 inline bool contains(const std::string &key) const noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1128 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1129 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1130
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1131 return m_object.find(key) != m_object.end();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1132 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1133
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1134 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1135 * Remove a value of the specified key.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1136 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1137 * @pre must be an object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1138 * @param key the value key
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1139 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1140 inline void erase(const std::string &key)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1141 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1142 assert(isObject());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1143
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1144 m_object.erase(key);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1145 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1146
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1147 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1148 * Return this value as JSon representation.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1149 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1150 * @param indent, the indentation to use (0 == compact, < 0 == tabs, > 0 == number of spaces)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1151 * @param tabs, use tabs or not
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1152 * @return the string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1153 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1154 inline std::string toJson(int indent = 2) const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1155 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1156 return toJson(indent, 0);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1157 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1158 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1159
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1160 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1161 * Escape the input.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1162 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1163 * @param input the input
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1164 * @return the escaped string
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1165 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1166 std::string escape(const std::string &input);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1167
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1168 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1169 * Convenient function for creating array from initializer list.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1170 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1171 * @param values the values
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1172 * @return the array
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1173 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1174 inline Value array(std::initializer_list<Value> values)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1175 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1176 return Value(std::vector<Value>(values.begin(), values.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1177 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1178
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1179 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1180 * Convenient function for creating object from initializer list.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1181 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1182 * @param values the values
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1183 * @return the object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1184 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1185 inline Value object(std::initializer_list<std::pair<std::string, Value>> values)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1186 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1187 return Value(std::map<std::string, Value>(values.begin(), values.end()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1188 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1189
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1190 } // !json
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1191
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1192 } // !irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1193
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1194 #endif // !_JSON_H_