xref: /aosp_15_r20/external/libconfig/lib/libconfig.h++ (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#ifndef __libconfig_hpp
24*2e9d4914SAndroid Build Coastguard Worker#define __libconfig_hpp
25*2e9d4914SAndroid Build Coastguard Worker
26*2e9d4914SAndroid Build Coastguard Worker#include <stdio.h>
27*2e9d4914SAndroid Build Coastguard Worker#include <exception>
28*2e9d4914SAndroid Build Coastguard Worker#include <string>
29*2e9d4914SAndroid Build Coastguard Worker
30*2e9d4914SAndroid Build Coastguard Worker#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
31*2e9d4914SAndroid Build Coastguard Worker#if defined(LIBCONFIGXX_STATIC)
32*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API
33*2e9d4914SAndroid Build Coastguard Worker#elif defined(LIBCONFIGXX_EXPORTS)
34*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API __declspec(dllexport)
35*2e9d4914SAndroid Build Coastguard Worker#else /* ! LIBCONFIGXX_EXPORTS */
36*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API __declspec(dllimport)
37*2e9d4914SAndroid Build Coastguard Worker#endif /* LIBCONFIGXX_STATIC */
38*2e9d4914SAndroid Build Coastguard Worker#else /* ! WIN32 */
39*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_API
40*2e9d4914SAndroid Build Coastguard Worker#endif /* WIN32 */
41*2e9d4914SAndroid Build Coastguard Worker
42*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_MAJOR    1
43*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_MINOR    7
44*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_VER_REVISION 0
45*2e9d4914SAndroid Build Coastguard Worker
46*2e9d4914SAndroid Build Coastguard Worker#if __cplusplus < 201103L
47*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_NOEXCEPT throw()
48*2e9d4914SAndroid Build Coastguard Worker#else
49*2e9d4914SAndroid Build Coastguard Worker#define LIBCONFIGXX_NOEXCEPT noexcept
50*2e9d4914SAndroid Build Coastguard Worker#endif
51*2e9d4914SAndroid Build Coastguard Worker
52*2e9d4914SAndroid Build Coastguard Workerstruct config_t; // fwd decl
53*2e9d4914SAndroid Build Coastguard Workerstruct config_setting_t; // fwd decl
54*2e9d4914SAndroid Build Coastguard Worker
55*2e9d4914SAndroid Build Coastguard Workernamespace libconfig {
56*2e9d4914SAndroid Build Coastguard Worker
57*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API ConfigException : public std::exception { };
58*2e9d4914SAndroid Build Coastguard Worker
59*2e9d4914SAndroid Build Coastguard Workerclass Setting; // fwd decl
60*2e9d4914SAndroid Build Coastguard Workerclass SettingIterator;
61*2e9d4914SAndroid Build Coastguard Workerclass SettingConstIterator;
62*2e9d4914SAndroid Build Coastguard Worker
63*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingException : public ConfigException
64*2e9d4914SAndroid Build Coastguard Worker{
65*2e9d4914SAndroid Build Coastguard Worker  public:
66*2e9d4914SAndroid Build Coastguard Worker
67*2e9d4914SAndroid Build Coastguard Worker  SettingException(const Setting &setting);
68*2e9d4914SAndroid Build Coastguard Worker  SettingException(const Setting &setting, int idx);
69*2e9d4914SAndroid Build Coastguard Worker  SettingException(const Setting &setting, const char *name);
70*2e9d4914SAndroid Build Coastguard Worker  SettingException(const char *path);
71*2e9d4914SAndroid Build Coastguard Worker
72*2e9d4914SAndroid Build Coastguard Worker  SettingException(const SettingException &other);
73*2e9d4914SAndroid Build Coastguard Worker  SettingException& operator=(const SettingException &other);
74*2e9d4914SAndroid Build Coastguard Worker
75*2e9d4914SAndroid Build Coastguard Worker  virtual ~SettingException() LIBCONFIGXX_NOEXCEPT;
76*2e9d4914SAndroid Build Coastguard Worker
77*2e9d4914SAndroid Build Coastguard Worker  const char *getPath() const;
78*2e9d4914SAndroid Build Coastguard Worker
79*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
80*2e9d4914SAndroid Build Coastguard Worker
81*2e9d4914SAndroid Build Coastguard Worker  private:
82*2e9d4914SAndroid Build Coastguard Worker
83*2e9d4914SAndroid Build Coastguard Worker  char *_path;
84*2e9d4914SAndroid Build Coastguard Worker};
85*2e9d4914SAndroid Build Coastguard Worker
86*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingTypeException : public SettingException
87*2e9d4914SAndroid Build Coastguard Worker{
88*2e9d4914SAndroid Build Coastguard Worker  public:
89*2e9d4914SAndroid Build Coastguard Worker
90*2e9d4914SAndroid Build Coastguard Worker  SettingTypeException(const Setting &setting);
91*2e9d4914SAndroid Build Coastguard Worker  SettingTypeException(const Setting &setting, int idx);
92*2e9d4914SAndroid Build Coastguard Worker  SettingTypeException(const Setting &setting, const char *name);
93*2e9d4914SAndroid Build Coastguard Worker
94*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
95*2e9d4914SAndroid Build Coastguard Worker};
96*2e9d4914SAndroid Build Coastguard Worker
97*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingNotFoundException : public SettingException
98*2e9d4914SAndroid Build Coastguard Worker{
99*2e9d4914SAndroid Build Coastguard Worker  public:
100*2e9d4914SAndroid Build Coastguard Worker
101*2e9d4914SAndroid Build Coastguard Worker  SettingNotFoundException(const char *path);
102*2e9d4914SAndroid Build Coastguard Worker  SettingNotFoundException(const Setting &setting, int idx);
103*2e9d4914SAndroid Build Coastguard Worker  SettingNotFoundException(const Setting &setting, const char *name);
104*2e9d4914SAndroid Build Coastguard Worker
105*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
106*2e9d4914SAndroid Build Coastguard Worker};
107*2e9d4914SAndroid Build Coastguard Worker
108*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingNameException : public SettingException
109*2e9d4914SAndroid Build Coastguard Worker{
110*2e9d4914SAndroid Build Coastguard Worker  public:
111*2e9d4914SAndroid Build Coastguard Worker
112*2e9d4914SAndroid Build Coastguard Worker  SettingNameException(const Setting &setting, const char *name);
113*2e9d4914SAndroid Build Coastguard Worker
114*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
115*2e9d4914SAndroid Build Coastguard Worker};
116*2e9d4914SAndroid Build Coastguard Worker
117*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API FileIOException : public ConfigException
118*2e9d4914SAndroid Build Coastguard Worker{
119*2e9d4914SAndroid Build Coastguard Worker  public:
120*2e9d4914SAndroid Build Coastguard Worker
121*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
122*2e9d4914SAndroid Build Coastguard Worker};
123*2e9d4914SAndroid Build Coastguard Worker
124*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API ParseException : public ConfigException
125*2e9d4914SAndroid Build Coastguard Worker{
126*2e9d4914SAndroid Build Coastguard Worker  public:
127*2e9d4914SAndroid Build Coastguard Worker
128*2e9d4914SAndroid Build Coastguard Worker  ParseException(const char *file, int line, const char *error);
129*2e9d4914SAndroid Build Coastguard Worker
130*2e9d4914SAndroid Build Coastguard Worker  ParseException(const ParseException &other);
131*2e9d4914SAndroid Build Coastguard Worker
132*2e9d4914SAndroid Build Coastguard Worker  virtual ~ParseException() LIBCONFIGXX_NOEXCEPT;
133*2e9d4914SAndroid Build Coastguard Worker
134*2e9d4914SAndroid Build Coastguard Worker  inline const char *getFile() const
135*2e9d4914SAndroid Build Coastguard Worker  { return(_file); }
136*2e9d4914SAndroid Build Coastguard Worker
137*2e9d4914SAndroid Build Coastguard Worker  inline int getLine() const
138*2e9d4914SAndroid Build Coastguard Worker  { return(_line); }
139*2e9d4914SAndroid Build Coastguard Worker
140*2e9d4914SAndroid Build Coastguard Worker  inline const char *getError() const
141*2e9d4914SAndroid Build Coastguard Worker  { return(_error); }
142*2e9d4914SAndroid Build Coastguard Worker
143*2e9d4914SAndroid Build Coastguard Worker  virtual const char *what() const LIBCONFIGXX_NOEXCEPT;
144*2e9d4914SAndroid Build Coastguard Worker
145*2e9d4914SAndroid Build Coastguard Worker  private:
146*2e9d4914SAndroid Build Coastguard Worker
147*2e9d4914SAndroid Build Coastguard Worker  const char *_file;
148*2e9d4914SAndroid Build Coastguard Worker  int _line;
149*2e9d4914SAndroid Build Coastguard Worker  const char *_error;
150*2e9d4914SAndroid Build Coastguard Worker};
151*2e9d4914SAndroid Build Coastguard Worker
152*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API Setting
153*2e9d4914SAndroid Build Coastguard Worker{
154*2e9d4914SAndroid Build Coastguard Worker  friend class Config;
155*2e9d4914SAndroid Build Coastguard Worker
156*2e9d4914SAndroid Build Coastguard Worker  public:
157*2e9d4914SAndroid Build Coastguard Worker
158*2e9d4914SAndroid Build Coastguard Worker  enum Type
159*2e9d4914SAndroid Build Coastguard Worker  {
160*2e9d4914SAndroid Build Coastguard Worker    TypeNone = 0,
161*2e9d4914SAndroid Build Coastguard Worker    // scalar types
162*2e9d4914SAndroid Build Coastguard Worker    TypeInt,
163*2e9d4914SAndroid Build Coastguard Worker    TypeInt64,
164*2e9d4914SAndroid Build Coastguard Worker    TypeFloat,
165*2e9d4914SAndroid Build Coastguard Worker    TypeString,
166*2e9d4914SAndroid Build Coastguard Worker    TypeBoolean,
167*2e9d4914SAndroid Build Coastguard Worker    // aggregate types
168*2e9d4914SAndroid Build Coastguard Worker    TypeGroup,
169*2e9d4914SAndroid Build Coastguard Worker    TypeArray,
170*2e9d4914SAndroid Build Coastguard Worker    TypeList
171*2e9d4914SAndroid Build Coastguard Worker  };
172*2e9d4914SAndroid Build Coastguard Worker
173*2e9d4914SAndroid Build Coastguard Worker  enum Format
174*2e9d4914SAndroid Build Coastguard Worker  {
175*2e9d4914SAndroid Build Coastguard Worker    FormatDefault = 0,
176*2e9d4914SAndroid Build Coastguard Worker    FormatHex = 1
177*2e9d4914SAndroid Build Coastguard Worker  };
178*2e9d4914SAndroid Build Coastguard Worker
179*2e9d4914SAndroid Build Coastguard Worker  typedef SettingIterator iterator;
180*2e9d4914SAndroid Build Coastguard Worker  typedef SettingConstIterator const_iterator;
181*2e9d4914SAndroid Build Coastguard Worker
182*2e9d4914SAndroid Build Coastguard Worker  public:
183*2e9d4914SAndroid Build Coastguard Worker
184*2e9d4914SAndroid Build Coastguard Worker  virtual ~Setting();
185*2e9d4914SAndroid Build Coastguard Worker
186*2e9d4914SAndroid Build Coastguard Worker  inline Type getType() const { return(_type); }
187*2e9d4914SAndroid Build Coastguard Worker
188*2e9d4914SAndroid Build Coastguard Worker  inline Format getFormat() const { return(_format); }
189*2e9d4914SAndroid Build Coastguard Worker  void setFormat(Format format);
190*2e9d4914SAndroid Build Coastguard Worker
191*2e9d4914SAndroid Build Coastguard Worker  operator bool() const;
192*2e9d4914SAndroid Build Coastguard Worker  operator int() const;
193*2e9d4914SAndroid Build Coastguard Worker  operator unsigned int() const;
194*2e9d4914SAndroid Build Coastguard Worker  operator long() const;
195*2e9d4914SAndroid Build Coastguard Worker  operator unsigned long() const;
196*2e9d4914SAndroid Build Coastguard Worker  operator long long() const;
197*2e9d4914SAndroid Build Coastguard Worker  operator unsigned long long() const;
198*2e9d4914SAndroid Build Coastguard Worker  operator double() const;
199*2e9d4914SAndroid Build Coastguard Worker  operator float() const;
200*2e9d4914SAndroid Build Coastguard Worker  operator const char *() const;
201*2e9d4914SAndroid Build Coastguard Worker  operator std::string() const;
202*2e9d4914SAndroid Build Coastguard Worker
203*2e9d4914SAndroid Build Coastguard Worker  inline const char *c_str() const
204*2e9d4914SAndroid Build Coastguard Worker  { return operator const char *(); }
205*2e9d4914SAndroid Build Coastguard Worker
206*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(bool value);
207*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(int value);
208*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(long value);
209*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(const long long &value);
210*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(const double &value);
211*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(float value);
212*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(const char *value);
213*2e9d4914SAndroid Build Coastguard Worker  Setting & operator=(const std::string &value);
214*2e9d4914SAndroid Build Coastguard Worker
215*2e9d4914SAndroid Build Coastguard Worker  Setting & lookup(const char *path) const;
216*2e9d4914SAndroid Build Coastguard Worker  inline Setting & lookup(const std::string &path) const
217*2e9d4914SAndroid Build Coastguard Worker  { return(lookup(path.c_str())); }
218*2e9d4914SAndroid Build Coastguard Worker
219*2e9d4914SAndroid Build Coastguard Worker  Setting & operator[](const char *name) const;
220*2e9d4914SAndroid Build Coastguard Worker
221*2e9d4914SAndroid Build Coastguard Worker  inline Setting & operator[](const std::string &name) const
222*2e9d4914SAndroid Build Coastguard Worker  { return(operator[](name.c_str())); }
223*2e9d4914SAndroid Build Coastguard Worker
224*2e9d4914SAndroid Build Coastguard Worker  Setting & operator[](int index) const;
225*2e9d4914SAndroid Build Coastguard Worker
226*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, bool &value) const;
227*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, int &value) const;
228*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, unsigned int &value) const;
229*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, long long &value) const;
230*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, unsigned long long &value) const;
231*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, double &value) const;
232*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, float &value) const;
233*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, const char *&value) const;
234*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *name, std::string &value) const;
235*2e9d4914SAndroid Build Coastguard Worker
236*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, bool &value) const
237*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
238*2e9d4914SAndroid Build Coastguard Worker
239*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, int &value) const
240*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
241*2e9d4914SAndroid Build Coastguard Worker
242*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, unsigned int &value) const
243*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
244*2e9d4914SAndroid Build Coastguard Worker
245*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, long long &value) const
246*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
247*2e9d4914SAndroid Build Coastguard Worker
248*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name,
249*2e9d4914SAndroid Build Coastguard Worker                          unsigned long long &value) const
250*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
251*2e9d4914SAndroid Build Coastguard Worker
252*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, double &value) const
253*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
254*2e9d4914SAndroid Build Coastguard Worker
255*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, float &value) const
256*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
257*2e9d4914SAndroid Build Coastguard Worker
258*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, const char *&value) const
259*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
260*2e9d4914SAndroid Build Coastguard Worker
261*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &name, std::string &value) const
262*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(name.c_str(), value)); }
263*2e9d4914SAndroid Build Coastguard Worker
264*2e9d4914SAndroid Build Coastguard Worker  void remove(const char *name);
265*2e9d4914SAndroid Build Coastguard Worker
266*2e9d4914SAndroid Build Coastguard Worker  inline void remove(const std::string &name)
267*2e9d4914SAndroid Build Coastguard Worker  { remove(name.c_str()); }
268*2e9d4914SAndroid Build Coastguard Worker
269*2e9d4914SAndroid Build Coastguard Worker  void remove(unsigned int idx);
270*2e9d4914SAndroid Build Coastguard Worker
271*2e9d4914SAndroid Build Coastguard Worker  Setting & add(const char *name, Type type);
272*2e9d4914SAndroid Build Coastguard Worker
273*2e9d4914SAndroid Build Coastguard Worker  inline Setting & add(const std::string &name, Type type)
274*2e9d4914SAndroid Build Coastguard Worker  { return(add(name.c_str(), type)); }
275*2e9d4914SAndroid Build Coastguard Worker
276*2e9d4914SAndroid Build Coastguard Worker  Setting & add(Type type);
277*2e9d4914SAndroid Build Coastguard Worker
278*2e9d4914SAndroid Build Coastguard Worker  bool exists(const char *name) const;
279*2e9d4914SAndroid Build Coastguard Worker
280*2e9d4914SAndroid Build Coastguard Worker  inline bool exists(const std::string &name) const
281*2e9d4914SAndroid Build Coastguard Worker  { return(exists(name.c_str())); }
282*2e9d4914SAndroid Build Coastguard Worker
283*2e9d4914SAndroid Build Coastguard Worker  int getLength() const;
284*2e9d4914SAndroid Build Coastguard Worker  const char *getName() const;
285*2e9d4914SAndroid Build Coastguard Worker  std::string getPath() const;
286*2e9d4914SAndroid Build Coastguard Worker  int getIndex() const;
287*2e9d4914SAndroid Build Coastguard Worker
288*2e9d4914SAndroid Build Coastguard Worker  const Setting & getParent() const;
289*2e9d4914SAndroid Build Coastguard Worker  Setting & getParent();
290*2e9d4914SAndroid Build Coastguard Worker
291*2e9d4914SAndroid Build Coastguard Worker  bool isRoot() const;
292*2e9d4914SAndroid Build Coastguard Worker
293*2e9d4914SAndroid Build Coastguard Worker  inline bool isGroup() const
294*2e9d4914SAndroid Build Coastguard Worker  { return(_type == TypeGroup); }
295*2e9d4914SAndroid Build Coastguard Worker
296*2e9d4914SAndroid Build Coastguard Worker  inline bool isArray() const
297*2e9d4914SAndroid Build Coastguard Worker  { return(_type == TypeArray); }
298*2e9d4914SAndroid Build Coastguard Worker
299*2e9d4914SAndroid Build Coastguard Worker  inline bool isList() const
300*2e9d4914SAndroid Build Coastguard Worker  { return(_type == TypeList); }
301*2e9d4914SAndroid Build Coastguard Worker
302*2e9d4914SAndroid Build Coastguard Worker  inline bool isAggregate() const
303*2e9d4914SAndroid Build Coastguard Worker  { return(_type >= TypeGroup); }
304*2e9d4914SAndroid Build Coastguard Worker
305*2e9d4914SAndroid Build Coastguard Worker  inline bool isScalar() const
306*2e9d4914SAndroid Build Coastguard Worker  { return((_type > TypeNone) && (_type < TypeGroup)); }
307*2e9d4914SAndroid Build Coastguard Worker
308*2e9d4914SAndroid Build Coastguard Worker  inline bool isNumber() const
309*2e9d4914SAndroid Build Coastguard Worker  {
310*2e9d4914SAndroid Build Coastguard Worker    return((_type == TypeInt) || (_type == TypeInt64) || (_type == TypeFloat));
311*2e9d4914SAndroid Build Coastguard Worker  }
312*2e9d4914SAndroid Build Coastguard Worker
313*2e9d4914SAndroid Build Coastguard Worker  inline bool isString() const
314*2e9d4914SAndroid Build Coastguard Worker  { return(_type == TypeString); }
315*2e9d4914SAndroid Build Coastguard Worker
316*2e9d4914SAndroid Build Coastguard Worker  unsigned int getSourceLine() const;
317*2e9d4914SAndroid Build Coastguard Worker  const char *getSourceFile() const;
318*2e9d4914SAndroid Build Coastguard Worker
319*2e9d4914SAndroid Build Coastguard Worker  iterator begin();
320*2e9d4914SAndroid Build Coastguard Worker  iterator end();
321*2e9d4914SAndroid Build Coastguard Worker
322*2e9d4914SAndroid Build Coastguard Worker  const_iterator begin() const;
323*2e9d4914SAndroid Build Coastguard Worker  const_iterator end() const;
324*2e9d4914SAndroid Build Coastguard Worker
325*2e9d4914SAndroid Build Coastguard Worker  private:
326*2e9d4914SAndroid Build Coastguard Worker
327*2e9d4914SAndroid Build Coastguard Worker  config_setting_t *_setting;
328*2e9d4914SAndroid Build Coastguard Worker  Type _type;
329*2e9d4914SAndroid Build Coastguard Worker  Format _format;
330*2e9d4914SAndroid Build Coastguard Worker
331*2e9d4914SAndroid Build Coastguard Worker  Setting(config_setting_t *setting);
332*2e9d4914SAndroid Build Coastguard Worker
333*2e9d4914SAndroid Build Coastguard Worker  void assertType(Type type) const;
334*2e9d4914SAndroid Build Coastguard Worker  static Setting & wrapSetting(config_setting_t *setting);
335*2e9d4914SAndroid Build Coastguard Worker
336*2e9d4914SAndroid Build Coastguard Worker  Setting(const Setting& other); // not supported
337*2e9d4914SAndroid Build Coastguard Worker  Setting& operator=(const Setting& other); // not supported
338*2e9d4914SAndroid Build Coastguard Worker};
339*2e9d4914SAndroid Build Coastguard Worker
340*2e9d4914SAndroid Build Coastguard Worker
341*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingIterator
342*2e9d4914SAndroid Build Coastguard Worker{
343*2e9d4914SAndroid Build Coastguard Worker  public:
344*2e9d4914SAndroid Build Coastguard Worker
345*2e9d4914SAndroid Build Coastguard Worker  SettingIterator(Setting &setting, bool endIterator = false);
346*2e9d4914SAndroid Build Coastguard Worker  SettingIterator(const SettingIterator &other);
347*2e9d4914SAndroid Build Coastguard Worker  SettingIterator& operator=(const SettingIterator &other);
348*2e9d4914SAndroid Build Coastguard Worker
349*2e9d4914SAndroid Build Coastguard Worker  // Equality comparison.
350*2e9d4914SAndroid Build Coastguard Worker  inline bool operator==(SettingIterator const &other) const
351*2e9d4914SAndroid Build Coastguard Worker  { return((_setting == other._setting) && (_idx == other._idx)); }
352*2e9d4914SAndroid Build Coastguard Worker
353*2e9d4914SAndroid Build Coastguard Worker  inline bool operator!=(SettingIterator const &other) const
354*2e9d4914SAndroid Build Coastguard Worker  { return(!operator==(other)); }
355*2e9d4914SAndroid Build Coastguard Worker
356*2e9d4914SAndroid Build Coastguard Worker  bool operator<(SettingIterator const &other) const;
357*2e9d4914SAndroid Build Coastguard Worker
358*2e9d4914SAndroid Build Coastguard Worker  // Dereference operators.
359*2e9d4914SAndroid Build Coastguard Worker  inline Setting & operator*()
360*2e9d4914SAndroid Build Coastguard Worker  { return((*_setting)[_idx]); }
361*2e9d4914SAndroid Build Coastguard Worker
362*2e9d4914SAndroid Build Coastguard Worker  inline Setting * operator->()
363*2e9d4914SAndroid Build Coastguard Worker  { return(&(*_setting)[_idx]); }
364*2e9d4914SAndroid Build Coastguard Worker
365*2e9d4914SAndroid Build Coastguard Worker  inline const Setting & operator*() const
366*2e9d4914SAndroid Build Coastguard Worker  { return(*_setting)[_idx]; }
367*2e9d4914SAndroid Build Coastguard Worker  inline const Setting * operator->() const
368*2e9d4914SAndroid Build Coastguard Worker  { return(&(*_setting)[_idx]); }
369*2e9d4914SAndroid Build Coastguard Worker
370*2e9d4914SAndroid Build Coastguard Worker  // Increment and decrement operators.
371*2e9d4914SAndroid Build Coastguard Worker  SettingIterator & operator++();
372*2e9d4914SAndroid Build Coastguard Worker  SettingIterator operator++(int);
373*2e9d4914SAndroid Build Coastguard Worker
374*2e9d4914SAndroid Build Coastguard Worker  SettingIterator & operator--();
375*2e9d4914SAndroid Build Coastguard Worker  SettingIterator operator--(int);
376*2e9d4914SAndroid Build Coastguard Worker
377*2e9d4914SAndroid Build Coastguard Worker  // Arithmetic operators.
378*2e9d4914SAndroid Build Coastguard Worker  SettingIterator operator+(int offset) const;
379*2e9d4914SAndroid Build Coastguard Worker  SettingIterator & operator+=(int offset);
380*2e9d4914SAndroid Build Coastguard Worker
381*2e9d4914SAndroid Build Coastguard Worker  SettingIterator operator-(int offset) const;
382*2e9d4914SAndroid Build Coastguard Worker  SettingIterator & operator-=(int offset);
383*2e9d4914SAndroid Build Coastguard Worker
384*2e9d4914SAndroid Build Coastguard Worker  int operator-(const SettingIterator &other) const;
385*2e9d4914SAndroid Build Coastguard Worker
386*2e9d4914SAndroid Build Coastguard Worker  private:
387*2e9d4914SAndroid Build Coastguard Worker
388*2e9d4914SAndroid Build Coastguard Worker  Setting *_setting;
389*2e9d4914SAndroid Build Coastguard Worker
390*2e9d4914SAndroid Build Coastguard Worker  int _count;
391*2e9d4914SAndroid Build Coastguard Worker  int _idx;
392*2e9d4914SAndroid Build Coastguard Worker};
393*2e9d4914SAndroid Build Coastguard Worker
394*2e9d4914SAndroid Build Coastguard WorkerSettingIterator operator+(int offset, const SettingIterator &si);
395*2e9d4914SAndroid Build Coastguard Worker
396*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API SettingConstIterator
397*2e9d4914SAndroid Build Coastguard Worker{
398*2e9d4914SAndroid Build Coastguard Worker  public:
399*2e9d4914SAndroid Build Coastguard Worker
400*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator(const Setting &setting, bool endIterator = false);
401*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator(const SettingConstIterator &rhs);
402*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator& operator=(const SettingConstIterator &rhs);
403*2e9d4914SAndroid Build Coastguard Worker
404*2e9d4914SAndroid Build Coastguard Worker  // Equality comparison.
405*2e9d4914SAndroid Build Coastguard Worker  bool operator==(SettingConstIterator const &other) const
406*2e9d4914SAndroid Build Coastguard Worker  { return((_setting == other._setting) && (_idx == other._idx)); }
407*2e9d4914SAndroid Build Coastguard Worker
408*2e9d4914SAndroid Build Coastguard Worker  inline bool operator!=(SettingConstIterator const &other) const
409*2e9d4914SAndroid Build Coastguard Worker  { return(!operator==(other)); }
410*2e9d4914SAndroid Build Coastguard Worker
411*2e9d4914SAndroid Build Coastguard Worker  // Dereference operators.
412*2e9d4914SAndroid Build Coastguard Worker  inline Setting const & operator*()
413*2e9d4914SAndroid Build Coastguard Worker  { return((*_setting)[_idx]); }
414*2e9d4914SAndroid Build Coastguard Worker  inline Setting const * operator->()
415*2e9d4914SAndroid Build Coastguard Worker  { return(&(*_setting)[_idx]); }
416*2e9d4914SAndroid Build Coastguard Worker
417*2e9d4914SAndroid Build Coastguard Worker  inline const Setting& operator*() const
418*2e9d4914SAndroid Build Coastguard Worker  { return((*_setting)[_idx]); }
419*2e9d4914SAndroid Build Coastguard Worker  inline const Setting * operator->() const
420*2e9d4914SAndroid Build Coastguard Worker  { return(&(*_setting)[_idx]); }
421*2e9d4914SAndroid Build Coastguard Worker
422*2e9d4914SAndroid Build Coastguard Worker  // Increment and decrement operators.
423*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator & operator++();
424*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator operator++(int);
425*2e9d4914SAndroid Build Coastguard Worker
426*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator & operator--();
427*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator operator--(int);
428*2e9d4914SAndroid Build Coastguard Worker
429*2e9d4914SAndroid Build Coastguard Worker  // Arithmetic operators.
430*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator operator+(int offset) const;
431*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator & operator+=(int offset);
432*2e9d4914SAndroid Build Coastguard Worker
433*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator operator-(int offset) const;
434*2e9d4914SAndroid Build Coastguard Worker  SettingConstIterator & operator-=(int offset);
435*2e9d4914SAndroid Build Coastguard Worker
436*2e9d4914SAndroid Build Coastguard Worker  int operator-(const SettingConstIterator &other) const;
437*2e9d4914SAndroid Build Coastguard Worker
438*2e9d4914SAndroid Build Coastguard Worker  private:
439*2e9d4914SAndroid Build Coastguard Worker
440*2e9d4914SAndroid Build Coastguard Worker  const Setting *_setting;
441*2e9d4914SAndroid Build Coastguard Worker
442*2e9d4914SAndroid Build Coastguard Worker  int _count;
443*2e9d4914SAndroid Build Coastguard Worker  int _idx;
444*2e9d4914SAndroid Build Coastguard Worker};
445*2e9d4914SAndroid Build Coastguard Worker
446*2e9d4914SAndroid Build Coastguard WorkerSettingConstIterator operator+(int offset, const SettingConstIterator &si);
447*2e9d4914SAndroid Build Coastguard Worker
448*2e9d4914SAndroid Build Coastguard Workerclass LIBCONFIGXX_API Config
449*2e9d4914SAndroid Build Coastguard Worker{
450*2e9d4914SAndroid Build Coastguard Worker  public:
451*2e9d4914SAndroid Build Coastguard Worker
452*2e9d4914SAndroid Build Coastguard Worker  enum Option
453*2e9d4914SAndroid Build Coastguard Worker  {
454*2e9d4914SAndroid Build Coastguard Worker    OptionNone = 0,
455*2e9d4914SAndroid Build Coastguard Worker    OptionAutoConvert = 0x01,
456*2e9d4914SAndroid Build Coastguard Worker    OptionSemicolonSeparators = 0x02,
457*2e9d4914SAndroid Build Coastguard Worker    OptionColonAssignmentForGroups = 0x04,
458*2e9d4914SAndroid Build Coastguard Worker    OptionColonAssignmentForNonGroups = 0x08,
459*2e9d4914SAndroid Build Coastguard Worker    OptionOpenBraceOnSeparateLine = 0x10,
460*2e9d4914SAndroid Build Coastguard Worker    OptionAllowScientificNotation = 0x20,
461*2e9d4914SAndroid Build Coastguard Worker    OptionFsync = 0x40,
462*2e9d4914SAndroid Build Coastguard Worker    OptionAllowOverrides = 0x80
463*2e9d4914SAndroid Build Coastguard Worker  };
464*2e9d4914SAndroid Build Coastguard Worker
465*2e9d4914SAndroid Build Coastguard Worker  Config();
466*2e9d4914SAndroid Build Coastguard Worker  virtual ~Config();
467*2e9d4914SAndroid Build Coastguard Worker
468*2e9d4914SAndroid Build Coastguard Worker  void clear();
469*2e9d4914SAndroid Build Coastguard Worker
470*2e9d4914SAndroid Build Coastguard Worker  void setOptions(int options);
471*2e9d4914SAndroid Build Coastguard Worker  int getOptions() const;
472*2e9d4914SAndroid Build Coastguard Worker
473*2e9d4914SAndroid Build Coastguard Worker  void setOption(Config::Option option, bool flag);
474*2e9d4914SAndroid Build Coastguard Worker  bool getOption(Config::Option option) const;
475*2e9d4914SAndroid Build Coastguard Worker
476*2e9d4914SAndroid Build Coastguard Worker  inline void setAutoConvert(bool flag)
477*2e9d4914SAndroid Build Coastguard Worker  { setOption(Config::OptionAutoConvert, flag); }
478*2e9d4914SAndroid Build Coastguard Worker  inline bool getAutoConvert() const
479*2e9d4914SAndroid Build Coastguard Worker  { return(getOption(Config::OptionAutoConvert)); }
480*2e9d4914SAndroid Build Coastguard Worker
481*2e9d4914SAndroid Build Coastguard Worker  void setDefaultFormat(Setting::Format format);
482*2e9d4914SAndroid Build Coastguard Worker  inline Setting::Format getDefaultFormat() const
483*2e9d4914SAndroid Build Coastguard Worker  { return(_defaultFormat); }
484*2e9d4914SAndroid Build Coastguard Worker
485*2e9d4914SAndroid Build Coastguard Worker  void setTabWidth(unsigned short width);
486*2e9d4914SAndroid Build Coastguard Worker  unsigned short getTabWidth() const;
487*2e9d4914SAndroid Build Coastguard Worker
488*2e9d4914SAndroid Build Coastguard Worker  void setFloatPrecision(unsigned short digits);
489*2e9d4914SAndroid Build Coastguard Worker  unsigned short getFloatPrecision() const;
490*2e9d4914SAndroid Build Coastguard Worker
491*2e9d4914SAndroid Build Coastguard Worker  void setIncludeDir(const char *includeDir);
492*2e9d4914SAndroid Build Coastguard Worker  const char *getIncludeDir() const;
493*2e9d4914SAndroid Build Coastguard Worker
494*2e9d4914SAndroid Build Coastguard Worker  virtual const char **evaluateIncludePath(const char *path,
495*2e9d4914SAndroid Build Coastguard Worker                                           const char **error);
496*2e9d4914SAndroid Build Coastguard Worker
497*2e9d4914SAndroid Build Coastguard Worker  void read(FILE *stream);
498*2e9d4914SAndroid Build Coastguard Worker  void write(FILE *stream) const;
499*2e9d4914SAndroid Build Coastguard Worker
500*2e9d4914SAndroid Build Coastguard Worker  void readString(const char *str);
501*2e9d4914SAndroid Build Coastguard Worker  inline void readString(const std::string &str)
502*2e9d4914SAndroid Build Coastguard Worker  { return(readString(str.c_str())); }
503*2e9d4914SAndroid Build Coastguard Worker
504*2e9d4914SAndroid Build Coastguard Worker  void readFile(const char *filename);
505*2e9d4914SAndroid Build Coastguard Worker  inline void readFile(const std::string &filename)
506*2e9d4914SAndroid Build Coastguard Worker  { readFile(filename.c_str()); }
507*2e9d4914SAndroid Build Coastguard Worker
508*2e9d4914SAndroid Build Coastguard Worker  void writeFile(const char *filename);
509*2e9d4914SAndroid Build Coastguard Worker  inline void writeFile(const std::string &filename)
510*2e9d4914SAndroid Build Coastguard Worker  { writeFile(filename.c_str()); }
511*2e9d4914SAndroid Build Coastguard Worker
512*2e9d4914SAndroid Build Coastguard Worker  Setting & lookup(const char *path) const;
513*2e9d4914SAndroid Build Coastguard Worker  inline Setting & lookup(const std::string &path) const
514*2e9d4914SAndroid Build Coastguard Worker  { return(lookup(path.c_str())); }
515*2e9d4914SAndroid Build Coastguard Worker
516*2e9d4914SAndroid Build Coastguard Worker  bool exists(const char *path) const;
517*2e9d4914SAndroid Build Coastguard Worker  inline bool exists(const std::string &path) const
518*2e9d4914SAndroid Build Coastguard Worker  { return(exists(path.c_str())); }
519*2e9d4914SAndroid Build Coastguard Worker
520*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, bool &value) const;
521*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, int &value) const;
522*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, unsigned int &value) const;
523*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, long long &value) const;
524*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, unsigned long long &value) const;
525*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, double &value) const;
526*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, float &value) const;
527*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, const char *&value) const;
528*2e9d4914SAndroid Build Coastguard Worker  bool lookupValue(const char *path, std::string &value) const;
529*2e9d4914SAndroid Build Coastguard Worker
530*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, bool &value) const
531*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
532*2e9d4914SAndroid Build Coastguard Worker
533*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, int &value) const
534*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
535*2e9d4914SAndroid Build Coastguard Worker
536*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, unsigned int &value) const
537*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
538*2e9d4914SAndroid Build Coastguard Worker
539*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, long long &value) const
540*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
541*2e9d4914SAndroid Build Coastguard Worker
542*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path,
543*2e9d4914SAndroid Build Coastguard Worker                          unsigned long long &value) const
544*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
545*2e9d4914SAndroid Build Coastguard Worker
546*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, double &value) const
547*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
548*2e9d4914SAndroid Build Coastguard Worker
549*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, float &value) const
550*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
551*2e9d4914SAndroid Build Coastguard Worker
552*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, const char *&value) const
553*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
554*2e9d4914SAndroid Build Coastguard Worker
555*2e9d4914SAndroid Build Coastguard Worker  inline bool lookupValue(const std::string &path, std::string &value) const
556*2e9d4914SAndroid Build Coastguard Worker  { return(lookupValue(path.c_str(), value)); }
557*2e9d4914SAndroid Build Coastguard Worker
558*2e9d4914SAndroid Build Coastguard Worker  Setting & getRoot() const;
559*2e9d4914SAndroid Build Coastguard Worker
560*2e9d4914SAndroid Build Coastguard Worker  private:
561*2e9d4914SAndroid Build Coastguard Worker
562*2e9d4914SAndroid Build Coastguard Worker  static void ConfigDestructor(void *arg);
563*2e9d4914SAndroid Build Coastguard Worker  void handleError() const;
564*2e9d4914SAndroid Build Coastguard Worker
565*2e9d4914SAndroid Build Coastguard Worker  config_t *_config;
566*2e9d4914SAndroid Build Coastguard Worker  Setting::Format _defaultFormat;
567*2e9d4914SAndroid Build Coastguard Worker
568*2e9d4914SAndroid Build Coastguard Worker  Config(const Config& other); // not supported
569*2e9d4914SAndroid Build Coastguard Worker  Config& operator=(const Config& other); // not supported
570*2e9d4914SAndroid Build Coastguard Worker};
571*2e9d4914SAndroid Build Coastguard Worker
572*2e9d4914SAndroid Build Coastguard Worker} // namespace libconfig
573*2e9d4914SAndroid Build Coastguard Worker
574*2e9d4914SAndroid Build Coastguard Worker#endif // __libconfig_hpp
575