Settings.h
1/*
2 * Copyright (C) 2005-2010 by Dr. Marc Boris Duerner
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * As a special exception, you may use this file as part of a free
10 * software library without restriction. Specifically, if other files
11 * instantiate templates or use macros or inline functions from this
12 * file, or you compile this file and link it with other files to
13 * produce an executable, this file does not by itself cause the
14 * resulting executable to be covered by the GNU General Public
15 * License. This exception does not however invalidate any other
16 * reasons why the executable file might be covered by the GNU Library
17 * General Public License.
18 *
19 * This library is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Lesser General Public License for more details.
23 *
24 * You should have received a copy of the GNU Lesser General Public
25 * License along with this library; if not, write to the Free Software
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 */
28#ifndef Pt_Settings_h
29#define Pt_Settings_h
30
31#include <Pt/Api.h>
32#include <Pt/SerializationInfo.h>
33#include <string>
34#include <cstddef>
35
36namespace Pt {
37
42class PT_API SettingsError : public SerializationError
43{
44 public:
47 SettingsError(const char* what, std::size_t line);
48
52 {}
53
56 std::size_t line() const
57 { return _line; }
58
59 private:
61 std::size_t _line;
62};
63
134class PT_API Settings : private SerializationInfo
135{
136 public:
139 class Entry
140 {
141 public:
142 explicit Entry(SerializationInfo* si = 0)
143 : _si(si)
144 {}
145
146 Entry(const Entry& entry)
147 : _si(entry._si)
148 {}
149
150 Entry& operator=(const Entry& entry)
151 {
152 _si = entry._si;
153 return *this;
154 }
155
158 template <typename T>
159 bool get(T& value) const
160 {
161 if( ! _si )
162 return false;
163
164 *_si >>= value;
165 return true;
166 }
167
170 template <typename T>
171 void set(const T& value)
172 {
173 if( _si )
174 {
175 _si->setVoid();
176 *_si <<= value;
177 }
178 }
179
182 Entry addEntry(const std::string& name)
183 {
184 if( ! _si )
185 return Entry();
186
187 SerializationInfo& si = _si->addMember(name);
188 return Entry(&si);
189 }
190
193 Entry addEntry(const char* name)
194 {
195 if( ! _si )
196 return Entry();
197
198 SerializationInfo& si = _si->addMember(name);
199 return Entry(&si);
200 }
201
204 Entry addEntry()
205 {
206 if( ! _si )
207 return Entry();
208
209 SerializationInfo& si = _si->addElement();
210 return Entry(&si);
211 }
212
215 void removeEntry(const std::string& name)
216 {
217 if( _si )
218 _si->removeMember(name);
219 }
220
223 void removeEntry(const char* name)
224 {
225 if( _si )
226 _si->removeMember(name);
227 }
228
231 void removeEntry(const Entry& e)
232 {
233 if( ! _si || ! e._si )
234 return;
235
236 _si->removeMember( *e._si );
237 }
238
241 Entry begin() const
242 {
243 if( ! _si )
244 return this->end();
245
247 if( it == _si->end() )
248 return this->end();
249
250 SerializationInfo& si = *it;
251 return Entry(&si);
252 }
253
256 Entry end() const
257 {
258 return Entry();
259 }
260
263 Entry entry(const std::string& name) const
264 {
265 if( ! _si )
266 return this->end();
267
268 SerializationInfo* si = _si->findMember(name);
269 return Entry(si);
270 }
271
274 Entry entry(const char* name) const
275 {
276 if( ! _si )
277 return this->end();
278
279 SerializationInfo* si = _si->findMember(name);
280 return Entry(si);
281 }
282
285 Entry makeEntry(const char* name)
286 {
287 if( ! _si )
288 return this->end();
289
290 SerializationInfo* si = _si->findMember(name);
291 if( ! si )
292 si = &_si->addMember(name);
293
294 return Entry(si);
295 }
296
299 Entry makeEntry(const std::string& name)
300 {
301 if( ! _si )
302 return this->end();
303
304 SerializationInfo* si = _si->findMember(name);
305 if( ! si )
306 si = &_si->addMember(name);
307
308 return Entry(si);
309 }
310
313 Entry operator[] (const std::string& name) const
314 {
315 return this->entry(name);
316 }
317
320 Entry operator[] (const char* name) const
321 {
322 return this->entry(name);
323 }
324
327 const char* name() const
328 { return _si->name(); }
329
332 Entry& operator*()
333 { return *this; }
334
337 Entry* operator->()
338 { return this; }
339
342 Entry& operator++()
343 {
344 _si = _si->sibling();
345 return *this;
346 }
347
350 bool operator!=(const Entry& other) const
351 { return _si != other._si; }
352
355 bool operator==(const Entry& other) const
356 { return _si == other._si; }
357
360 bool operator!() const
361 { return _si == 0; }
362
363 private:
365 };
366
369 class ConstEntry
370 {
371 public:
372 explicit ConstEntry(const SerializationInfo* si = 0)
373 : _si(si)
374 {}
375
378 template <typename T>
379 bool get(T& value) const
380 {
381 if( ! _si )
382 return false;
383
384 *_si >>= value;
385 return true;
386 }
387
390 ConstEntry begin() const
391 {
392 if( ! _si )
393 return this->end();
394
396 if(it == _si->end())
397 return this->end();
398
399 const SerializationInfo& si = *it;
400 return ConstEntry(&si);
401 }
402
405 ConstEntry end() const
406 {
407 return ConstEntry();
408 }
409
412 ConstEntry entry(const std::string& name) const
413 {
414 if( ! _si )
415 return end();
416
417 const SerializationInfo* si = _si->findMember(name);
418 return ConstEntry(si);
419 }
420
423 ConstEntry entry(const char* name) const
424 {
425 if( ! _si )
426 return end();
427
428 const SerializationInfo* si = _si->findMember(name);
429 return ConstEntry(si);
430 }
431
434 ConstEntry operator[] (const std::string& name) const
435 {
436 return this->entry(name);
437 }
438
441 ConstEntry operator[] (const char* name) const
442 {
443 return this->entry(name);
444 }
445
448 const char* name() const
449 { return _si->name(); }
450
453 const ConstEntry& operator*() const
454 { return *this; }
455
458 const ConstEntry* operator->() const
459 { return this; }
460
463 ConstEntry& operator++()
464 {
465 _si = _si->sibling();
466 return *this;
467 }
468
471 bool operator!=(const ConstEntry& other) const
472 { return _si != other._si; }
473
476 bool operator==(const ConstEntry& other) const
477 { return _si == other._si; }
478
481 bool operator!() const
482 { return _si == 0; }
483
484 private:
485 const SerializationInfo* _si;
486 };
487
488 public:
492
495 void clear();
496
499 bool isEmpty() const;
500
503 void setName(const char* name);
504
508 { return root().begin(); }
509
513 { return root().end(); }
514
518 { return ConstEntry(this); }
519
523 { return root().begin(); }
524
528 { return root().end(); }
529
533 { return Entry(this); }
534
537 void load(std::basic_istream<Pt::Char>& is);
538
541 void load(Pt::Formatter& formatter);
542
545 void save(std::basic_ostream<Pt::Char>& os) const;
546
549 void save(Pt::Formatter& formatter) const;
550
553 ConstEntry entry(const std::string& name) const
554 {
555 return root().entry(name);
556 }
557
560 ConstEntry entry(const char* name) const
561 {
562 return root().entry(name);
563 }
564
567 ConstEntry operator[] (const std::string& name) const
568 {
569 return this->entry(name);
570 }
571
574 ConstEntry operator[] (const char* name) const
575 {
576 return this->entry(name);
577 }
578
581 Entry entry(const std::string& name)
582 {
583 SerializationInfo* si = this->findMember(name);
584 return Entry(si);
585 }
586
589 Entry entry(const char* name)
590 {
591 SerializationInfo* si = this->findMember(name);
592 return Entry(si);
593 }
594
597 Entry addEntry(const char* name)
598 {
599 return root().addEntry(name);
600 }
601
604 Entry addEntry(const std::string& name)
605 {
606 return root().addEntry(name);
607 }
608
611 Entry makeEntry(const char* name)
612 {
613 return root().makeEntry(name);
614 }
615
618 Entry makeEntry(const std::string& name)
619 {
620 return root().makeEntry(name);
621 }
622
625 void removeEntry(const char* name)
626 {
627 root().removeEntry(name);
628 }
629
632 void removeEntry(const std::string& name)
633 {
634 root().removeEntry(name);
635 }
636
639 Entry operator[] (const std::string& name)
640 {
641 return this->entry(name);
642 }
643
646 Entry operator[] (const char* name)
647 {
648 return this->entry(name);
649 }
650};
651
652} // namespace Pt
653
654#endif
Support for serialization to different formats.
Definition Formatter.h:46
SerializationError(const std::string &msg)
Construct with message.
Const forward iterator for child elements.
Definition SerializationInfo.h:783
Forward Iterator for child elements.
Definition SerializationInfo.h:738
const SerializationInfo * findMember(const std::string &name) const
Find a struct member.
Definition SerializationInfo.h:508
Iterator begin()
Returns an iterator to the begin of child elements.
Iterator end()
Returns an iterator to the end of child elements.
Definition SerializationInfo.h:826
const char * name() const
Returns the instance name.
Definition SerializationInfo.h:237
SerializationInfo()
Default constructor.
Definition SerializationInfo.h:93
SerializationInfo & addMember(const std::string &name)
Add a struct member.
Definition SerializationInfo.h:449
SettingsError(const char *what, std::size_t line)
Constructs with a message and the line of the error.
~SettingsError()
Destructor.
Definition Settings.h:51
std::size_t line() const
Returns the line number where the error occured.
Definition Settings.h:56
Constant settings entry.
Definition Settings.h:370
ConstEntry & operator++()
Allows using the entry like an iterator.
Definition Settings.h:463
bool operator==(const ConstEntry &other) const
Allows using the entry like an iterator.
Definition Settings.h:476
bool get(T &value) const
Gets the value.
Definition Settings.h:379
ConstEntry entry(const char *name) const
Returns a sub entry.
Definition Settings.h:423
const ConstEntry & operator*() const
Allows using the entry like an iterator.
Definition Settings.h:453
const ConstEntry * operator->() const
Allows using the entry like an iterator.
Definition Settings.h:458
bool operator!() const
Returns true if entry is invalid.
Definition Settings.h:481
ConstEntry entry(const std::string &name) const
Returns a sub entry.
Definition Settings.h:412
const char * name() const
Returns the entry name.
Definition Settings.h:448
ConstEntry end() const
End of sub entries.
Definition Settings.h:405
bool operator!=(const ConstEntry &other) const
Allows using the entry like an iterator.
Definition Settings.h:471
ConstEntry begin() const
Begin of sub entries.
Definition Settings.h:390
Modifiable settings entry.
Definition Settings.h:140
Entry * operator->()
Allows using the entry like an iterator.
Definition Settings.h:337
Entry begin() const
Begin of sub entries.
Definition Settings.h:241
Entry & operator++()
Allows using the entry like an iterator.
Definition Settings.h:342
bool get(T &value) const
Gets the value.
Definition Settings.h:159
Entry addEntry(const std::string &name)
Adds a sub entry.
Definition Settings.h:182
bool operator!=(const Entry &other) const
Allows using the entry like an iterator.
Definition Settings.h:350
bool operator==(const Entry &other) const
Allows using the entry like an iterator.
Definition Settings.h:355
bool operator!() const
Returns true if entry is invalid.
Definition Settings.h:360
void removeEntry(const char *name)
Removes a sub entry.
Definition Settings.h:223
void removeEntry(const Entry &e)
Removes a sub entry.
Definition Settings.h:231
Entry & operator*()
Allows using the entry like an iterator.
Definition Settings.h:332
Entry addEntry(const char *name)
Adds a sub entry.
Definition Settings.h:193
const char * name() const
Returns the entry name.
Definition Settings.h:327
void removeEntry(const std::string &name)
Removes a sub entry.
Definition Settings.h:215
Entry end() const
End of sub entries.
Definition Settings.h:256
Entry entry(const char *name) const
Returns a sub entry.
Definition Settings.h:274
Entry addEntry()
Adds a sub entry.
Definition Settings.h:204
void set(const T &value)
Sets the value.
Definition Settings.h:171
Entry makeEntry(const std::string &name)
Returns a sub entry.
Definition Settings.h:299
Entry entry(const std::string &name) const
Returns a sub entry.
Definition Settings.h:263
Entry makeEntry(const char *name)
Returns a sub entry.
Definition Settings.h:285
void save(Pt::Formatter &formatter) const
Saves settings using a formatter.
ConstEntry entry(const char *name) const
Returns a top level entry.
Definition Settings.h:560
Entry addEntry(const std::string &name)
Adds a top level entry.
Definition Settings.h:604
ConstEntry root() const
Returns the root entry.
Definition Settings.h:517
void removeEntry(const char *name)
Removes a top level entry.
Definition Settings.h:625
Entry begin()
Begin of entries.
Definition Settings.h:522
ConstEntry entry(const std::string &name) const
Returns a top level entry.
Definition Settings.h:553
Entry addEntry(const char *name)
Adds a top level entry.
Definition Settings.h:597
Entry entry(const char *name)
Returns a top level entry.
Definition Settings.h:589
void removeEntry(const std::string &name)
Removes a top level entry.
Definition Settings.h:632
Entry end()
End of entries.
Definition Settings.h:527
ConstEntry end() const
End of entries.
Definition Settings.h:512
void save(std::basic_ostream< Pt::Char > &os) const
Saves settings to a output stream.
void load(Pt::Formatter &formatter)
Loads settings using a formatter.
void setName(const char *name)
Sets the name of the settings root.
Entry makeEntry(const std::string &name)
Makes a top level entry.
Definition Settings.h:618
void clear()
Clears the settings.
bool isEmpty() const
Returns true if settings are empty.
Entry entry(const std::string &name)
Returns a top level entry.
Definition Settings.h:581
Settings()
Default constructor.
Entry root()
Returns the root entry.
Definition Settings.h:532
void load(std::basic_istream< Pt::Char > &is)
Loads settings from a input stream.
ConstEntry begin() const
Begin of entries.
Definition Settings.h:507
Entry makeEntry(const char *name)
Makes a top level entry.
Definition Settings.h:611
Core module.
Definition Allocator.h:33