Mercurial > code
annotate C++/Parser.h @ 209:706f861c4c6d
Little cleanup and rename getValue -> getOption
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 24 Jan 2014 09:17:06 +0100 |
parents | 1ffe6d4937b7 |
children | 3b0e276f0866 |
rev | line source |
---|---|
179 | 1 /* |
2 * Parser.h -- config file parser | |
3 * | |
4 * Copyright (c) 2011, 2012, 2013 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #ifndef _PARSER_H_ | |
20 #define _PARSER_H_ | |
21 | |
22 #include <cstdlib> | |
180 | 23 #include <functional> |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
24 #include <stdexcept> |
179 | 25 #include <string> |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
26 #include <unordered_map> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
27 #include <utility> |
179 | 28 #include <vector> |
29 | |
30 /** | |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
31 * @class Section |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
32 * @brief The option container |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
33 * |
179 | 34 * A list of section found in the file. If root |
35 * options are allowed (default behavior), the root | |
36 * section is "". | |
37 */ | |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
38 class Section { |
180 | 39 public: |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
40 friend class Parser; |
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
41 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
42 using Map = std::unordered_map<std::string, std::string>; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
43 |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
44 template <typename T> |
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
45 struct Converter { |
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
46 static const bool supported = false; |
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
47 }; |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
48 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
49 private: |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
50 std::string m_name; /*! name of section */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
51 Map m_options; /*! list of options inside */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
52 bool m_allowed; /*! is authorized to push */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
53 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
54 const std::string findOption(const std::string &name) const; |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
55 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
56 public: |
180 | 57 /** |
58 * Default constructor. | |
59 */ | |
179 | 60 Section(); |
61 | |
62 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
63 * Named constructor. |
179 | 64 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
65 * @param name the section name |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
66 * @param allowed is allowed to push |
179 | 67 */ |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
68 Section(const std::string &name, bool allowed = true); |
179 | 69 |
70 /** | |
71 * Tells if that section has the specified option name. | |
72 * | |
73 * @param name the option name | |
74 * @return true if has | |
75 */ | |
76 bool hasOption(const std::string &name) const; | |
77 | |
78 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
79 * Get the section name |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
80 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
81 * @return the section name |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
82 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
83 const std::string &getName() const; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
84 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
85 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
86 * Return an iterator to the beginning. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
87 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
88 * @return the iterator. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
89 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
90 Map::iterator begin(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
91 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
92 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
93 * Return a const iterator to the beginning. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
94 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
95 * @return the iterator. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
96 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
97 Map::const_iterator cbegin() const; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
98 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
99 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
100 * Return an iterator to the end. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
101 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
102 * @return the iterator. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
103 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
104 Map::iterator end(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
105 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
106 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
107 * Return a const iterator to the end. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
108 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
109 * @return the iterator. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
110 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
111 Map::const_iterator cend() const; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
112 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
113 /** |
179 | 114 * Template all functions for retrieving options value. |
115 * | |
116 * @param name the option name | |
117 * @return the value if found | |
118 */ | |
119 template <typename T> | |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
120 T getOption(const std::string &name) const |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
121 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
122 try { |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
123 return requireOption<T>(name); |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
124 } catch (...) { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
125 // Catch any conversion error. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
126 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
127 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
128 return T(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
129 } |
179 | 130 |
131 /** | |
132 * Requires an option, this works like getOption except | |
133 * that if an option is not found, an exception is | |
134 * thrown. | |
135 * | |
136 * @param name the name | |
180 | 137 * @return the value |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
138 * @throw std::out_of_range if not found |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
139 * @throw std::invalid_argument on conversion failures |
179 | 140 */ |
141 template <typename T> | |
209
706f861c4c6d
Little cleanup and rename getValue -> getOption
David Demelier <markand@malikania.fr>
parents:
203
diff
changeset
|
142 T requireOption(const std::string &name) const |
179 | 143 { |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
144 static_assert(Converter<T>::supported, "invalid type requested"); |
179 | 145 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
146 return Converter<T>::convert(m_options.at(name)); |
179 | 147 } |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
148 }; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
149 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
150 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
151 struct Section::Converter<bool> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
152 static const bool supported = true; |
179 | 153 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
154 static bool convert(const std::string &value) |
179 | 155 { |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
156 bool result(false); |
179 | 157 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
158 if (value == "yes" || value == "true"|| value == "1") |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
159 result = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
160 else if (value == "no" || value == "false" || value == "0") |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
161 result = false; |
179 | 162 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
163 return result; |
179 | 164 } |
165 }; | |
166 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
167 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
168 struct Section::Converter<int> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
169 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
170 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
171 static int convert(const std::string &value) |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
172 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
173 return std::stoi(value); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
174 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
175 }; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
176 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
177 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
178 struct Section::Converter<float> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
179 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
180 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
181 static float convert(const std::string &value) |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
182 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
183 return std::stof(value); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
184 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
185 }; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
186 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
187 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
188 struct Section::Converter<double> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
189 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
190 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
191 static double convert(const std::string &value) |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
192 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
193 return std::stod(value); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
194 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
195 }; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
196 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
197 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
198 struct Section::Converter<std::string> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
199 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
200 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
201 static std::string convert(const std::string &value) |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
202 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
203 return value; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
204 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
205 }; |
179 | 206 |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
207 /** |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
208 * @class Parser |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
209 * @brief Config file parser |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
210 * |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
211 * Open and read .ini files. |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
212 */ |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
213 class Parser { |
179 | 214 public: |
215 /** | |
216 * Options available for the parser. | |
217 */ | |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
218 enum Tuning { |
179 | 219 DisableRootSection = 1, /*! disable options on root */ |
220 DisableRedefinition = 2, /*! disable multiple redefinition */ | |
221 DisableVerbosity = 4 /*! be verbose by method */ | |
222 }; | |
223 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
224 using FindFunc = std::function<void (const Section &)>; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
225 using List = std::vector<Section>; |
180 | 226 |
179 | 227 private: |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
228 List m_sections; /*! list of sections found */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
229 std::string m_path; /*! path file */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
230 int m_tuning; /*! options for parsing */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
231 char m_commentChar; /*! the comment token default (#) */ |
179 | 232 |
233 void addSection(const std::string &name); | |
234 void addOption(const std::string &key, const std::string &value); | |
235 | |
236 void readSection(int lineno, const std::string &line); | |
237 void readOption(int lineno, const std::string &line); | |
238 | |
239 void readLine(int lineno, const std::string &line); | |
240 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
241 void open(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
242 |
179 | 243 public: |
244 static const char DEFAULT_COMMENT_CHAR; | |
245 | |
246 /** | |
247 * Create a parser at the specified file path. Optional | |
248 * options may be added. | |
249 * | |
250 * @param path the file path | |
251 * @param tuning optional tuning flags | |
252 * @param commentToken an optional comment delimiter | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
253 * @throw std::runtime_error on errors |
179 | 254 * @see Tuning |
255 */ | |
256 Parser(const std::string &path, int tuning = 0, char commentToken = Parser::DEFAULT_COMMENT_CHAR); | |
257 | |
258 /** | |
259 * Default constructor. | |
260 */ | |
261 Parser(); | |
262 | |
263 /** | |
264 * Default destructor. | |
265 */ | |
266 virtual ~Parser(); | |
267 | |
268 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
269 * Return an iterator to the beginning. |
179 | 270 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
271 * @return the iterator. |
179 | 272 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
273 List::iterator begin(); |
179 | 274 |
275 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
276 * Return a const iterator to the beginning. |
179 | 277 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
278 * @return the iterator. |
179 | 279 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
280 List::const_iterator cbegin() const; |
179 | 281 |
282 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
283 * Return an iterator to the end. |
179 | 284 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
285 * @return the iterator. |
179 | 286 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
287 List::iterator end(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
288 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
289 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
290 * Return a const iterator to the end. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
291 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
292 * @return the iterator. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
293 */ |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
294 List::const_iterator cend() const; |
179 | 295 |
296 /** | |
180 | 297 * Find all sections matching the name. |
179 | 298 * |
299 * @param name the sections name | |
180 | 300 * @param func the function |
179 | 301 * @return a list of section with the options |
302 */ | |
180 | 303 void findSections(const std::string &name, FindFunc func) const; |
179 | 304 |
305 /** | |
306 * Tell if a section is existing. | |
307 * | |
308 * @return true if exists | |
309 */ | |
310 bool hasSection(const std::string &name) const; | |
311 | |
312 /** | |
313 * Get a specified section. | |
314 * | |
315 * @param name the section name | |
316 * @return a section | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
317 * @throw std::out_of_range if not found |
179 | 318 */ |
180 | 319 const Section &getSection(const std::string &name) const; |
179 | 320 |
321 /** | |
322 * Logging function, used only if DisableVerbosity is not set. The | |
323 * default behavior is to print to stdout something like: | |
324 * line 10: syntax error | |
325 * line 8: missing = | |
326 * | |
327 * @param number the line number | |
328 * @param section the current section worked on | |
329 * @param message the message | |
330 */ | |
331 virtual void log(int number, const std::string §ion, const std::string &message); | |
332 }; | |
333 | |
334 #endif // !_PARSER_H_ |