Mercurial > code
annotate C++/modules/Ini/Ini.h @ 395:b78d6d8f2872
Unicode: remove class, use namespace
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 28 Sep 2015 15:55:46 +0200 |
parents | 0b576ee64d45 |
children | d5ec1174b707 |
rev | line source |
---|---|
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Ini.h -- .ini file parsing |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef _INI_H_ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define _INI_H_ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
327 | 22 /** |
23 * @file Ini.h | |
24 * @brief Configuration file parser | |
25 */ | |
26 | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <algorithm> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <deque> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <stdexcept> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <string> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 /** |
327 | 33 * @class IniError |
34 * @brief Error in a file | |
35 */ | |
36 class IniError : public std::exception { | |
37 private: | |
38 int m_line; | |
39 int m_position; | |
40 std::string m_error; | |
41 | |
42 public: | |
43 /** | |
44 * Construct an error. | |
45 * | |
46 * @param line the line | |
47 * @param position the position | |
48 * @param error the error | |
49 */ | |
50 inline IniError(int line, int position, std::string error) | |
51 : m_line(line) | |
52 , m_position(position) | |
53 , m_error(std::move(error)) | |
54 { | |
55 } | |
56 | |
57 /** | |
58 * Return the line number. | |
59 * | |
60 * @return the line | |
61 */ | |
62 inline int line() const noexcept | |
63 { | |
64 return m_line; | |
65 } | |
66 | |
67 /** | |
68 * Return the position in the current line. | |
69 * | |
70 * @return the position | |
71 */ | |
72 inline int position() const noexcept | |
73 { | |
74 return m_position; | |
75 } | |
76 | |
77 /** | |
78 * Get the error string. | |
79 * | |
80 * @return the string | |
81 */ | |
82 inline const char *what() const noexcept | |
83 { | |
84 return m_error.c_str(); | |
85 } | |
86 }; | |
87 | |
88 /** | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 * @class IniOption |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 * @brief Option definition |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 class IniOption { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 std::string m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 std::string m_value; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 public: |
327 | 98 /** |
99 * Construct an option. | |
100 * | |
101 * @param key the key | |
102 * @param value the value | |
103 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 inline IniOption(std::string key, std::string value) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 : m_key(std::move(key)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 , m_value(std::move(value)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 |
327 | 110 /** |
111 * Get the option key. | |
112 * | |
113 * @return the key | |
114 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 inline const std::string &key() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 return m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 |
327 | 120 /** |
121 * Get the option value. | |
122 * | |
123 * @return the value | |
124 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 inline const std::string &value() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 return m_value; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 /** |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 * @class IniSection |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 * @brief Section that contains one or more options |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 class IniSection { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 std::string m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 std::deque<IniOption> m_options; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 template <typename T> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 T find(const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 auto it = std::find_if(m_options.begin(), m_options.end(), [&] (const IniOption &o) { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 return o.key() == key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 }); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 if (it == m_options.end()) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 throw std::out_of_range("option " + key + " not found"); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 return const_cast<T>(*it); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 public: |
327 | 154 /** |
155 * Default constructor has no sections and no values. | |
156 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 IniSection() = default; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 |
327 | 159 /** |
160 * Construct a section with a set of options. | |
161 * | |
162 * @param key the section name | |
163 * @param options the list of options | |
164 */ | |
165 inline IniSection(std::string key, std::deque<IniOption> options = {}) noexcept | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 : m_key(std::move(key)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 , m_options(std::move(options)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 |
327 | 171 /** |
172 * Get the section key. | |
173 * | |
174 * @return the key | |
175 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 inline const std::string &key() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 return m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
327 | 181 /** |
182 * Get an iterator to the beginning. | |
183 * | |
184 * @return the iterator | |
185 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 inline auto begin() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 return m_options.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 |
327 | 191 /** |
192 * Overloaded function. | |
193 * | |
194 * @return the iterator | |
195 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 inline auto begin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 return m_options.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 |
327 | 201 /** |
202 * Overloaded function. | |
203 * | |
204 * @return the iterator | |
205 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 inline auto cbegin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 return m_options.cbegin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 |
327 | 211 /** |
212 * Get an iterator to the end. | |
213 * | |
214 * @return the iterator | |
215 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 inline auto end() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 return m_options.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 |
327 | 221 /** |
222 * Overloaded function. | |
223 * | |
224 * @return the iterator | |
225 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 inline auto end() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 return m_options.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 |
327 | 231 /** |
232 * Overloaded function. | |
233 * | |
234 * @return the iterator | |
235 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 inline auto cend() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 return m_options.cend(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 |
327 | 241 /** |
242 * Append an option. | |
243 * | |
244 * @param option the option to add | |
245 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 inline void push_back(IniOption option) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 m_options.push_back(std::move(option)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 |
327 | 251 /** |
252 * Push an option to the beginning. | |
253 * | |
254 * @param option the option to add | |
255 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 inline void push_front(IniOption option) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 m_options.push_front(std::move(option)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 |
327 | 261 /** |
262 * Get the number of options in that section. | |
263 * | |
264 * @return the size | |
265 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 inline unsigned size() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 return m_options.size(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 |
327 | 271 /** |
272 * Access an option at the specified index. | |
273 * | |
274 * @param index the index | |
275 * @return the option | |
276 * @warning No bounds checking is performed | |
277 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 inline IniOption &operator[](int index) noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 return m_options[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 |
327 | 283 /** |
284 * Access an option at the specified index. | |
285 * | |
286 * @param index the index | |
287 * @return the option | |
288 * @warning No bounds checking is performed | |
289 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 inline const IniOption &operator[](int index) const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 return m_options[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
294 |
327 | 295 /** |
296 * Access an option at the specified key. | |
297 * | |
298 * @param key the key | |
299 * @return the option | |
300 * @warning No bounds checking is performed | |
301 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 inline IniOption &operator[](const std::string &key) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
304 return find<IniOption &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
305 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 |
327 | 307 /** |
308 * Access an option at the specified key. | |
309 * | |
310 * @param key the key | |
311 * @return the option | |
312 * @warning No bounds checking is performed | |
313 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
314 inline const IniOption &operator[](const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 return find<const IniOption &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
317 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
318 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
319 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 /** |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
321 * @class Ini |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
322 * @brief Ini config file loader |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
323 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
324 class Ini { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
325 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
326 std::deque<IniSection> m_sections; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
327 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
328 template <typename T> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 T find(const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
330 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
331 auto it = std::find_if(m_sections.begin(), m_sections.end(), [&] (const IniSection &s) { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
332 return s.key() == key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
333 }); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
334 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
335 if (it == m_sections.end()) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
336 throw std::out_of_range("section " + key + " not found"); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
337 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
338 return const_cast<T>(*it); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
339 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
341 public: |
327 | 342 /** |
343 * Default constructor with an empty configuration. | |
344 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
345 Ini() = default; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
346 |
327 | 347 /** |
348 * Open the path as the configuration file. | |
349 * | |
350 * @param path the path | |
351 * @throw IniError on any error | |
352 */ | |
353 Ini(const std::string &path); | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
354 |
327 | 355 /** |
356 * Get an iterator to the beginning. | |
357 * | |
358 * @return the iterator | |
359 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
360 inline auto begin() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
361 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
362 return m_sections.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
363 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
364 |
327 | 365 /** |
366 * Overloaded function. | |
367 * | |
368 * @return the iterator | |
369 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
370 inline auto begin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
371 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
372 return m_sections.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
373 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
374 |
327 | 375 /** |
376 * Overloaded function. | |
377 * | |
378 * @return the iterator | |
379 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
380 inline auto cbegin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
381 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
382 return m_sections.cbegin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
383 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
384 |
327 | 385 /** |
386 * Get an iterator to the end. | |
387 * | |
388 * @return the iterator | |
389 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
390 inline auto end() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
391 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
392 return m_sections.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
393 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
394 |
327 | 395 /** |
396 * Overloaded function. | |
397 * | |
398 * @return the iterator | |
399 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
400 inline auto end() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
401 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
402 return m_sections.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
403 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
404 |
327 | 405 /** |
406 * Overloaded function. | |
407 * | |
408 * @return the iterator | |
409 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
410 inline auto cend() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
411 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
412 return m_sections.cend(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
413 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
414 |
327 | 415 /** |
416 * Get the number of sections in the configuration. | |
417 * | |
418 * @return the size | |
419 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
420 inline unsigned size() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
421 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
422 return m_sections.size(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
423 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
424 |
327 | 425 /** |
426 * Append a section to the end. | |
427 * | |
428 * @param section the section to add | |
429 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
430 inline void push_back(IniSection section) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
431 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
432 m_sections.push_back(std::move(section)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
433 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
434 |
327 | 435 /** |
436 * Add a section to the beginning. | |
437 * | |
438 * @param section the section to add | |
439 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
440 inline void push_front(IniSection section) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
441 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
442 m_sections.push_front(std::move(section)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
443 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
444 |
327 | 445 /** |
446 * Access a section at the specified index. | |
447 * | |
448 * @param index the index | |
449 * @return the section | |
450 * @warning No bounds checking is performed | |
451 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 inline IniSection &operator[](int index) noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
453 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
454 return m_sections[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
455 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
456 |
327 | 457 /** |
458 * Access a section at the specified index. | |
459 * | |
460 * @param index the index | |
461 * @return the section | |
462 * @warning No bounds checking is performed | |
463 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
464 inline const IniSection &operator[](int index) const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
465 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
466 return m_sections[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
467 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
468 |
327 | 469 /** |
470 * Access a section at the specified key. | |
471 * | |
472 * @param key the key | |
473 * @return the section | |
474 * @warning No bounds checking is performed | |
475 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
476 inline IniSection &operator[](const std::string &key) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
477 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
478 return find<IniSection &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
479 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
480 |
327 | 481 /** |
482 * Access a section at the specified key. | |
483 * | |
484 * @param key the key | |
485 * @return the section | |
486 * @warning No bounds checking is performed | |
487 */ | |
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
488 inline const IniSection &operator[](const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
489 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
490 return find<IniSection &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
491 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
492 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
493 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
494 #endif // !_INI_H_ |