Mercurial > code
annotate C++/Parser.h @ 203:1ffe6d4937b7
Update parser for more convenience and types security #224
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 23 Jan 2014 14:56:50 +0100 |
parents | 600754c27c88 |
children | 9f22ce5f1b39 706f861c4c6d |
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: |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
40 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
|
41 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
42 friend class Parser; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
43 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
44 private: |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
45 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
|
46 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
|
47 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
|
48 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
49 const std::string findOption(const std::string &name) const; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
50 public: |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
51 template <typename T> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
52 struct Converter { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
53 static const bool supported = false; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
54 }; |
179 | 55 |
180 | 56 /** |
57 * Default constructor. | |
58 */ | |
179 | 59 Section(); |
60 | |
61 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
62 * Named constructor. |
179 | 63 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
64 * @param name the section name |
179 | 65 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
66 Section(const std::string &name); |
179 | 67 |
68 /** | |
69 * Tells if that section has the specified option name. | |
70 * | |
71 * @param name the option name | |
72 * @return true if has | |
73 */ | |
74 bool hasOption(const std::string &name) const; | |
75 | |
76 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
77 * Get the section name |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
78 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
79 * @return 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 const std::string &getName() const; |
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 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
84 * 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
|
85 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
86 * @return the iterator. |
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 Map::iterator begin(); |
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 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
91 * 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
|
92 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
93 * @return the iterator. |
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 Map::const_iterator cbegin() const; |
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 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
98 * 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
|
99 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
100 * @return the iterator. |
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 Map::iterator end(); |
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 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
105 * 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
|
106 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
107 * @return the iterator. |
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 Map::const_iterator cend() const; |
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 /** |
179 | 112 * Template all functions for retrieving options value. |
113 * | |
114 * @param name the option name | |
115 * @return the value if found | |
116 */ | |
117 template <typename T> | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
118 T getValue(const std::string &name) const |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
119 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
120 try { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
121 return requireValue<T>(name); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
122 } catch (...) { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
123 // Catch any conversion error. |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
124 } |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
125 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
126 return T(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
127 } |
179 | 128 |
129 /** | |
130 * Requires an option, this works like getOption except | |
131 * that if an option is not found, an exception is | |
132 * thrown. | |
133 * | |
134 * @param name the name | |
180 | 135 * @return the value |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
136 * @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
|
137 * @throw std::invalid_argument on conversion failures |
179 | 138 */ |
139 template <typename T> | |
180 | 140 T requireValue(const std::string &name) const |
179 | 141 { |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
142 static_assert(Converter<T>::supported, "invalid type requested"); |
179 | 143 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
144 return Converter<T>::convert(m_options.at(name)); |
179 | 145 } |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
146 }; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
147 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
148 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
149 struct Section::Converter<bool> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
150 static const bool supported = true; |
179 | 151 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
152 static bool convert(const std::string &value) |
179 | 153 { |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
154 bool result(false); |
179 | 155 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
156 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
|
157 result = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
158 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
|
159 result = false; |
179 | 160 |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
161 return result; |
179 | 162 } |
163 }; | |
164 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
165 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
166 struct Section::Converter<int> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
167 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
168 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
169 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
|
170 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
171 return std::stoi(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 }; |
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 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
176 struct Section::Converter<float> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
177 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
178 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
179 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
|
180 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
181 return std::stof(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 }; |
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 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
186 struct Section::Converter<double> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
187 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
188 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
189 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
|
190 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
191 return std::stod(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 }; |
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 template <> |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
196 struct Section::Converter<std::string> { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
197 static const bool supported = true; |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
198 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
199 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
|
200 { |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
201 return 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 }; |
179 | 204 |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
205 /** |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
206 * @class Parser |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
207 * @brief Config file parser |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
208 * |
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
209 * Open and read .ini files. |
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 class Parser { |
179 | 212 public: |
213 /** | |
214 * Options available for the parser. | |
215 */ | |
187
600754c27c88
Update parser to style and remove useless stuff
David Demelier <markand@malikania.fr>
parents:
180
diff
changeset
|
216 enum Tuning { |
179 | 217 DisableRootSection = 1, /*! disable options on root */ |
218 DisableRedefinition = 2, /*! disable multiple redefinition */ | |
219 DisableVerbosity = 4 /*! be verbose by method */ | |
220 }; | |
221 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
222 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
|
223 using List = std::vector<Section>; |
180 | 224 |
179 | 225 private: |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
226 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
|
227 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
|
228 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
|
229 char m_commentChar; /*! the comment token default (#) */ |
179 | 230 |
231 void addSection(const std::string &name); | |
232 void addOption(const std::string &key, const std::string &value); | |
233 | |
234 void readSection(int lineno, const std::string &line); | |
235 void readOption(int lineno, const std::string &line); | |
236 | |
237 void readLine(int lineno, const std::string &line); | |
238 | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
239 void open(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
240 |
179 | 241 public: |
242 static const char DEFAULT_COMMENT_CHAR; | |
243 | |
244 /** | |
245 * Create a parser at the specified file path. Optional | |
246 * options may be added. | |
247 * | |
248 * @param path the file path | |
249 * @param tuning optional tuning flags | |
250 * @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
|
251 * @throw std::runtime_error on errors |
179 | 252 * @see Tuning |
253 */ | |
254 Parser(const std::string &path, int tuning = 0, char commentToken = Parser::DEFAULT_COMMENT_CHAR); | |
255 | |
256 /** | |
257 * Default constructor. | |
258 */ | |
259 Parser(); | |
260 | |
261 /** | |
262 * Default destructor. | |
263 */ | |
264 virtual ~Parser(); | |
265 | |
266 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
267 * Return an iterator to the beginning. |
179 | 268 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
269 * @return the iterator. |
179 | 270 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
271 List::iterator begin(); |
179 | 272 |
273 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
274 * Return a const iterator to the beginning. |
179 | 275 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
276 * @return the iterator. |
179 | 277 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
278 List::const_iterator cbegin() const; |
179 | 279 |
280 /** | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
281 * Return an iterator to the end. |
179 | 282 * |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
283 * @return the iterator. |
179 | 284 */ |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
285 List::iterator end(); |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
286 |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
287 /** |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
288 * 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
|
289 * |
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
290 * @return the iterator. |
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 List::const_iterator cend() const; |
179 | 293 |
294 /** | |
180 | 295 * Find all sections matching the name. |
179 | 296 * |
297 * @param name the sections name | |
180 | 298 * @param func the function |
179 | 299 * @return a list of section with the options |
300 */ | |
180 | 301 void findSections(const std::string &name, FindFunc func) const; |
179 | 302 |
303 /** | |
304 * Tell if a section is existing. | |
305 * | |
306 * @return true if exists | |
307 */ | |
308 bool hasSection(const std::string &name) const; | |
309 | |
310 /** | |
311 * Get a specified section. | |
312 * | |
313 * @param name the section name | |
314 * @return a section | |
203
1ffe6d4937b7
Update parser for more convenience and types security #224
David Demelier <markand@malikania.fr>
parents:
187
diff
changeset
|
315 * @throw std::out_of_range if not found |
179 | 316 */ |
180 | 317 const Section &getSection(const std::string &name) const; |
179 | 318 |
319 /** | |
320 * Logging function, used only if DisableVerbosity is not set. The | |
321 * default behavior is to print to stdout something like: | |
322 * line 10: syntax error | |
323 * line 8: missing = | |
324 * | |
325 * @param number the line number | |
326 * @param section the current section worked on | |
327 * @param message the message | |
328 */ | |
329 virtual void log(int number, const std::string §ion, const std::string &message); | |
330 }; | |
331 | |
332 #endif // !_PARSER_H_ |