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