Mercurial > code
annotate C++/Ini.h @ 325:d52a69f9f029
Add Ini, brand new replacement for Parser
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 28 Feb 2015 18:53:27 +0100 |
parents | |
children | 78e8f9a3b233 |
rev | line source |
---|---|
325
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Ini.h -- .ini file parsing |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #ifndef _INI_H_ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #define _INI_H_ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <algorithm> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <deque> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <fstream> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <istream> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <stdexcept> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <string> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 /** |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 * @class IniOption |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 * @brief Option definition |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 class IniOption { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 std::string m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 std::string m_value; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 public: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 inline IniOption(std::string key, std::string value) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 : m_key(std::move(key)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 , m_value(std::move(value)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 inline const std::string &key() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 return m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 inline const std::string &value() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 return m_value; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 /** |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 * @class IniSection |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 * @brief Section that contains one or more options |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 class IniSection { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 std::string m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 std::deque<IniOption> m_options; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 template <typename T> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 T find(const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 auto it = std::find_if(m_options.begin(), m_options.end(), [&] (const IniOption &o) { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 return o.key() == key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 }); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 if (it == m_options.end()) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 throw std::out_of_range("option " + key + " not found"); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 return const_cast<T>(*it); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 public: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 IniSection() = default; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 inline IniSection(std::string key, std::deque<IniOption> options = {}) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 : m_key(std::move(key)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 , m_options(std::move(options)) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 inline const std::string &key() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 return m_key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 inline auto begin() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 return m_options.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 inline auto begin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 return m_options.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 inline auto cbegin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 return m_options.cbegin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 inline auto end() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 return m_options.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 inline auto end() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 return m_options.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 inline auto cend() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 return m_options.cend(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 inline void push_back(IniOption option) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 m_options.push_back(std::move(option)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 inline void push_front(IniOption option) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 m_options.push_front(std::move(option)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 inline unsigned size() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 return m_options.size(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 inline IniOption &operator[](int index) noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 return m_options[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 inline const IniOption &operator[](int index) const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 return m_options[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 inline IniOption &operator[](const std::string &key) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 return find<IniOption &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 inline const IniOption &operator[](const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 return find<const IniOption &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 /** |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 * @class Ini |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 * @brief Ini config file loader |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 */ |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 class Ini { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 private: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 std::deque<IniSection> m_sections; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 template <typename T> |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 T find(const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 auto it = std::find_if(m_sections.begin(), m_sections.end(), [&] (const IniSection &s) { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 return s.key() == key; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 }); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 if (it == m_sections.end()) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 throw std::out_of_range("section " + key + " not found"); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 return const_cast<T>(*it); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 public: |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 Ini() = default; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 Ini(std::istream &stream); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 inline Ini(std::istream &&stream) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 : Ini(stream) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 inline auto begin() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 return m_sections.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 inline auto begin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 return m_sections.begin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
199 inline auto cbegin() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
200 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 return m_sections.cbegin(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
204 inline auto end() noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 return m_sections.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 inline auto end() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 return m_sections.end(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 inline auto cend() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 return m_sections.cend(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 inline unsigned size() const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 return m_sections.size(); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 inline void push_back(IniSection section) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
225 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 m_sections.push_back(std::move(section)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
228 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 inline void push_front(IniSection section) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 m_sections.push_front(std::move(section)); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
232 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
234 inline IniSection &operator[](int index) noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
235 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 return m_sections[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 inline const IniSection &operator[](int index) const noexcept |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 return m_sections[index]; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 inline IniSection &operator[](const std::string &key) |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 return find<IniSection &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
248 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 inline const IniSection &operator[](const std::string &key) const |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 { |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 return find<IniSection &>(key); |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 } |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
253 }; |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 |
d52a69f9f029
Add Ini, brand new replacement for Parser
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 #endif // !_INI_H_ |