xref: /aosp_15_r20/external/libconfig/lib/libconfigcpp.c++ (revision 2e9d491483b805f09ea864149eadd5680efcc72a)
1*2e9d4914SAndroid Build Coastguard Worker /* ----------------------------------------------------------------------------
2*2e9d4914SAndroid Build Coastguard Worker    libconfig - A library for processing structured configuration files
3*2e9d4914SAndroid Build Coastguard Worker    Copyright (C) 2005-2018  Mark A Lindner
4*2e9d4914SAndroid Build Coastguard Worker 
5*2e9d4914SAndroid Build Coastguard Worker    This file is part of libconfig.
6*2e9d4914SAndroid Build Coastguard Worker 
7*2e9d4914SAndroid Build Coastguard Worker    This library is free software; you can redistribute it and/or
8*2e9d4914SAndroid Build Coastguard Worker    modify it under the terms of the GNU Lesser General Public License
9*2e9d4914SAndroid Build Coastguard Worker    as published by the Free Software Foundation; either version 2.1 of
10*2e9d4914SAndroid Build Coastguard Worker    the License, or (at your option) any later version.
11*2e9d4914SAndroid Build Coastguard Worker 
12*2e9d4914SAndroid Build Coastguard Worker    This library is distributed in the hope that it will be useful, but
13*2e9d4914SAndroid Build Coastguard Worker    WITHOUT ANY WARRANTY; without even the implied warranty of
14*2e9d4914SAndroid Build Coastguard Worker    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*2e9d4914SAndroid Build Coastguard Worker    Lesser General Public License for more details.
16*2e9d4914SAndroid Build Coastguard Worker 
17*2e9d4914SAndroid Build Coastguard Worker    You should have received a copy of the GNU Library General Public
18*2e9d4914SAndroid Build Coastguard Worker    License along with this library; if not, see
19*2e9d4914SAndroid Build Coastguard Worker    <http://www.gnu.org/licenses/>.
20*2e9d4914SAndroid Build Coastguard Worker    ----------------------------------------------------------------------------
21*2e9d4914SAndroid Build Coastguard Worker */
22*2e9d4914SAndroid Build Coastguard Worker 
23*2e9d4914SAndroid Build Coastguard Worker #include "libconfig.h++"
24*2e9d4914SAndroid Build Coastguard Worker 
25*2e9d4914SAndroid Build Coastguard Worker #ifdef _MSC_VER
26*2e9d4914SAndroid Build Coastguard Worker #pragma warning (disable: 4996)
27*2e9d4914SAndroid Build Coastguard Worker #endif
28*2e9d4914SAndroid Build Coastguard Worker 
29*2e9d4914SAndroid Build Coastguard Worker #include "wincompat.h"
30*2e9d4914SAndroid Build Coastguard Worker #include "libconfig.h"
31*2e9d4914SAndroid Build Coastguard Worker 
32*2e9d4914SAndroid Build Coastguard Worker #include <cstring>
33*2e9d4914SAndroid Build Coastguard Worker #include <cstdlib>
34*2e9d4914SAndroid Build Coastguard Worker #include <sstream>
35*2e9d4914SAndroid Build Coastguard Worker 
36*2e9d4914SAndroid Build Coastguard Worker namespace libconfig {
37*2e9d4914SAndroid Build Coastguard Worker 
38*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
39*2e9d4914SAndroid Build Coastguard Worker 
__include_func(config_t * config,const char * include_dir,const char * path,const char ** error)40*2e9d4914SAndroid Build Coastguard Worker static const char **__include_func(config_t *config,
41*2e9d4914SAndroid Build Coastguard Worker                                    const char *include_dir,
42*2e9d4914SAndroid Build Coastguard Worker                                    const char *path,
43*2e9d4914SAndroid Build Coastguard Worker                                    const char **error)
44*2e9d4914SAndroid Build Coastguard Worker {
45*2e9d4914SAndroid Build Coastguard Worker   Config *self = reinterpret_cast<Config *>(config_get_hook(config));
46*2e9d4914SAndroid Build Coastguard Worker   return(self->evaluateIncludePath(path, error));
47*2e9d4914SAndroid Build Coastguard Worker }
48*2e9d4914SAndroid Build Coastguard Worker 
49*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
50*2e9d4914SAndroid Build Coastguard Worker 
ParseException(const char * file,int line,const char * error)51*2e9d4914SAndroid Build Coastguard Worker ParseException::ParseException(const char *file, int line, const char *error)
52*2e9d4914SAndroid Build Coastguard Worker   : _file(file ? ::strdup(file) : NULL), _line(line), _error(error)
53*2e9d4914SAndroid Build Coastguard Worker {
54*2e9d4914SAndroid Build Coastguard Worker }
55*2e9d4914SAndroid Build Coastguard Worker 
56*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
57*2e9d4914SAndroid Build Coastguard Worker 
ParseException(const ParseException & other)58*2e9d4914SAndroid Build Coastguard Worker ParseException::ParseException(const ParseException &other)
59*2e9d4914SAndroid Build Coastguard Worker   : ConfigException(other),
60*2e9d4914SAndroid Build Coastguard Worker     _file(other._file ? ::strdup(other._file) : NULL),
61*2e9d4914SAndroid Build Coastguard Worker     _line(other._line),
62*2e9d4914SAndroid Build Coastguard Worker     _error(other._error)
63*2e9d4914SAndroid Build Coastguard Worker {
64*2e9d4914SAndroid Build Coastguard Worker }
65*2e9d4914SAndroid Build Coastguard Worker 
66*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
67*2e9d4914SAndroid Build Coastguard Worker 
~ParseException()68*2e9d4914SAndroid Build Coastguard Worker ParseException::~ParseException() LIBCONFIGXX_NOEXCEPT
69*2e9d4914SAndroid Build Coastguard Worker {
70*2e9d4914SAndroid Build Coastguard Worker   ::free((void *)_file);
71*2e9d4914SAndroid Build Coastguard Worker }
72*2e9d4914SAndroid Build Coastguard Worker 
73*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
74*2e9d4914SAndroid Build Coastguard Worker 
what() const75*2e9d4914SAndroid Build Coastguard Worker const char *ParseException::what() const LIBCONFIGXX_NOEXCEPT
76*2e9d4914SAndroid Build Coastguard Worker {
77*2e9d4914SAndroid Build Coastguard Worker   return("ParseException");
78*2e9d4914SAndroid Build Coastguard Worker }
79*2e9d4914SAndroid Build Coastguard Worker 
80*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
81*2e9d4914SAndroid Build Coastguard Worker 
__toTypeCode(Setting::Type type)82*2e9d4914SAndroid Build Coastguard Worker static int __toTypeCode(Setting::Type type)
83*2e9d4914SAndroid Build Coastguard Worker {
84*2e9d4914SAndroid Build Coastguard Worker   int typecode;
85*2e9d4914SAndroid Build Coastguard Worker 
86*2e9d4914SAndroid Build Coastguard Worker   switch(type)
87*2e9d4914SAndroid Build Coastguard Worker   {
88*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeGroup:
89*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_GROUP;
90*2e9d4914SAndroid Build Coastguard Worker       break;
91*2e9d4914SAndroid Build Coastguard Worker 
92*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeInt:
93*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_INT;
94*2e9d4914SAndroid Build Coastguard Worker       break;
95*2e9d4914SAndroid Build Coastguard Worker 
96*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeInt64:
97*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_INT64;
98*2e9d4914SAndroid Build Coastguard Worker       break;
99*2e9d4914SAndroid Build Coastguard Worker 
100*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeFloat:
101*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_FLOAT;
102*2e9d4914SAndroid Build Coastguard Worker       break;
103*2e9d4914SAndroid Build Coastguard Worker 
104*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeString:
105*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_STRING;
106*2e9d4914SAndroid Build Coastguard Worker       break;
107*2e9d4914SAndroid Build Coastguard Worker 
108*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeBoolean:
109*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_BOOL;
110*2e9d4914SAndroid Build Coastguard Worker       break;
111*2e9d4914SAndroid Build Coastguard Worker 
112*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeArray:
113*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_ARRAY;
114*2e9d4914SAndroid Build Coastguard Worker       break;
115*2e9d4914SAndroid Build Coastguard Worker 
116*2e9d4914SAndroid Build Coastguard Worker     case Setting::TypeList:
117*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_LIST;
118*2e9d4914SAndroid Build Coastguard Worker       break;
119*2e9d4914SAndroid Build Coastguard Worker 
120*2e9d4914SAndroid Build Coastguard Worker     default:
121*2e9d4914SAndroid Build Coastguard Worker       typecode = CONFIG_TYPE_NONE;
122*2e9d4914SAndroid Build Coastguard Worker   }
123*2e9d4914SAndroid Build Coastguard Worker 
124*2e9d4914SAndroid Build Coastguard Worker   return(typecode);
125*2e9d4914SAndroid Build Coastguard Worker }
126*2e9d4914SAndroid Build Coastguard Worker 
127*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
128*2e9d4914SAndroid Build Coastguard Worker 
__constructPath(const Setting & setting,std::stringstream & path)129*2e9d4914SAndroid Build Coastguard Worker static void __constructPath(const Setting &setting,
130*2e9d4914SAndroid Build Coastguard Worker                             std::stringstream &path)
131*2e9d4914SAndroid Build Coastguard Worker {
132*2e9d4914SAndroid Build Coastguard Worker   // head recursion to print path from root to target
133*2e9d4914SAndroid Build Coastguard Worker 
134*2e9d4914SAndroid Build Coastguard Worker   if(! setting.isRoot())
135*2e9d4914SAndroid Build Coastguard Worker   {
136*2e9d4914SAndroid Build Coastguard Worker     __constructPath(setting.getParent(), path);
137*2e9d4914SAndroid Build Coastguard Worker     if(path.tellp() > 0)
138*2e9d4914SAndroid Build Coastguard Worker       path << '.';
139*2e9d4914SAndroid Build Coastguard Worker 
140*2e9d4914SAndroid Build Coastguard Worker     const char *name = setting.getName();
141*2e9d4914SAndroid Build Coastguard Worker     if(name)
142*2e9d4914SAndroid Build Coastguard Worker       path << name;
143*2e9d4914SAndroid Build Coastguard Worker     else
144*2e9d4914SAndroid Build Coastguard Worker       path << '[' << setting.getIndex() << ']';
145*2e9d4914SAndroid Build Coastguard Worker   }
146*2e9d4914SAndroid Build Coastguard Worker }
147*2e9d4914SAndroid Build Coastguard Worker 
148*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
149*2e9d4914SAndroid Build Coastguard Worker 
SettingException(const Setting & setting)150*2e9d4914SAndroid Build Coastguard Worker SettingException::SettingException(const Setting &setting)
151*2e9d4914SAndroid Build Coastguard Worker {
152*2e9d4914SAndroid Build Coastguard Worker   std::stringstream sstr;
153*2e9d4914SAndroid Build Coastguard Worker   __constructPath(setting, sstr);
154*2e9d4914SAndroid Build Coastguard Worker 
155*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(sstr.str().c_str());
156*2e9d4914SAndroid Build Coastguard Worker }
157*2e9d4914SAndroid Build Coastguard Worker 
158*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
159*2e9d4914SAndroid Build Coastguard Worker 
SettingException(const Setting & setting,int idx)160*2e9d4914SAndroid Build Coastguard Worker SettingException::SettingException(const Setting &setting, int idx)
161*2e9d4914SAndroid Build Coastguard Worker {
162*2e9d4914SAndroid Build Coastguard Worker   std::stringstream sstr;
163*2e9d4914SAndroid Build Coastguard Worker   __constructPath(setting, sstr);
164*2e9d4914SAndroid Build Coastguard Worker   sstr << ".[" << idx << "]";
165*2e9d4914SAndroid Build Coastguard Worker 
166*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(sstr.str().c_str());
167*2e9d4914SAndroid Build Coastguard Worker }
168*2e9d4914SAndroid Build Coastguard Worker 
169*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
170*2e9d4914SAndroid Build Coastguard Worker 
SettingException(const Setting & setting,const char * name)171*2e9d4914SAndroid Build Coastguard Worker SettingException::SettingException(const Setting &setting, const char *name)
172*2e9d4914SAndroid Build Coastguard Worker {
173*2e9d4914SAndroid Build Coastguard Worker   std::stringstream sstr;
174*2e9d4914SAndroid Build Coastguard Worker   __constructPath(setting, sstr);
175*2e9d4914SAndroid Build Coastguard Worker   sstr << '.' << name;
176*2e9d4914SAndroid Build Coastguard Worker 
177*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(sstr.str().c_str());
178*2e9d4914SAndroid Build Coastguard Worker }
179*2e9d4914SAndroid Build Coastguard Worker 
180*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
181*2e9d4914SAndroid Build Coastguard Worker 
SettingException(const char * path)182*2e9d4914SAndroid Build Coastguard Worker SettingException::SettingException(const char *path)
183*2e9d4914SAndroid Build Coastguard Worker {
184*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(path);
185*2e9d4914SAndroid Build Coastguard Worker }
186*2e9d4914SAndroid Build Coastguard Worker 
187*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
188*2e9d4914SAndroid Build Coastguard Worker 
getPath() const189*2e9d4914SAndroid Build Coastguard Worker const char *SettingException::getPath() const
190*2e9d4914SAndroid Build Coastguard Worker {
191*2e9d4914SAndroid Build Coastguard Worker   return(_path);
192*2e9d4914SAndroid Build Coastguard Worker }
193*2e9d4914SAndroid Build Coastguard Worker 
194*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
195*2e9d4914SAndroid Build Coastguard Worker 
SettingException(const SettingException & other)196*2e9d4914SAndroid Build Coastguard Worker SettingException::SettingException(const SettingException &other)
197*2e9d4914SAndroid Build Coastguard Worker   : ConfigException(other)
198*2e9d4914SAndroid Build Coastguard Worker {
199*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(other._path);
200*2e9d4914SAndroid Build Coastguard Worker }
201*2e9d4914SAndroid Build Coastguard Worker 
202*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
203*2e9d4914SAndroid Build Coastguard Worker 
operator =(const SettingException & other)204*2e9d4914SAndroid Build Coastguard Worker SettingException &SettingException::operator=(const SettingException &other)
205*2e9d4914SAndroid Build Coastguard Worker {
206*2e9d4914SAndroid Build Coastguard Worker   ::free(_path);
207*2e9d4914SAndroid Build Coastguard Worker   _path = ::strdup(other._path);
208*2e9d4914SAndroid Build Coastguard Worker 
209*2e9d4914SAndroid Build Coastguard Worker   return(*this);
210*2e9d4914SAndroid Build Coastguard Worker }
211*2e9d4914SAndroid Build Coastguard Worker 
212*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
213*2e9d4914SAndroid Build Coastguard Worker 
what() const214*2e9d4914SAndroid Build Coastguard Worker const char *SettingException::what() const LIBCONFIGXX_NOEXCEPT
215*2e9d4914SAndroid Build Coastguard Worker {
216*2e9d4914SAndroid Build Coastguard Worker   return("SettingException");
217*2e9d4914SAndroid Build Coastguard Worker }
218*2e9d4914SAndroid Build Coastguard Worker 
219*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
220*2e9d4914SAndroid Build Coastguard Worker 
~SettingException()221*2e9d4914SAndroid Build Coastguard Worker SettingException::~SettingException() LIBCONFIGXX_NOEXCEPT
222*2e9d4914SAndroid Build Coastguard Worker {
223*2e9d4914SAndroid Build Coastguard Worker   ::free(_path);
224*2e9d4914SAndroid Build Coastguard Worker }
225*2e9d4914SAndroid Build Coastguard Worker 
226*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
227*2e9d4914SAndroid Build Coastguard Worker 
SettingTypeException(const Setting & setting)228*2e9d4914SAndroid Build Coastguard Worker SettingTypeException::SettingTypeException(const Setting &setting)
229*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting)
230*2e9d4914SAndroid Build Coastguard Worker {
231*2e9d4914SAndroid Build Coastguard Worker }
232*2e9d4914SAndroid Build Coastguard Worker 
233*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
234*2e9d4914SAndroid Build Coastguard Worker 
SettingTypeException(const Setting & setting,int idx)235*2e9d4914SAndroid Build Coastguard Worker SettingTypeException::SettingTypeException(const Setting &setting, int idx)
236*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting, idx)
237*2e9d4914SAndroid Build Coastguard Worker {
238*2e9d4914SAndroid Build Coastguard Worker }
239*2e9d4914SAndroid Build Coastguard Worker 
240*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
241*2e9d4914SAndroid Build Coastguard Worker 
SettingTypeException(const Setting & setting,const char * name)242*2e9d4914SAndroid Build Coastguard Worker SettingTypeException::SettingTypeException(const Setting &setting,
243*2e9d4914SAndroid Build Coastguard Worker                                            const char *name)
244*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting, name)
245*2e9d4914SAndroid Build Coastguard Worker {
246*2e9d4914SAndroid Build Coastguard Worker }
247*2e9d4914SAndroid Build Coastguard Worker 
248*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
249*2e9d4914SAndroid Build Coastguard Worker 
what() const250*2e9d4914SAndroid Build Coastguard Worker const char *SettingTypeException::what() const LIBCONFIGXX_NOEXCEPT
251*2e9d4914SAndroid Build Coastguard Worker {
252*2e9d4914SAndroid Build Coastguard Worker   return("SettingTypeException");
253*2e9d4914SAndroid Build Coastguard Worker }
254*2e9d4914SAndroid Build Coastguard Worker 
255*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
256*2e9d4914SAndroid Build Coastguard Worker 
SettingNotFoundException(const Setting & setting,int idx)257*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException::SettingNotFoundException(const Setting &setting,
258*2e9d4914SAndroid Build Coastguard Worker                                                    int idx)
259*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting, idx)
260*2e9d4914SAndroid Build Coastguard Worker {
261*2e9d4914SAndroid Build Coastguard Worker }
262*2e9d4914SAndroid Build Coastguard Worker 
263*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
264*2e9d4914SAndroid Build Coastguard Worker 
SettingNotFoundException(const Setting & setting,const char * name)265*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException::SettingNotFoundException(const Setting &setting,
266*2e9d4914SAndroid Build Coastguard Worker                                                    const char *name)
267*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting, name)
268*2e9d4914SAndroid Build Coastguard Worker {
269*2e9d4914SAndroid Build Coastguard Worker }
270*2e9d4914SAndroid Build Coastguard Worker 
271*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
272*2e9d4914SAndroid Build Coastguard Worker 
SettingNotFoundException(const char * path)273*2e9d4914SAndroid Build Coastguard Worker SettingNotFoundException::SettingNotFoundException(const char *path)
274*2e9d4914SAndroid Build Coastguard Worker   : SettingException(path)
275*2e9d4914SAndroid Build Coastguard Worker {
276*2e9d4914SAndroid Build Coastguard Worker }
277*2e9d4914SAndroid Build Coastguard Worker 
278*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
279*2e9d4914SAndroid Build Coastguard Worker 
what() const280*2e9d4914SAndroid Build Coastguard Worker const char *SettingNotFoundException::what() const LIBCONFIGXX_NOEXCEPT
281*2e9d4914SAndroid Build Coastguard Worker {
282*2e9d4914SAndroid Build Coastguard Worker   return("SettingNotFoundException");
283*2e9d4914SAndroid Build Coastguard Worker }
284*2e9d4914SAndroid Build Coastguard Worker 
285*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
286*2e9d4914SAndroid Build Coastguard Worker 
SettingNameException(const Setting & setting,const char * name)287*2e9d4914SAndroid Build Coastguard Worker SettingNameException::SettingNameException(const Setting &setting,
288*2e9d4914SAndroid Build Coastguard Worker                                            const char *name)
289*2e9d4914SAndroid Build Coastguard Worker   : SettingException(setting, name)
290*2e9d4914SAndroid Build Coastguard Worker {
291*2e9d4914SAndroid Build Coastguard Worker }
292*2e9d4914SAndroid Build Coastguard Worker 
293*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
294*2e9d4914SAndroid Build Coastguard Worker 
what() const295*2e9d4914SAndroid Build Coastguard Worker const char *SettingNameException::what() const LIBCONFIGXX_NOEXCEPT
296*2e9d4914SAndroid Build Coastguard Worker {
297*2e9d4914SAndroid Build Coastguard Worker   return("SettingNameException");
298*2e9d4914SAndroid Build Coastguard Worker }
299*2e9d4914SAndroid Build Coastguard Worker 
300*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
301*2e9d4914SAndroid Build Coastguard Worker 
what() const302*2e9d4914SAndroid Build Coastguard Worker const char *FileIOException::what() const LIBCONFIGXX_NOEXCEPT
303*2e9d4914SAndroid Build Coastguard Worker {
304*2e9d4914SAndroid Build Coastguard Worker   return("FileIOException");
305*2e9d4914SAndroid Build Coastguard Worker }
306*2e9d4914SAndroid Build Coastguard Worker 
307*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
308*2e9d4914SAndroid Build Coastguard Worker 
ConfigDestructor(void * arg)309*2e9d4914SAndroid Build Coastguard Worker void Config::ConfigDestructor(void *arg)
310*2e9d4914SAndroid Build Coastguard Worker {
311*2e9d4914SAndroid Build Coastguard Worker   delete reinterpret_cast<Setting *>(arg);
312*2e9d4914SAndroid Build Coastguard Worker }
313*2e9d4914SAndroid Build Coastguard Worker 
314*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
315*2e9d4914SAndroid Build Coastguard Worker 
Config()316*2e9d4914SAndroid Build Coastguard Worker Config::Config()
317*2e9d4914SAndroid Build Coastguard Worker   : _defaultFormat(Setting::FormatDefault)
318*2e9d4914SAndroid Build Coastguard Worker {
319*2e9d4914SAndroid Build Coastguard Worker   _config = new config_t;
320*2e9d4914SAndroid Build Coastguard Worker   config_init(_config);
321*2e9d4914SAndroid Build Coastguard Worker   config_set_hook(_config, reinterpret_cast<void *>(this));
322*2e9d4914SAndroid Build Coastguard Worker   config_set_destructor(_config, ConfigDestructor);
323*2e9d4914SAndroid Build Coastguard Worker   config_set_include_func(_config, __include_func);
324*2e9d4914SAndroid Build Coastguard Worker }
325*2e9d4914SAndroid Build Coastguard Worker 
326*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
327*2e9d4914SAndroid Build Coastguard Worker 
~Config()328*2e9d4914SAndroid Build Coastguard Worker Config::~Config()
329*2e9d4914SAndroid Build Coastguard Worker {
330*2e9d4914SAndroid Build Coastguard Worker   config_destroy(_config);
331*2e9d4914SAndroid Build Coastguard Worker   delete _config;
332*2e9d4914SAndroid Build Coastguard Worker }
333*2e9d4914SAndroid Build Coastguard Worker 
334*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
335*2e9d4914SAndroid Build Coastguard Worker 
clear()336*2e9d4914SAndroid Build Coastguard Worker void Config::clear()
337*2e9d4914SAndroid Build Coastguard Worker {
338*2e9d4914SAndroid Build Coastguard Worker   config_clear(_config);
339*2e9d4914SAndroid Build Coastguard Worker }
340*2e9d4914SAndroid Build Coastguard Worker 
341*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
342*2e9d4914SAndroid Build Coastguard Worker 
setOptions(int options)343*2e9d4914SAndroid Build Coastguard Worker void Config::setOptions(int options)
344*2e9d4914SAndroid Build Coastguard Worker {
345*2e9d4914SAndroid Build Coastguard Worker   config_set_options(_config, options);
346*2e9d4914SAndroid Build Coastguard Worker }
347*2e9d4914SAndroid Build Coastguard Worker 
348*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
349*2e9d4914SAndroid Build Coastguard Worker 
getOptions() const350*2e9d4914SAndroid Build Coastguard Worker int Config::getOptions() const
351*2e9d4914SAndroid Build Coastguard Worker {
352*2e9d4914SAndroid Build Coastguard Worker   return(config_get_options(_config));
353*2e9d4914SAndroid Build Coastguard Worker }
354*2e9d4914SAndroid Build Coastguard Worker 
355*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
356*2e9d4914SAndroid Build Coastguard Worker 
setOption(Config::Option option,bool flag)357*2e9d4914SAndroid Build Coastguard Worker void Config::setOption(Config::Option option, bool flag)
358*2e9d4914SAndroid Build Coastguard Worker {
359*2e9d4914SAndroid Build Coastguard Worker   config_set_option(_config, (int)option, flag ? CONFIG_TRUE : CONFIG_FALSE);
360*2e9d4914SAndroid Build Coastguard Worker }
361*2e9d4914SAndroid Build Coastguard Worker 
362*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
363*2e9d4914SAndroid Build Coastguard Worker 
getOption(Config::Option option) const364*2e9d4914SAndroid Build Coastguard Worker bool Config::getOption(Config::Option option) const
365*2e9d4914SAndroid Build Coastguard Worker {
366*2e9d4914SAndroid Build Coastguard Worker   return(config_get_option(_config, (int)option) == CONFIG_TRUE);
367*2e9d4914SAndroid Build Coastguard Worker }
368*2e9d4914SAndroid Build Coastguard Worker 
369*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
370*2e9d4914SAndroid Build Coastguard Worker 
setDefaultFormat(Setting::Format format)371*2e9d4914SAndroid Build Coastguard Worker void Config::setDefaultFormat(Setting::Format format)
372*2e9d4914SAndroid Build Coastguard Worker {
373*2e9d4914SAndroid Build Coastguard Worker   if(format == Setting::FormatHex)
374*2e9d4914SAndroid Build Coastguard Worker     _defaultFormat = Setting::FormatHex;
375*2e9d4914SAndroid Build Coastguard Worker   else
376*2e9d4914SAndroid Build Coastguard Worker     _defaultFormat = Setting::FormatDefault;
377*2e9d4914SAndroid Build Coastguard Worker 
378*2e9d4914SAndroid Build Coastguard Worker   config_set_default_format(_config, static_cast<short>(_defaultFormat));
379*2e9d4914SAndroid Build Coastguard Worker }
380*2e9d4914SAndroid Build Coastguard Worker 
381*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
382*2e9d4914SAndroid Build Coastguard Worker 
setTabWidth(unsigned short width)383*2e9d4914SAndroid Build Coastguard Worker void Config::setTabWidth(unsigned short width)
384*2e9d4914SAndroid Build Coastguard Worker {
385*2e9d4914SAndroid Build Coastguard Worker   config_set_tab_width(_config, width);
386*2e9d4914SAndroid Build Coastguard Worker }
387*2e9d4914SAndroid Build Coastguard Worker 
388*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
389*2e9d4914SAndroid Build Coastguard Worker 
getTabWidth() const390*2e9d4914SAndroid Build Coastguard Worker unsigned short Config::getTabWidth() const
391*2e9d4914SAndroid Build Coastguard Worker {
392*2e9d4914SAndroid Build Coastguard Worker   return(config_get_tab_width(_config));
393*2e9d4914SAndroid Build Coastguard Worker }
394*2e9d4914SAndroid Build Coastguard Worker 
395*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
396*2e9d4914SAndroid Build Coastguard Worker 
setFloatPrecision(unsigned short digits)397*2e9d4914SAndroid Build Coastguard Worker void Config::setFloatPrecision(unsigned short digits)
398*2e9d4914SAndroid Build Coastguard Worker {
399*2e9d4914SAndroid Build Coastguard Worker   return (config_set_float_precision(_config,digits));
400*2e9d4914SAndroid Build Coastguard Worker }
401*2e9d4914SAndroid Build Coastguard Worker 
402*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
403*2e9d4914SAndroid Build Coastguard Worker 
getFloatPrecision() const404*2e9d4914SAndroid Build Coastguard Worker unsigned short Config::getFloatPrecision() const
405*2e9d4914SAndroid Build Coastguard Worker {
406*2e9d4914SAndroid Build Coastguard Worker   return (config_get_float_precision(_config));
407*2e9d4914SAndroid Build Coastguard Worker }
408*2e9d4914SAndroid Build Coastguard Worker 
409*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
410*2e9d4914SAndroid Build Coastguard Worker 
setIncludeDir(const char * includeDir)411*2e9d4914SAndroid Build Coastguard Worker void Config::setIncludeDir(const char *includeDir)
412*2e9d4914SAndroid Build Coastguard Worker {
413*2e9d4914SAndroid Build Coastguard Worker   config_set_include_dir(_config, includeDir);
414*2e9d4914SAndroid Build Coastguard Worker }
415*2e9d4914SAndroid Build Coastguard Worker 
416*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
417*2e9d4914SAndroid Build Coastguard Worker 
getIncludeDir() const418*2e9d4914SAndroid Build Coastguard Worker const char *Config::getIncludeDir() const
419*2e9d4914SAndroid Build Coastguard Worker {
420*2e9d4914SAndroid Build Coastguard Worker   return(config_get_include_dir(_config));
421*2e9d4914SAndroid Build Coastguard Worker }
422*2e9d4914SAndroid Build Coastguard Worker 
423*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
424*2e9d4914SAndroid Build Coastguard Worker 
evaluateIncludePath(const char * path,const char ** error)425*2e9d4914SAndroid Build Coastguard Worker const char **Config::evaluateIncludePath(const char *path, const char **error)
426*2e9d4914SAndroid Build Coastguard Worker {
427*2e9d4914SAndroid Build Coastguard Worker   return(config_default_include_func(_config, getIncludeDir(), path, error));
428*2e9d4914SAndroid Build Coastguard Worker }
429*2e9d4914SAndroid Build Coastguard Worker 
430*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
431*2e9d4914SAndroid Build Coastguard Worker 
handleError() const432*2e9d4914SAndroid Build Coastguard Worker void Config::handleError() const
433*2e9d4914SAndroid Build Coastguard Worker {
434*2e9d4914SAndroid Build Coastguard Worker   switch(config_error_type(_config))
435*2e9d4914SAndroid Build Coastguard Worker   {
436*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_ERR_NONE:
437*2e9d4914SAndroid Build Coastguard Worker       break;
438*2e9d4914SAndroid Build Coastguard Worker 
439*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_ERR_PARSE:
440*2e9d4914SAndroid Build Coastguard Worker       throw ParseException(config_error_file(_config),
441*2e9d4914SAndroid Build Coastguard Worker                            config_error_line(_config),
442*2e9d4914SAndroid Build Coastguard Worker                            config_error_text(_config));
443*2e9d4914SAndroid Build Coastguard Worker       break;
444*2e9d4914SAndroid Build Coastguard Worker 
445*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_ERR_FILE_IO:
446*2e9d4914SAndroid Build Coastguard Worker     default:
447*2e9d4914SAndroid Build Coastguard Worker       throw FileIOException();
448*2e9d4914SAndroid Build Coastguard Worker   }
449*2e9d4914SAndroid Build Coastguard Worker }
450*2e9d4914SAndroid Build Coastguard Worker 
451*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
452*2e9d4914SAndroid Build Coastguard Worker 
read(FILE * stream)453*2e9d4914SAndroid Build Coastguard Worker void Config::read(FILE *stream)
454*2e9d4914SAndroid Build Coastguard Worker {
455*2e9d4914SAndroid Build Coastguard Worker   if(! config_read(_config, stream))
456*2e9d4914SAndroid Build Coastguard Worker     handleError();
457*2e9d4914SAndroid Build Coastguard Worker }
458*2e9d4914SAndroid Build Coastguard Worker 
459*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
460*2e9d4914SAndroid Build Coastguard Worker 
readString(const char * str)461*2e9d4914SAndroid Build Coastguard Worker void Config::readString(const char *str)
462*2e9d4914SAndroid Build Coastguard Worker {
463*2e9d4914SAndroid Build Coastguard Worker   if(! config_read_string(_config, str))
464*2e9d4914SAndroid Build Coastguard Worker     handleError();
465*2e9d4914SAndroid Build Coastguard Worker }
466*2e9d4914SAndroid Build Coastguard Worker 
467*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
468*2e9d4914SAndroid Build Coastguard Worker 
write(FILE * stream) const469*2e9d4914SAndroid Build Coastguard Worker void Config::write(FILE *stream) const
470*2e9d4914SAndroid Build Coastguard Worker {
471*2e9d4914SAndroid Build Coastguard Worker   config_write(_config, stream);
472*2e9d4914SAndroid Build Coastguard Worker }
473*2e9d4914SAndroid Build Coastguard Worker 
474*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
475*2e9d4914SAndroid Build Coastguard Worker 
readFile(const char * filename)476*2e9d4914SAndroid Build Coastguard Worker void Config::readFile(const char *filename)
477*2e9d4914SAndroid Build Coastguard Worker {
478*2e9d4914SAndroid Build Coastguard Worker   if(! config_read_file(_config, filename))
479*2e9d4914SAndroid Build Coastguard Worker     handleError();
480*2e9d4914SAndroid Build Coastguard Worker }
481*2e9d4914SAndroid Build Coastguard Worker 
482*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
483*2e9d4914SAndroid Build Coastguard Worker 
writeFile(const char * filename)484*2e9d4914SAndroid Build Coastguard Worker void Config::writeFile(const char *filename)
485*2e9d4914SAndroid Build Coastguard Worker {
486*2e9d4914SAndroid Build Coastguard Worker   if(! config_write_file(_config, filename))
487*2e9d4914SAndroid Build Coastguard Worker     handleError();
488*2e9d4914SAndroid Build Coastguard Worker }
489*2e9d4914SAndroid Build Coastguard Worker 
490*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
491*2e9d4914SAndroid Build Coastguard Worker 
lookup(const char * path) const492*2e9d4914SAndroid Build Coastguard Worker Setting & Config::lookup(const char *path) const
493*2e9d4914SAndroid Build Coastguard Worker {
494*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *s = config_lookup(_config, path);
495*2e9d4914SAndroid Build Coastguard Worker   if(! s)
496*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(path);
497*2e9d4914SAndroid Build Coastguard Worker 
498*2e9d4914SAndroid Build Coastguard Worker   return(Setting::wrapSetting(s));
499*2e9d4914SAndroid Build Coastguard Worker }
500*2e9d4914SAndroid Build Coastguard Worker 
501*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
502*2e9d4914SAndroid Build Coastguard Worker 
exists(const char * path) const503*2e9d4914SAndroid Build Coastguard Worker bool Config::exists(const char *path) const
504*2e9d4914SAndroid Build Coastguard Worker {
505*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *s = config_lookup(_config, path);
506*2e9d4914SAndroid Build Coastguard Worker 
507*2e9d4914SAndroid Build Coastguard Worker   return(s != NULL);
508*2e9d4914SAndroid Build Coastguard Worker }
509*2e9d4914SAndroid Build Coastguard Worker 
510*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
511*2e9d4914SAndroid Build Coastguard Worker 
512*2e9d4914SAndroid Build Coastguard Worker #define CONFIG_LOOKUP_NO_EXCEPTIONS(P, T, V)    \
513*2e9d4914SAndroid Build Coastguard Worker   try                                           \
514*2e9d4914SAndroid Build Coastguard Worker   {                                             \
515*2e9d4914SAndroid Build Coastguard Worker     Setting &s = lookup(P);                     \
516*2e9d4914SAndroid Build Coastguard Worker     V = (T)s;                                   \
517*2e9d4914SAndroid Build Coastguard Worker     return(true);                               \
518*2e9d4914SAndroid Build Coastguard Worker   }                                             \
519*2e9d4914SAndroid Build Coastguard Worker   catch(const ConfigException &)                \
520*2e9d4914SAndroid Build Coastguard Worker   {                                             \
521*2e9d4914SAndroid Build Coastguard Worker     return(false);                              \
522*2e9d4914SAndroid Build Coastguard Worker   }
523*2e9d4914SAndroid Build Coastguard Worker 
524*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
525*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,bool & value) const526*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, bool &value) const
527*2e9d4914SAndroid Build Coastguard Worker {
528*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, bool, value);
529*2e9d4914SAndroid Build Coastguard Worker }
530*2e9d4914SAndroid Build Coastguard Worker 
531*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
532*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,int & value) const533*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, int &value) const
534*2e9d4914SAndroid Build Coastguard Worker {
535*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, int, value);
536*2e9d4914SAndroid Build Coastguard Worker }
537*2e9d4914SAndroid Build Coastguard Worker 
538*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
539*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,unsigned int & value) const540*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, unsigned int &value) const
541*2e9d4914SAndroid Build Coastguard Worker {
542*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, unsigned int, value);
543*2e9d4914SAndroid Build Coastguard Worker }
544*2e9d4914SAndroid Build Coastguard Worker 
545*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
546*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,long long & value) const547*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, long long &value) const
548*2e9d4914SAndroid Build Coastguard Worker {
549*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, long long, value);
550*2e9d4914SAndroid Build Coastguard Worker }
551*2e9d4914SAndroid Build Coastguard Worker 
552*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
553*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,unsigned long long & value) const554*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, unsigned long long &value) const
555*2e9d4914SAndroid Build Coastguard Worker {
556*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, unsigned long long, value);
557*2e9d4914SAndroid Build Coastguard Worker }
558*2e9d4914SAndroid Build Coastguard Worker 
559*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
560*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,double & value) const561*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, double &value) const
562*2e9d4914SAndroid Build Coastguard Worker {
563*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, double, value);
564*2e9d4914SAndroid Build Coastguard Worker }
565*2e9d4914SAndroid Build Coastguard Worker 
566*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
567*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,float & value) const568*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, float &value) const
569*2e9d4914SAndroid Build Coastguard Worker {
570*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, float, value);
571*2e9d4914SAndroid Build Coastguard Worker }
572*2e9d4914SAndroid Build Coastguard Worker 
573*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
574*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,const char * & value) const575*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, const char *&value) const
576*2e9d4914SAndroid Build Coastguard Worker {
577*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, const char *, value);
578*2e9d4914SAndroid Build Coastguard Worker }
579*2e9d4914SAndroid Build Coastguard Worker 
580*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
581*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * path,std::string & value) const582*2e9d4914SAndroid Build Coastguard Worker bool Config::lookupValue(const char *path, std::string &value) const
583*2e9d4914SAndroid Build Coastguard Worker {
584*2e9d4914SAndroid Build Coastguard Worker   CONFIG_LOOKUP_NO_EXCEPTIONS(path, const char *, value);
585*2e9d4914SAndroid Build Coastguard Worker }
586*2e9d4914SAndroid Build Coastguard Worker 
587*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
588*2e9d4914SAndroid Build Coastguard Worker 
getRoot() const589*2e9d4914SAndroid Build Coastguard Worker Setting & Config::getRoot() const
590*2e9d4914SAndroid Build Coastguard Worker {
591*2e9d4914SAndroid Build Coastguard Worker   return(Setting::wrapSetting(config_root_setting(_config)));
592*2e9d4914SAndroid Build Coastguard Worker }
593*2e9d4914SAndroid Build Coastguard Worker 
594*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
595*2e9d4914SAndroid Build Coastguard Worker 
Setting(config_setting_t * setting)596*2e9d4914SAndroid Build Coastguard Worker Setting::Setting(config_setting_t *setting)
597*2e9d4914SAndroid Build Coastguard Worker   : _setting(setting)
598*2e9d4914SAndroid Build Coastguard Worker {
599*2e9d4914SAndroid Build Coastguard Worker   switch(config_setting_type(setting))
600*2e9d4914SAndroid Build Coastguard Worker   {
601*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_GROUP:
602*2e9d4914SAndroid Build Coastguard Worker       _type = TypeGroup;
603*2e9d4914SAndroid Build Coastguard Worker       break;
604*2e9d4914SAndroid Build Coastguard Worker 
605*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_INT:
606*2e9d4914SAndroid Build Coastguard Worker       _type = TypeInt;
607*2e9d4914SAndroid Build Coastguard Worker       break;
608*2e9d4914SAndroid Build Coastguard Worker 
609*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_INT64:
610*2e9d4914SAndroid Build Coastguard Worker       _type = TypeInt64;
611*2e9d4914SAndroid Build Coastguard Worker       break;
612*2e9d4914SAndroid Build Coastguard Worker 
613*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_FLOAT:
614*2e9d4914SAndroid Build Coastguard Worker       _type = TypeFloat;
615*2e9d4914SAndroid Build Coastguard Worker       break;
616*2e9d4914SAndroid Build Coastguard Worker 
617*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_STRING:
618*2e9d4914SAndroid Build Coastguard Worker       _type = TypeString;
619*2e9d4914SAndroid Build Coastguard Worker       break;
620*2e9d4914SAndroid Build Coastguard Worker 
621*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_BOOL:
622*2e9d4914SAndroid Build Coastguard Worker       _type = TypeBoolean;
623*2e9d4914SAndroid Build Coastguard Worker       break;
624*2e9d4914SAndroid Build Coastguard Worker 
625*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_ARRAY:
626*2e9d4914SAndroid Build Coastguard Worker       _type = TypeArray;
627*2e9d4914SAndroid Build Coastguard Worker       break;
628*2e9d4914SAndroid Build Coastguard Worker 
629*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_LIST:
630*2e9d4914SAndroid Build Coastguard Worker       _type = TypeList;
631*2e9d4914SAndroid Build Coastguard Worker       break;
632*2e9d4914SAndroid Build Coastguard Worker 
633*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_TYPE_NONE:
634*2e9d4914SAndroid Build Coastguard Worker     default:
635*2e9d4914SAndroid Build Coastguard Worker       _type = TypeNone;
636*2e9d4914SAndroid Build Coastguard Worker       break;
637*2e9d4914SAndroid Build Coastguard Worker   }
638*2e9d4914SAndroid Build Coastguard Worker 
639*2e9d4914SAndroid Build Coastguard Worker   switch(config_setting_get_format(setting))
640*2e9d4914SAndroid Build Coastguard Worker   {
641*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_FORMAT_HEX:
642*2e9d4914SAndroid Build Coastguard Worker       _format = FormatHex;
643*2e9d4914SAndroid Build Coastguard Worker       break;
644*2e9d4914SAndroid Build Coastguard Worker 
645*2e9d4914SAndroid Build Coastguard Worker     case CONFIG_FORMAT_DEFAULT:
646*2e9d4914SAndroid Build Coastguard Worker     default:
647*2e9d4914SAndroid Build Coastguard Worker       _format = FormatDefault;
648*2e9d4914SAndroid Build Coastguard Worker       break;
649*2e9d4914SAndroid Build Coastguard Worker   }
650*2e9d4914SAndroid Build Coastguard Worker }
651*2e9d4914SAndroid Build Coastguard Worker 
652*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
653*2e9d4914SAndroid Build Coastguard Worker 
~Setting()654*2e9d4914SAndroid Build Coastguard Worker Setting::~Setting()
655*2e9d4914SAndroid Build Coastguard Worker {
656*2e9d4914SAndroid Build Coastguard Worker   _setting = NULL;
657*2e9d4914SAndroid Build Coastguard Worker }
658*2e9d4914SAndroid Build Coastguard Worker 
659*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
660*2e9d4914SAndroid Build Coastguard Worker 
setFormat(Format format)661*2e9d4914SAndroid Build Coastguard Worker void Setting::setFormat(Format format)
662*2e9d4914SAndroid Build Coastguard Worker {
663*2e9d4914SAndroid Build Coastguard Worker   if((_type == TypeInt) || (_type == TypeInt64))
664*2e9d4914SAndroid Build Coastguard Worker   {
665*2e9d4914SAndroid Build Coastguard Worker     if(format == FormatHex)
666*2e9d4914SAndroid Build Coastguard Worker       _format = FormatHex;
667*2e9d4914SAndroid Build Coastguard Worker     else
668*2e9d4914SAndroid Build Coastguard Worker       _format = FormatDefault;
669*2e9d4914SAndroid Build Coastguard Worker   }
670*2e9d4914SAndroid Build Coastguard Worker   else
671*2e9d4914SAndroid Build Coastguard Worker     _format = FormatDefault;
672*2e9d4914SAndroid Build Coastguard Worker 
673*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_format(_setting, static_cast<short>(_format));
674*2e9d4914SAndroid Build Coastguard Worker }
675*2e9d4914SAndroid Build Coastguard Worker 
676*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
677*2e9d4914SAndroid Build Coastguard Worker 
operator bool() const678*2e9d4914SAndroid Build Coastguard Worker Setting::operator bool() const
679*2e9d4914SAndroid Build Coastguard Worker {
680*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeBoolean);
681*2e9d4914SAndroid Build Coastguard Worker 
682*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_get_bool(_setting) ? true : false);
683*2e9d4914SAndroid Build Coastguard Worker }
684*2e9d4914SAndroid Build Coastguard Worker 
685*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
686*2e9d4914SAndroid Build Coastguard Worker 
operator int() const687*2e9d4914SAndroid Build Coastguard Worker Setting::operator int() const
688*2e9d4914SAndroid Build Coastguard Worker {
689*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt);
690*2e9d4914SAndroid Build Coastguard Worker 
691*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_get_int(_setting));
692*2e9d4914SAndroid Build Coastguard Worker }
693*2e9d4914SAndroid Build Coastguard Worker 
694*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
695*2e9d4914SAndroid Build Coastguard Worker 
operator unsigned int() const696*2e9d4914SAndroid Build Coastguard Worker Setting::operator unsigned int() const
697*2e9d4914SAndroid Build Coastguard Worker {
698*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt);
699*2e9d4914SAndroid Build Coastguard Worker 
700*2e9d4914SAndroid Build Coastguard Worker   int v = config_setting_get_int(_setting);
701*2e9d4914SAndroid Build Coastguard Worker 
702*2e9d4914SAndroid Build Coastguard Worker   return(static_cast<unsigned int>(v));
703*2e9d4914SAndroid Build Coastguard Worker }
704*2e9d4914SAndroid Build Coastguard Worker 
705*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
706*2e9d4914SAndroid Build Coastguard Worker 
operator long() const707*2e9d4914SAndroid Build Coastguard Worker Setting::operator long() const
708*2e9d4914SAndroid Build Coastguard Worker {
709*2e9d4914SAndroid Build Coastguard Worker   if(sizeof(long) == sizeof(long long))
710*2e9d4914SAndroid Build Coastguard Worker     return operator long long();
711*2e9d4914SAndroid Build Coastguard Worker   else
712*2e9d4914SAndroid Build Coastguard Worker     return operator int();
713*2e9d4914SAndroid Build Coastguard Worker }
714*2e9d4914SAndroid Build Coastguard Worker 
715*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
716*2e9d4914SAndroid Build Coastguard Worker 
operator unsigned long() const717*2e9d4914SAndroid Build Coastguard Worker Setting::operator unsigned long() const
718*2e9d4914SAndroid Build Coastguard Worker {
719*2e9d4914SAndroid Build Coastguard Worker   if(sizeof(long) == sizeof(long long))
720*2e9d4914SAndroid Build Coastguard Worker     return operator unsigned long long();
721*2e9d4914SAndroid Build Coastguard Worker   else
722*2e9d4914SAndroid Build Coastguard Worker     return operator unsigned int();
723*2e9d4914SAndroid Build Coastguard Worker }
724*2e9d4914SAndroid Build Coastguard Worker 
725*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
726*2e9d4914SAndroid Build Coastguard Worker 
operator long long() const727*2e9d4914SAndroid Build Coastguard Worker Setting::operator long long() const
728*2e9d4914SAndroid Build Coastguard Worker {
729*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt64);
730*2e9d4914SAndroid Build Coastguard Worker 
731*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_get_int64(_setting));
732*2e9d4914SAndroid Build Coastguard Worker }
733*2e9d4914SAndroid Build Coastguard Worker 
734*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
735*2e9d4914SAndroid Build Coastguard Worker 
operator unsigned long long() const736*2e9d4914SAndroid Build Coastguard Worker Setting::operator unsigned long long() const
737*2e9d4914SAndroid Build Coastguard Worker {
738*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt64);
739*2e9d4914SAndroid Build Coastguard Worker 
740*2e9d4914SAndroid Build Coastguard Worker   long long v = config_setting_get_int64(_setting);
741*2e9d4914SAndroid Build Coastguard Worker 
742*2e9d4914SAndroid Build Coastguard Worker   return(static_cast<unsigned long long>(v));
743*2e9d4914SAndroid Build Coastguard Worker }
744*2e9d4914SAndroid Build Coastguard Worker 
745*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
746*2e9d4914SAndroid Build Coastguard Worker 
operator double() const747*2e9d4914SAndroid Build Coastguard Worker Setting::operator double() const
748*2e9d4914SAndroid Build Coastguard Worker {
749*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeFloat);
750*2e9d4914SAndroid Build Coastguard Worker 
751*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_get_float(_setting));
752*2e9d4914SAndroid Build Coastguard Worker }
753*2e9d4914SAndroid Build Coastguard Worker 
754*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
755*2e9d4914SAndroid Build Coastguard Worker 
operator float() const756*2e9d4914SAndroid Build Coastguard Worker Setting::operator float() const
757*2e9d4914SAndroid Build Coastguard Worker {
758*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeFloat);
759*2e9d4914SAndroid Build Coastguard Worker 
760*2e9d4914SAndroid Build Coastguard Worker   // may cause loss of precision:
761*2e9d4914SAndroid Build Coastguard Worker   return(static_cast<float>(config_setting_get_float(_setting)));
762*2e9d4914SAndroid Build Coastguard Worker }
763*2e9d4914SAndroid Build Coastguard Worker 
764*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
765*2e9d4914SAndroid Build Coastguard Worker 
operator const char*() const766*2e9d4914SAndroid Build Coastguard Worker Setting::operator const char *() const
767*2e9d4914SAndroid Build Coastguard Worker {
768*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeString);
769*2e9d4914SAndroid Build Coastguard Worker 
770*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_get_string(_setting));
771*2e9d4914SAndroid Build Coastguard Worker }
772*2e9d4914SAndroid Build Coastguard Worker 
773*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
774*2e9d4914SAndroid Build Coastguard Worker 
operator std::string() const775*2e9d4914SAndroid Build Coastguard Worker Setting::operator std::string() const
776*2e9d4914SAndroid Build Coastguard Worker {
777*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeString);
778*2e9d4914SAndroid Build Coastguard Worker 
779*2e9d4914SAndroid Build Coastguard Worker   const char *s = config_setting_get_string(_setting);
780*2e9d4914SAndroid Build Coastguard Worker 
781*2e9d4914SAndroid Build Coastguard Worker   std::string str;
782*2e9d4914SAndroid Build Coastguard Worker   if(s)
783*2e9d4914SAndroid Build Coastguard Worker     str = s;
784*2e9d4914SAndroid Build Coastguard Worker 
785*2e9d4914SAndroid Build Coastguard Worker   return(str);
786*2e9d4914SAndroid Build Coastguard Worker }
787*2e9d4914SAndroid Build Coastguard Worker 
788*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
789*2e9d4914SAndroid Build Coastguard Worker 
operator =(bool value)790*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(bool value)
791*2e9d4914SAndroid Build Coastguard Worker {
792*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeBoolean);
793*2e9d4914SAndroid Build Coastguard Worker 
794*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_bool(_setting, value);
795*2e9d4914SAndroid Build Coastguard Worker 
796*2e9d4914SAndroid Build Coastguard Worker   return(*this);
797*2e9d4914SAndroid Build Coastguard Worker }
798*2e9d4914SAndroid Build Coastguard Worker 
799*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
800*2e9d4914SAndroid Build Coastguard Worker 
operator =(int value)801*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(int value)
802*2e9d4914SAndroid Build Coastguard Worker {
803*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt);
804*2e9d4914SAndroid Build Coastguard Worker 
805*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_int(_setting, value);
806*2e9d4914SAndroid Build Coastguard Worker 
807*2e9d4914SAndroid Build Coastguard Worker   return(*this);
808*2e9d4914SAndroid Build Coastguard Worker }
809*2e9d4914SAndroid Build Coastguard Worker 
810*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
811*2e9d4914SAndroid Build Coastguard Worker 
operator =(long value)812*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(long value)
813*2e9d4914SAndroid Build Coastguard Worker {
814*2e9d4914SAndroid Build Coastguard Worker   if(sizeof(long) == sizeof(long long))
815*2e9d4914SAndroid Build Coastguard Worker     return(operator=(static_cast<long long>(value)));
816*2e9d4914SAndroid Build Coastguard Worker   else
817*2e9d4914SAndroid Build Coastguard Worker     return(operator=(static_cast<int>(value)));
818*2e9d4914SAndroid Build Coastguard Worker }
819*2e9d4914SAndroid Build Coastguard Worker 
820*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
821*2e9d4914SAndroid Build Coastguard Worker 
operator =(const long long & value)822*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(const long long &value)
823*2e9d4914SAndroid Build Coastguard Worker {
824*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeInt64);
825*2e9d4914SAndroid Build Coastguard Worker 
826*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_int64(_setting, value);
827*2e9d4914SAndroid Build Coastguard Worker 
828*2e9d4914SAndroid Build Coastguard Worker   return(*this);
829*2e9d4914SAndroid Build Coastguard Worker }
830*2e9d4914SAndroid Build Coastguard Worker 
831*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
832*2e9d4914SAndroid Build Coastguard Worker 
operator =(const double & value)833*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(const double &value)
834*2e9d4914SAndroid Build Coastguard Worker {
835*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeFloat);
836*2e9d4914SAndroid Build Coastguard Worker 
837*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_float(_setting, value);
838*2e9d4914SAndroid Build Coastguard Worker 
839*2e9d4914SAndroid Build Coastguard Worker   return(*this);
840*2e9d4914SAndroid Build Coastguard Worker }
841*2e9d4914SAndroid Build Coastguard Worker 
842*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
843*2e9d4914SAndroid Build Coastguard Worker 
operator =(float value)844*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(float value)
845*2e9d4914SAndroid Build Coastguard Worker {
846*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeFloat);
847*2e9d4914SAndroid Build Coastguard Worker 
848*2e9d4914SAndroid Build Coastguard Worker   double cvalue = static_cast<double>(value);
849*2e9d4914SAndroid Build Coastguard Worker 
850*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_float(_setting, cvalue);
851*2e9d4914SAndroid Build Coastguard Worker 
852*2e9d4914SAndroid Build Coastguard Worker   return(*this);
853*2e9d4914SAndroid Build Coastguard Worker }
854*2e9d4914SAndroid Build Coastguard Worker 
855*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
856*2e9d4914SAndroid Build Coastguard Worker 
operator =(const char * value)857*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(const char *value)
858*2e9d4914SAndroid Build Coastguard Worker {
859*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeString);
860*2e9d4914SAndroid Build Coastguard Worker 
861*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_string(_setting, value);
862*2e9d4914SAndroid Build Coastguard Worker 
863*2e9d4914SAndroid Build Coastguard Worker   return(*this);
864*2e9d4914SAndroid Build Coastguard Worker }
865*2e9d4914SAndroid Build Coastguard Worker 
866*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
867*2e9d4914SAndroid Build Coastguard Worker 
operator =(const std::string & value)868*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator=(const std::string &value)
869*2e9d4914SAndroid Build Coastguard Worker {
870*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeString);
871*2e9d4914SAndroid Build Coastguard Worker 
872*2e9d4914SAndroid Build Coastguard Worker   config_setting_set_string(_setting, value.c_str());
873*2e9d4914SAndroid Build Coastguard Worker 
874*2e9d4914SAndroid Build Coastguard Worker   return(*this);
875*2e9d4914SAndroid Build Coastguard Worker }
876*2e9d4914SAndroid Build Coastguard Worker 
877*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
878*2e9d4914SAndroid Build Coastguard Worker 
lookup(const char * path) const879*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::lookup(const char *path) const
880*2e9d4914SAndroid Build Coastguard Worker {
881*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeGroup);
882*2e9d4914SAndroid Build Coastguard Worker 
883*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_lookup(_setting, path);
884*2e9d4914SAndroid Build Coastguard Worker 
885*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
886*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(*this, path);
887*2e9d4914SAndroid Build Coastguard Worker 
888*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
889*2e9d4914SAndroid Build Coastguard Worker }
890*2e9d4914SAndroid Build Coastguard Worker 
891*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
892*2e9d4914SAndroid Build Coastguard Worker 
operator [](const char * name) const893*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator[](const char *name) const
894*2e9d4914SAndroid Build Coastguard Worker {
895*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeGroup);
896*2e9d4914SAndroid Build Coastguard Worker 
897*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_get_member(_setting, name);
898*2e9d4914SAndroid Build Coastguard Worker 
899*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
900*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(*this, name);
901*2e9d4914SAndroid Build Coastguard Worker 
902*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
903*2e9d4914SAndroid Build Coastguard Worker }
904*2e9d4914SAndroid Build Coastguard Worker 
905*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
906*2e9d4914SAndroid Build Coastguard Worker 
operator [](int i) const907*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::operator[](int i) const
908*2e9d4914SAndroid Build Coastguard Worker {
909*2e9d4914SAndroid Build Coastguard Worker   if((_type != TypeArray) && (_type != TypeGroup) && (_type != TypeList))
910*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(*this, i);
911*2e9d4914SAndroid Build Coastguard Worker 
912*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_get_elem(_setting, i);
913*2e9d4914SAndroid Build Coastguard Worker 
914*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
915*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(*this, i);
916*2e9d4914SAndroid Build Coastguard Worker 
917*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
918*2e9d4914SAndroid Build Coastguard Worker }
919*2e9d4914SAndroid Build Coastguard Worker 
920*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
921*2e9d4914SAndroid Build Coastguard Worker 
922*2e9d4914SAndroid Build Coastguard Worker #define SETTING_LOOKUP_NO_EXCEPTIONS(K, T, V)   \
923*2e9d4914SAndroid Build Coastguard Worker   try                                           \
924*2e9d4914SAndroid Build Coastguard Worker   {                                             \
925*2e9d4914SAndroid Build Coastguard Worker     Setting &s = operator[](K);                 \
926*2e9d4914SAndroid Build Coastguard Worker     V = (T)s;                                   \
927*2e9d4914SAndroid Build Coastguard Worker     return(true);                               \
928*2e9d4914SAndroid Build Coastguard Worker   }                                             \
929*2e9d4914SAndroid Build Coastguard Worker   catch(const ConfigException &)                \
930*2e9d4914SAndroid Build Coastguard Worker   {                                             \
931*2e9d4914SAndroid Build Coastguard Worker     return(false);                              \
932*2e9d4914SAndroid Build Coastguard Worker   }
933*2e9d4914SAndroid Build Coastguard Worker 
934*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
935*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,bool & value) const936*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, bool &value) const
937*2e9d4914SAndroid Build Coastguard Worker {
938*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, bool, value);
939*2e9d4914SAndroid Build Coastguard Worker }
940*2e9d4914SAndroid Build Coastguard Worker 
941*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
942*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,int & value) const943*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, int &value) const
944*2e9d4914SAndroid Build Coastguard Worker {
945*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, int, value);
946*2e9d4914SAndroid Build Coastguard Worker }
947*2e9d4914SAndroid Build Coastguard Worker 
948*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
949*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,unsigned int & value) const950*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, unsigned int &value) const
951*2e9d4914SAndroid Build Coastguard Worker {
952*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, unsigned int, value);
953*2e9d4914SAndroid Build Coastguard Worker }
954*2e9d4914SAndroid Build Coastguard Worker 
955*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
956*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,long long & value) const957*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, long long &value) const
958*2e9d4914SAndroid Build Coastguard Worker {
959*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, long long, value);
960*2e9d4914SAndroid Build Coastguard Worker }
961*2e9d4914SAndroid Build Coastguard Worker 
962*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
963*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,unsigned long long & value) const964*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, unsigned long long &value) const
965*2e9d4914SAndroid Build Coastguard Worker {
966*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, unsigned long long, value);
967*2e9d4914SAndroid Build Coastguard Worker }
968*2e9d4914SAndroid Build Coastguard Worker 
969*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
970*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,double & value) const971*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, double &value) const
972*2e9d4914SAndroid Build Coastguard Worker {
973*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, double, value);
974*2e9d4914SAndroid Build Coastguard Worker }
975*2e9d4914SAndroid Build Coastguard Worker 
976*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
977*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,float & value) const978*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, float &value) const
979*2e9d4914SAndroid Build Coastguard Worker {
980*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, float, value);
981*2e9d4914SAndroid Build Coastguard Worker }
982*2e9d4914SAndroid Build Coastguard Worker 
983*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
984*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,const char * & value) const985*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, const char *&value) const
986*2e9d4914SAndroid Build Coastguard Worker {
987*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, const char *, value);
988*2e9d4914SAndroid Build Coastguard Worker }
989*2e9d4914SAndroid Build Coastguard Worker 
990*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
991*2e9d4914SAndroid Build Coastguard Worker 
lookupValue(const char * name,std::string & value) const992*2e9d4914SAndroid Build Coastguard Worker bool Setting::lookupValue(const char *name, std::string &value) const
993*2e9d4914SAndroid Build Coastguard Worker {
994*2e9d4914SAndroid Build Coastguard Worker   SETTING_LOOKUP_NO_EXCEPTIONS(name, const char *, value);
995*2e9d4914SAndroid Build Coastguard Worker }
996*2e9d4914SAndroid Build Coastguard Worker 
997*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
998*2e9d4914SAndroid Build Coastguard Worker 
exists(const char * name) const999*2e9d4914SAndroid Build Coastguard Worker bool Setting::exists(const char *name) const
1000*2e9d4914SAndroid Build Coastguard Worker {
1001*2e9d4914SAndroid Build Coastguard Worker   if(_type != TypeGroup)
1002*2e9d4914SAndroid Build Coastguard Worker     return(false);
1003*2e9d4914SAndroid Build Coastguard Worker 
1004*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_get_member(_setting, name);
1005*2e9d4914SAndroid Build Coastguard Worker 
1006*2e9d4914SAndroid Build Coastguard Worker   return(setting != NULL);
1007*2e9d4914SAndroid Build Coastguard Worker }
1008*2e9d4914SAndroid Build Coastguard Worker 
1009*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1010*2e9d4914SAndroid Build Coastguard Worker 
getLength() const1011*2e9d4914SAndroid Build Coastguard Worker int Setting::getLength() const
1012*2e9d4914SAndroid Build Coastguard Worker {
1013*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_length(_setting));
1014*2e9d4914SAndroid Build Coastguard Worker }
1015*2e9d4914SAndroid Build Coastguard Worker 
1016*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1017*2e9d4914SAndroid Build Coastguard Worker 
getName() const1018*2e9d4914SAndroid Build Coastguard Worker const char * Setting::getName() const
1019*2e9d4914SAndroid Build Coastguard Worker {
1020*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_name(_setting));
1021*2e9d4914SAndroid Build Coastguard Worker }
1022*2e9d4914SAndroid Build Coastguard Worker 
1023*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1024*2e9d4914SAndroid Build Coastguard Worker 
getPath() const1025*2e9d4914SAndroid Build Coastguard Worker std::string Setting::getPath() const
1026*2e9d4914SAndroid Build Coastguard Worker {
1027*2e9d4914SAndroid Build Coastguard Worker   std::stringstream path;
1028*2e9d4914SAndroid Build Coastguard Worker 
1029*2e9d4914SAndroid Build Coastguard Worker   __constructPath(*this, path);
1030*2e9d4914SAndroid Build Coastguard Worker 
1031*2e9d4914SAndroid Build Coastguard Worker   return(path.str());
1032*2e9d4914SAndroid Build Coastguard Worker }
1033*2e9d4914SAndroid Build Coastguard Worker 
1034*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1035*2e9d4914SAndroid Build Coastguard Worker 
getParent() const1036*2e9d4914SAndroid Build Coastguard Worker const Setting & Setting::getParent() const
1037*2e9d4914SAndroid Build Coastguard Worker {
1038*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_parent(_setting);
1039*2e9d4914SAndroid Build Coastguard Worker 
1040*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
1041*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(NULL);
1042*2e9d4914SAndroid Build Coastguard Worker 
1043*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
1044*2e9d4914SAndroid Build Coastguard Worker }
1045*2e9d4914SAndroid Build Coastguard Worker 
1046*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1047*2e9d4914SAndroid Build Coastguard Worker 
getParent()1048*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::getParent()
1049*2e9d4914SAndroid Build Coastguard Worker {
1050*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_parent(_setting);
1051*2e9d4914SAndroid Build Coastguard Worker 
1052*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
1053*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(NULL);
1054*2e9d4914SAndroid Build Coastguard Worker 
1055*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
1056*2e9d4914SAndroid Build Coastguard Worker }
1057*2e9d4914SAndroid Build Coastguard Worker 
1058*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1059*2e9d4914SAndroid Build Coastguard Worker 
getSourceLine() const1060*2e9d4914SAndroid Build Coastguard Worker unsigned int Setting::getSourceLine() const
1061*2e9d4914SAndroid Build Coastguard Worker {
1062*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_source_line(_setting));
1063*2e9d4914SAndroid Build Coastguard Worker }
1064*2e9d4914SAndroid Build Coastguard Worker 
1065*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1066*2e9d4914SAndroid Build Coastguard Worker 
getSourceFile() const1067*2e9d4914SAndroid Build Coastguard Worker const char *Setting::getSourceFile() const
1068*2e9d4914SAndroid Build Coastguard Worker {
1069*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_source_file(_setting));
1070*2e9d4914SAndroid Build Coastguard Worker }
1071*2e9d4914SAndroid Build Coastguard Worker 
1072*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1073*2e9d4914SAndroid Build Coastguard Worker 
isRoot() const1074*2e9d4914SAndroid Build Coastguard Worker bool Setting::isRoot() const
1075*2e9d4914SAndroid Build Coastguard Worker {
1076*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_is_root(_setting));
1077*2e9d4914SAndroid Build Coastguard Worker }
1078*2e9d4914SAndroid Build Coastguard Worker 
1079*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1080*2e9d4914SAndroid Build Coastguard Worker 
getIndex() const1081*2e9d4914SAndroid Build Coastguard Worker int Setting::getIndex() const
1082*2e9d4914SAndroid Build Coastguard Worker {
1083*2e9d4914SAndroid Build Coastguard Worker   return(config_setting_index(_setting));
1084*2e9d4914SAndroid Build Coastguard Worker }
1085*2e9d4914SAndroid Build Coastguard Worker 
1086*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1087*2e9d4914SAndroid Build Coastguard Worker 
remove(const char * name)1088*2e9d4914SAndroid Build Coastguard Worker void Setting::remove(const char *name)
1089*2e9d4914SAndroid Build Coastguard Worker {
1090*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeGroup);
1091*2e9d4914SAndroid Build Coastguard Worker 
1092*2e9d4914SAndroid Build Coastguard Worker   if(! config_setting_remove(_setting, name))
1093*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(*this, name);
1094*2e9d4914SAndroid Build Coastguard Worker }
1095*2e9d4914SAndroid Build Coastguard Worker 
1096*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1097*2e9d4914SAndroid Build Coastguard Worker 
remove(unsigned int idx)1098*2e9d4914SAndroid Build Coastguard Worker void Setting::remove(unsigned int idx)
1099*2e9d4914SAndroid Build Coastguard Worker {
1100*2e9d4914SAndroid Build Coastguard Worker   if((_type != TypeArray) && (_type != TypeGroup) && (_type != TypeList))
1101*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(*this, idx);
1102*2e9d4914SAndroid Build Coastguard Worker 
1103*2e9d4914SAndroid Build Coastguard Worker   if(! config_setting_remove_elem(_setting, idx))
1104*2e9d4914SAndroid Build Coastguard Worker     throw SettingNotFoundException(*this, idx);
1105*2e9d4914SAndroid Build Coastguard Worker }
1106*2e9d4914SAndroid Build Coastguard Worker 
1107*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1108*2e9d4914SAndroid Build Coastguard Worker 
add(const char * name,Setting::Type type)1109*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::add(const char *name, Setting::Type type)
1110*2e9d4914SAndroid Build Coastguard Worker {
1111*2e9d4914SAndroid Build Coastguard Worker   assertType(TypeGroup);
1112*2e9d4914SAndroid Build Coastguard Worker 
1113*2e9d4914SAndroid Build Coastguard Worker   int typecode = __toTypeCode(type);
1114*2e9d4914SAndroid Build Coastguard Worker 
1115*2e9d4914SAndroid Build Coastguard Worker   if(typecode == CONFIG_TYPE_NONE)
1116*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(*this, name);
1117*2e9d4914SAndroid Build Coastguard Worker 
1118*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *setting = config_setting_add(_setting, name, typecode);
1119*2e9d4914SAndroid Build Coastguard Worker 
1120*2e9d4914SAndroid Build Coastguard Worker   if(! setting)
1121*2e9d4914SAndroid Build Coastguard Worker     throw SettingNameException(*this, name);
1122*2e9d4914SAndroid Build Coastguard Worker 
1123*2e9d4914SAndroid Build Coastguard Worker   return(wrapSetting(setting));
1124*2e9d4914SAndroid Build Coastguard Worker }
1125*2e9d4914SAndroid Build Coastguard Worker 
1126*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1127*2e9d4914SAndroid Build Coastguard Worker 
add(Setting::Type type)1128*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::add(Setting::Type type)
1129*2e9d4914SAndroid Build Coastguard Worker {
1130*2e9d4914SAndroid Build Coastguard Worker   if((_type != TypeArray) && (_type != TypeList))
1131*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(*this);
1132*2e9d4914SAndroid Build Coastguard Worker 
1133*2e9d4914SAndroid Build Coastguard Worker   if(_type == TypeArray)
1134*2e9d4914SAndroid Build Coastguard Worker   {
1135*2e9d4914SAndroid Build Coastguard Worker     int idx = getLength();
1136*2e9d4914SAndroid Build Coastguard Worker 
1137*2e9d4914SAndroid Build Coastguard Worker     if(idx > 0)
1138*2e9d4914SAndroid Build Coastguard Worker     {
1139*2e9d4914SAndroid Build Coastguard Worker       Setting::Type atype = operator[](0).getType();
1140*2e9d4914SAndroid Build Coastguard Worker       if(type != atype)
1141*2e9d4914SAndroid Build Coastguard Worker         throw SettingTypeException(*this, idx);
1142*2e9d4914SAndroid Build Coastguard Worker     }
1143*2e9d4914SAndroid Build Coastguard Worker     else
1144*2e9d4914SAndroid Build Coastguard Worker     {
1145*2e9d4914SAndroid Build Coastguard Worker       if((type != TypeInt) && (type != TypeInt64) && (type != TypeFloat)
1146*2e9d4914SAndroid Build Coastguard Worker          && (type != TypeString) && (type != TypeBoolean))
1147*2e9d4914SAndroid Build Coastguard Worker         throw SettingTypeException(*this, idx);
1148*2e9d4914SAndroid Build Coastguard Worker     }
1149*2e9d4914SAndroid Build Coastguard Worker   }
1150*2e9d4914SAndroid Build Coastguard Worker 
1151*2e9d4914SAndroid Build Coastguard Worker   int typecode = __toTypeCode(type);
1152*2e9d4914SAndroid Build Coastguard Worker   config_setting_t *s = config_setting_add(_setting, NULL, typecode);
1153*2e9d4914SAndroid Build Coastguard Worker 
1154*2e9d4914SAndroid Build Coastguard Worker   Setting &ns = wrapSetting(s);
1155*2e9d4914SAndroid Build Coastguard Worker 
1156*2e9d4914SAndroid Build Coastguard Worker   switch(type)
1157*2e9d4914SAndroid Build Coastguard Worker   {
1158*2e9d4914SAndroid Build Coastguard Worker     case TypeInt:
1159*2e9d4914SAndroid Build Coastguard Worker       ns = 0;
1160*2e9d4914SAndroid Build Coastguard Worker       break;
1161*2e9d4914SAndroid Build Coastguard Worker 
1162*2e9d4914SAndroid Build Coastguard Worker     case TypeInt64:
1163*2e9d4914SAndroid Build Coastguard Worker       ns = INT64_CONST(0);
1164*2e9d4914SAndroid Build Coastguard Worker       break;
1165*2e9d4914SAndroid Build Coastguard Worker 
1166*2e9d4914SAndroid Build Coastguard Worker     case TypeFloat:
1167*2e9d4914SAndroid Build Coastguard Worker       ns = 0.0;
1168*2e9d4914SAndroid Build Coastguard Worker       break;
1169*2e9d4914SAndroid Build Coastguard Worker 
1170*2e9d4914SAndroid Build Coastguard Worker     case TypeString:
1171*2e9d4914SAndroid Build Coastguard Worker       ns = (char *)NULL;
1172*2e9d4914SAndroid Build Coastguard Worker       break;
1173*2e9d4914SAndroid Build Coastguard Worker 
1174*2e9d4914SAndroid Build Coastguard Worker     case TypeBoolean:
1175*2e9d4914SAndroid Build Coastguard Worker       ns = false;
1176*2e9d4914SAndroid Build Coastguard Worker       break;
1177*2e9d4914SAndroid Build Coastguard Worker 
1178*2e9d4914SAndroid Build Coastguard Worker     default:
1179*2e9d4914SAndroid Build Coastguard Worker       // won't happen
1180*2e9d4914SAndroid Build Coastguard Worker       break;
1181*2e9d4914SAndroid Build Coastguard Worker   }
1182*2e9d4914SAndroid Build Coastguard Worker 
1183*2e9d4914SAndroid Build Coastguard Worker   return(ns);
1184*2e9d4914SAndroid Build Coastguard Worker }
1185*2e9d4914SAndroid Build Coastguard Worker 
1186*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1187*2e9d4914SAndroid Build Coastguard Worker 
assertType(Setting::Type type) const1188*2e9d4914SAndroid Build Coastguard Worker void Setting::assertType(Setting::Type type) const
1189*2e9d4914SAndroid Build Coastguard Worker {
1190*2e9d4914SAndroid Build Coastguard Worker   if(type != _type)
1191*2e9d4914SAndroid Build Coastguard Worker   {
1192*2e9d4914SAndroid Build Coastguard Worker     if(!(isNumber() && config_get_auto_convert(_setting->config)
1193*2e9d4914SAndroid Build Coastguard Worker          && ((type == TypeInt) || (type == TypeInt64) || (type == TypeFloat))))
1194*2e9d4914SAndroid Build Coastguard Worker       throw SettingTypeException(*this);
1195*2e9d4914SAndroid Build Coastguard Worker   }
1196*2e9d4914SAndroid Build Coastguard Worker }
1197*2e9d4914SAndroid Build Coastguard Worker 
1198*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1199*2e9d4914SAndroid Build Coastguard Worker 
wrapSetting(config_setting_t * s)1200*2e9d4914SAndroid Build Coastguard Worker Setting & Setting::wrapSetting(config_setting_t *s)
1201*2e9d4914SAndroid Build Coastguard Worker {
1202*2e9d4914SAndroid Build Coastguard Worker   Setting *setting = NULL;
1203*2e9d4914SAndroid Build Coastguard Worker 
1204*2e9d4914SAndroid Build Coastguard Worker   void *hook = config_setting_get_hook(s);
1205*2e9d4914SAndroid Build Coastguard Worker   if(! hook)
1206*2e9d4914SAndroid Build Coastguard Worker   {
1207*2e9d4914SAndroid Build Coastguard Worker     setting = new Setting(s);
1208*2e9d4914SAndroid Build Coastguard Worker     config_setting_set_hook(s, reinterpret_cast<void *>(setting));
1209*2e9d4914SAndroid Build Coastguard Worker   }
1210*2e9d4914SAndroid Build Coastguard Worker   else
1211*2e9d4914SAndroid Build Coastguard Worker     setting = reinterpret_cast<Setting *>(hook);
1212*2e9d4914SAndroid Build Coastguard Worker 
1213*2e9d4914SAndroid Build Coastguard Worker   return(*setting);
1214*2e9d4914SAndroid Build Coastguard Worker }
1215*2e9d4914SAndroid Build Coastguard Worker 
1216*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1217*2e9d4914SAndroid Build Coastguard Worker 
begin()1218*2e9d4914SAndroid Build Coastguard Worker Setting::iterator Setting::begin()
1219*2e9d4914SAndroid Build Coastguard Worker { return(iterator(*this)); }
1220*2e9d4914SAndroid Build Coastguard Worker 
1221*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1222*2e9d4914SAndroid Build Coastguard Worker 
end()1223*2e9d4914SAndroid Build Coastguard Worker Setting::iterator Setting::end()
1224*2e9d4914SAndroid Build Coastguard Worker { return(iterator(*this, true)); }
1225*2e9d4914SAndroid Build Coastguard Worker 
1226*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1227*2e9d4914SAndroid Build Coastguard Worker 
begin() const1228*2e9d4914SAndroid Build Coastguard Worker Setting::const_iterator Setting::begin() const
1229*2e9d4914SAndroid Build Coastguard Worker { return(const_iterator(*this)); }
1230*2e9d4914SAndroid Build Coastguard Worker 
1231*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1232*2e9d4914SAndroid Build Coastguard Worker 
end() const1233*2e9d4914SAndroid Build Coastguard Worker Setting::const_iterator Setting::end() const
1234*2e9d4914SAndroid Build Coastguard Worker { return(const_iterator(*this, true)); }
1235*2e9d4914SAndroid Build Coastguard Worker 
1236*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1237*2e9d4914SAndroid Build Coastguard Worker 
SettingIterator(Setting & setting,bool endIterator)1238*2e9d4914SAndroid Build Coastguard Worker SettingIterator::SettingIterator(Setting& setting, bool endIterator)
1239*2e9d4914SAndroid Build Coastguard Worker   : _setting(&setting),
1240*2e9d4914SAndroid Build Coastguard Worker     _count(setting.getLength()),
1241*2e9d4914SAndroid Build Coastguard Worker     _idx(endIterator ? _count : 0)
1242*2e9d4914SAndroid Build Coastguard Worker {
1243*2e9d4914SAndroid Build Coastguard Worker   if(!setting.isAggregate())
1244*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(setting);
1245*2e9d4914SAndroid Build Coastguard Worker }
1246*2e9d4914SAndroid Build Coastguard Worker 
1247*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1248*2e9d4914SAndroid Build Coastguard Worker 
SettingIterator(const SettingIterator & other)1249*2e9d4914SAndroid Build Coastguard Worker SettingIterator::SettingIterator(const SettingIterator &other)
1250*2e9d4914SAndroid Build Coastguard Worker   : _setting(other._setting),
1251*2e9d4914SAndroid Build Coastguard Worker     _count(other._count),
1252*2e9d4914SAndroid Build Coastguard Worker     _idx(other._idx)
1253*2e9d4914SAndroid Build Coastguard Worker {
1254*2e9d4914SAndroid Build Coastguard Worker }
1255*2e9d4914SAndroid Build Coastguard Worker 
1256*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1257*2e9d4914SAndroid Build Coastguard Worker 
operator =(const SettingIterator & other)1258*2e9d4914SAndroid Build Coastguard Worker SettingIterator& SettingIterator::operator=(const SettingIterator &other)
1259*2e9d4914SAndroid Build Coastguard Worker {
1260*2e9d4914SAndroid Build Coastguard Worker   _setting = other._setting;
1261*2e9d4914SAndroid Build Coastguard Worker   _count = other._count;
1262*2e9d4914SAndroid Build Coastguard Worker   _idx = other._idx;
1263*2e9d4914SAndroid Build Coastguard Worker 
1264*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1265*2e9d4914SAndroid Build Coastguard Worker }
1266*2e9d4914SAndroid Build Coastguard Worker 
1267*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1268*2e9d4914SAndroid Build Coastguard Worker 
operator ++()1269*2e9d4914SAndroid Build Coastguard Worker SettingIterator& SettingIterator::operator++()
1270*2e9d4914SAndroid Build Coastguard Worker {
1271*2e9d4914SAndroid Build Coastguard Worker   ++_idx;
1272*2e9d4914SAndroid Build Coastguard Worker 
1273*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1274*2e9d4914SAndroid Build Coastguard Worker }
1275*2e9d4914SAndroid Build Coastguard Worker 
1276*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1277*2e9d4914SAndroid Build Coastguard Worker 
operator ++(int)1278*2e9d4914SAndroid Build Coastguard Worker SettingIterator SettingIterator::operator++(int)
1279*2e9d4914SAndroid Build Coastguard Worker {
1280*2e9d4914SAndroid Build Coastguard Worker   SettingIterator tmp(*this);
1281*2e9d4914SAndroid Build Coastguard Worker   ++_idx;
1282*2e9d4914SAndroid Build Coastguard Worker 
1283*2e9d4914SAndroid Build Coastguard Worker   return(tmp);
1284*2e9d4914SAndroid Build Coastguard Worker }
1285*2e9d4914SAndroid Build Coastguard Worker 
1286*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1287*2e9d4914SAndroid Build Coastguard Worker 
operator --()1288*2e9d4914SAndroid Build Coastguard Worker SettingIterator& SettingIterator::operator--()
1289*2e9d4914SAndroid Build Coastguard Worker {
1290*2e9d4914SAndroid Build Coastguard Worker   --_idx;
1291*2e9d4914SAndroid Build Coastguard Worker 
1292*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1293*2e9d4914SAndroid Build Coastguard Worker }
1294*2e9d4914SAndroid Build Coastguard Worker 
1295*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1296*2e9d4914SAndroid Build Coastguard Worker 
operator --(int)1297*2e9d4914SAndroid Build Coastguard Worker SettingIterator SettingIterator::operator--(int)
1298*2e9d4914SAndroid Build Coastguard Worker {
1299*2e9d4914SAndroid Build Coastguard Worker   SettingIterator tmp(*this);
1300*2e9d4914SAndroid Build Coastguard Worker   --_idx;
1301*2e9d4914SAndroid Build Coastguard Worker 
1302*2e9d4914SAndroid Build Coastguard Worker   return(tmp);
1303*2e9d4914SAndroid Build Coastguard Worker }
1304*2e9d4914SAndroid Build Coastguard Worker 
1305*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1306*2e9d4914SAndroid Build Coastguard Worker 
operator +(int offset) const1307*2e9d4914SAndroid Build Coastguard Worker SettingIterator SettingIterator::operator+(int offset) const
1308*2e9d4914SAndroid Build Coastguard Worker {
1309*2e9d4914SAndroid Build Coastguard Worker   SettingIterator copy(*this);
1310*2e9d4914SAndroid Build Coastguard Worker   copy += offset;
1311*2e9d4914SAndroid Build Coastguard Worker 
1312*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1313*2e9d4914SAndroid Build Coastguard Worker }
1314*2e9d4914SAndroid Build Coastguard Worker 
1315*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1316*2e9d4914SAndroid Build Coastguard Worker 
operator +=(int offset)1317*2e9d4914SAndroid Build Coastguard Worker SettingIterator& SettingIterator::operator+=(int offset)
1318*2e9d4914SAndroid Build Coastguard Worker {
1319*2e9d4914SAndroid Build Coastguard Worker   _idx += offset;
1320*2e9d4914SAndroid Build Coastguard Worker 
1321*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1322*2e9d4914SAndroid Build Coastguard Worker }
1323*2e9d4914SAndroid Build Coastguard Worker 
1324*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1325*2e9d4914SAndroid Build Coastguard Worker 
operator +(int offset,SettingIterator & si)1326*2e9d4914SAndroid Build Coastguard Worker SettingIterator operator+(int offset, SettingIterator& si)
1327*2e9d4914SAndroid Build Coastguard Worker {
1328*2e9d4914SAndroid Build Coastguard Worker   SettingIterator copy(si);
1329*2e9d4914SAndroid Build Coastguard Worker   copy += offset;
1330*2e9d4914SAndroid Build Coastguard Worker 
1331*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1332*2e9d4914SAndroid Build Coastguard Worker }
1333*2e9d4914SAndroid Build Coastguard Worker 
1334*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1335*2e9d4914SAndroid Build Coastguard Worker 
operator -(int offset) const1336*2e9d4914SAndroid Build Coastguard Worker SettingIterator SettingIterator::operator-(int offset) const
1337*2e9d4914SAndroid Build Coastguard Worker {
1338*2e9d4914SAndroid Build Coastguard Worker   SettingIterator copy(*this);
1339*2e9d4914SAndroid Build Coastguard Worker   copy._idx -= offset;
1340*2e9d4914SAndroid Build Coastguard Worker 
1341*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1342*2e9d4914SAndroid Build Coastguard Worker }
1343*2e9d4914SAndroid Build Coastguard Worker 
1344*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1345*2e9d4914SAndroid Build Coastguard Worker 
operator -=(int offset)1346*2e9d4914SAndroid Build Coastguard Worker SettingIterator& SettingIterator::operator-=(int offset)
1347*2e9d4914SAndroid Build Coastguard Worker {
1348*2e9d4914SAndroid Build Coastguard Worker   _idx -= offset;
1349*2e9d4914SAndroid Build Coastguard Worker 
1350*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1351*2e9d4914SAndroid Build Coastguard Worker }
1352*2e9d4914SAndroid Build Coastguard Worker 
1353*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1354*2e9d4914SAndroid Build Coastguard Worker 
operator -(SettingIterator const & other) const1355*2e9d4914SAndroid Build Coastguard Worker int SettingIterator::operator-(SettingIterator const &other) const
1356*2e9d4914SAndroid Build Coastguard Worker {
1357*2e9d4914SAndroid Build Coastguard Worker   return(_idx - other._idx);
1358*2e9d4914SAndroid Build Coastguard Worker }
1359*2e9d4914SAndroid Build Coastguard Worker 
1360*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1361*2e9d4914SAndroid Build Coastguard Worker 
SettingConstIterator(const Setting & setting,bool endIterator)1362*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator::SettingConstIterator(const Setting &setting,
1363*2e9d4914SAndroid Build Coastguard Worker                                            bool endIterator)
1364*2e9d4914SAndroid Build Coastguard Worker   : _setting(&setting),
1365*2e9d4914SAndroid Build Coastguard Worker     _count(setting.getLength()),
1366*2e9d4914SAndroid Build Coastguard Worker     _idx(endIterator ? _count : 0)
1367*2e9d4914SAndroid Build Coastguard Worker {
1368*2e9d4914SAndroid Build Coastguard Worker   if(!setting.isAggregate())
1369*2e9d4914SAndroid Build Coastguard Worker     throw SettingTypeException(setting);
1370*2e9d4914SAndroid Build Coastguard Worker }
1371*2e9d4914SAndroid Build Coastguard Worker 
1372*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1373*2e9d4914SAndroid Build Coastguard Worker 
SettingConstIterator(const SettingConstIterator & other)1374*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator::SettingConstIterator(const SettingConstIterator &other)
1375*2e9d4914SAndroid Build Coastguard Worker   : _setting(other._setting),
1376*2e9d4914SAndroid Build Coastguard Worker     _count(other._count),
1377*2e9d4914SAndroid Build Coastguard Worker     _idx(other._idx)
1378*2e9d4914SAndroid Build Coastguard Worker {
1379*2e9d4914SAndroid Build Coastguard Worker }
1380*2e9d4914SAndroid Build Coastguard Worker 
1381*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1382*2e9d4914SAndroid Build Coastguard Worker 
operator =(const SettingConstIterator & other)1383*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& SettingConstIterator::operator=(
1384*2e9d4914SAndroid Build Coastguard Worker   const SettingConstIterator &other)
1385*2e9d4914SAndroid Build Coastguard Worker {
1386*2e9d4914SAndroid Build Coastguard Worker   _setting = other._setting;
1387*2e9d4914SAndroid Build Coastguard Worker   _count = other._count;
1388*2e9d4914SAndroid Build Coastguard Worker   _idx = other._idx;
1389*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1390*2e9d4914SAndroid Build Coastguard Worker }
1391*2e9d4914SAndroid Build Coastguard Worker 
1392*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1393*2e9d4914SAndroid Build Coastguard Worker 
operator ++()1394*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& SettingConstIterator::operator++()
1395*2e9d4914SAndroid Build Coastguard Worker {
1396*2e9d4914SAndroid Build Coastguard Worker   ++_idx;
1397*2e9d4914SAndroid Build Coastguard Worker 
1398*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1399*2e9d4914SAndroid Build Coastguard Worker }
1400*2e9d4914SAndroid Build Coastguard Worker 
1401*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1402*2e9d4914SAndroid Build Coastguard Worker 
operator ++(int)1403*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator SettingConstIterator::operator++(int)
1404*2e9d4914SAndroid Build Coastguard Worker {
1405*2e9d4914SAndroid Build Coastguard Worker   SettingConstIterator tmp(*this);
1406*2e9d4914SAndroid Build Coastguard Worker   ++_idx;
1407*2e9d4914SAndroid Build Coastguard Worker 
1408*2e9d4914SAndroid Build Coastguard Worker   return(tmp);
1409*2e9d4914SAndroid Build Coastguard Worker }
1410*2e9d4914SAndroid Build Coastguard Worker 
1411*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1412*2e9d4914SAndroid Build Coastguard Worker 
operator --()1413*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& SettingConstIterator::operator--()
1414*2e9d4914SAndroid Build Coastguard Worker {
1415*2e9d4914SAndroid Build Coastguard Worker   --_idx;
1416*2e9d4914SAndroid Build Coastguard Worker 
1417*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1418*2e9d4914SAndroid Build Coastguard Worker }
1419*2e9d4914SAndroid Build Coastguard Worker 
1420*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1421*2e9d4914SAndroid Build Coastguard Worker 
operator --(int)1422*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator SettingConstIterator::operator--(int)
1423*2e9d4914SAndroid Build Coastguard Worker {
1424*2e9d4914SAndroid Build Coastguard Worker   SettingConstIterator tmp(*this);
1425*2e9d4914SAndroid Build Coastguard Worker   --_idx;
1426*2e9d4914SAndroid Build Coastguard Worker 
1427*2e9d4914SAndroid Build Coastguard Worker   return(tmp);
1428*2e9d4914SAndroid Build Coastguard Worker }
1429*2e9d4914SAndroid Build Coastguard Worker 
1430*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1431*2e9d4914SAndroid Build Coastguard Worker 
operator +(int offset) const1432*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator SettingConstIterator::operator+(int offset) const
1433*2e9d4914SAndroid Build Coastguard Worker {
1434*2e9d4914SAndroid Build Coastguard Worker   SettingConstIterator copy(*this);
1435*2e9d4914SAndroid Build Coastguard Worker   copy += offset;
1436*2e9d4914SAndroid Build Coastguard Worker 
1437*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1438*2e9d4914SAndroid Build Coastguard Worker }
1439*2e9d4914SAndroid Build Coastguard Worker 
1440*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1441*2e9d4914SAndroid Build Coastguard Worker 
operator +=(int offset)1442*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& SettingConstIterator::operator+=(int offset)
1443*2e9d4914SAndroid Build Coastguard Worker {
1444*2e9d4914SAndroid Build Coastguard Worker   _idx += offset;
1445*2e9d4914SAndroid Build Coastguard Worker 
1446*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1447*2e9d4914SAndroid Build Coastguard Worker }
1448*2e9d4914SAndroid Build Coastguard Worker 
1449*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1450*2e9d4914SAndroid Build Coastguard Worker 
operator +(int offset,SettingConstIterator & si)1451*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator operator+(int offset, SettingConstIterator &si)
1452*2e9d4914SAndroid Build Coastguard Worker {
1453*2e9d4914SAndroid Build Coastguard Worker   SettingConstIterator copy(si);
1454*2e9d4914SAndroid Build Coastguard Worker   copy += offset;
1455*2e9d4914SAndroid Build Coastguard Worker 
1456*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1457*2e9d4914SAndroid Build Coastguard Worker }
1458*2e9d4914SAndroid Build Coastguard Worker 
1459*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1460*2e9d4914SAndroid Build Coastguard Worker 
operator -(int offset) const1461*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator SettingConstIterator::operator-(int offset) const
1462*2e9d4914SAndroid Build Coastguard Worker {
1463*2e9d4914SAndroid Build Coastguard Worker   SettingConstIterator copy(*this);
1464*2e9d4914SAndroid Build Coastguard Worker   copy -= offset;
1465*2e9d4914SAndroid Build Coastguard Worker 
1466*2e9d4914SAndroid Build Coastguard Worker   return(copy);
1467*2e9d4914SAndroid Build Coastguard Worker }
1468*2e9d4914SAndroid Build Coastguard Worker 
1469*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1470*2e9d4914SAndroid Build Coastguard Worker 
operator -=(int offset)1471*2e9d4914SAndroid Build Coastguard Worker SettingConstIterator& SettingConstIterator::operator-=(int offset)
1472*2e9d4914SAndroid Build Coastguard Worker {
1473*2e9d4914SAndroid Build Coastguard Worker   _idx -= offset;
1474*2e9d4914SAndroid Build Coastguard Worker 
1475*2e9d4914SAndroid Build Coastguard Worker   return(*this);
1476*2e9d4914SAndroid Build Coastguard Worker }
1477*2e9d4914SAndroid Build Coastguard Worker 
1478*2e9d4914SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
1479*2e9d4914SAndroid Build Coastguard Worker 
operator -(SettingConstIterator const & other) const1480*2e9d4914SAndroid Build Coastguard Worker int SettingConstIterator::operator-(SettingConstIterator const &other) const
1481*2e9d4914SAndroid Build Coastguard Worker {
1482*2e9d4914SAndroid Build Coastguard Worker   return(_idx - other._idx);
1483*2e9d4914SAndroid Build Coastguard Worker }
1484*2e9d4914SAndroid Build Coastguard Worker 
1485*2e9d4914SAndroid Build Coastguard Worker 
1486*2e9d4914SAndroid Build Coastguard Worker } // namespace libconfig
1487*2e9d4914SAndroid Build Coastguard Worker 
1488