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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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_