inicpp
C++ parser of INI files with schema validation.
section.h
1 #ifndef INICPP_SECTION_H
2 #define INICPP_SECTION_H
3 
4 #include <algorithm>
5 #include <iostream>
6 #include <iterator>
7 #include <map>
8 #include <vector>
9 
10 #include "dll.h"
11 #include "exception.h"
12 #include "option.h"
13 #include "section_schema.h"
14 
15 namespace inicpp
16 {
18  class section_schema;
20  template <typename Element> class section_iterator;
21 
22 
27  class INICPP_API section
28  {
29  private:
30  using options_vector = std::vector<std::shared_ptr<option>>;
31  using options_map = std::map<std::string, std::shared_ptr<option>>;
32  using options_map_pair = std::pair<std::string, std::shared_ptr<option>>;
33 
35  options_vector options_;
37  options_map options_map_;
39  std::string name_;
40 
41  friend class section_iterator<option>;
42  friend class section_iterator<const option>;
43 
44  public:
49 
53  section() = delete;
57  section(const section &source);
61  section &operator=(const section &source);
65  section(section &&source);
69  section &operator=(section &&source);
70 
75  section(const std::string &name);
76 
81  const std::string &get_name() const;
82 
89  template <typename ValueType> void add_option(const std::string &option_name, ValueType value)
90  {
91  auto add_it = options_map_.find(option_name);
92  if (add_it == options_map_.end()) {
93  std::shared_ptr<option> opt = std::make_shared<option>(option_name);
94  opt->set<ValueType>(value);
95  options_.push_back(opt);
96  options_map_.insert(options_map_pair(opt->get_name(), opt));
97  } else {
98  throw ambiguity_exception(option_name);
99  }
100  }
106  void add_option(const option &opt);
112  void remove_option(const std::string &option_name);
113 
118  size_t size() const;
125  option &operator[](size_t index);
132  const option &operator[](size_t index) const;
139  option &operator[](const std::string &option_name);
146  const option &operator[](const std::string &option_name) const;
152  bool contains(const std::string &option_name) const;
153 
160  void validate(const section_schema &sect_schema, schema_mode mode);
161 
167  bool operator==(const section &other) const;
173  bool operator!=(const section &other) const;
174 
179  iterator begin();
184  iterator end();
189  const_iterator begin() const;
194  const_iterator end() const;
199  const_iterator cbegin() const;
204  const_iterator cend() const;
205 
212  INICPP_API friend std::ostream &operator<<(std::ostream &os, const section &sect);
213  };
214 
215  INICPP_API std::ostream &operator<<(std::ostream &os, const section &sect);
216 
222  template <typename Element> class section_iterator : public std::iterator<std::random_access_iterator_tag, Element>
223  {
224  private:
226  section &container_;
228  size_t position_;
229 
230  public:
231  using typename std::iterator<std::random_access_iterator_tag, Element>::reference;
232  using typename std::iterator<std::random_access_iterator_tag, Element>::pointer;
233 
237  section_iterator() = delete;
241  section_iterator(const section_iterator &source) = default;
245  section_iterator &operator=(const section_iterator &source) = default;
249  section_iterator(section_iterator &&source) = default;
253  section_iterator &operator=(section_iterator &&source) = default;
254 
261  section_iterator(section &source, size_t position) : container_(source), position_(position)
262  {
263  }
269  {
270  }
271 
277  {
278  ++position_;
279  return *this;
280  }
286  {
287  section_iterator old(*this);
288  operator++();
289  return old;
290  }
291 
297  bool operator==(const section_iterator &second) const
298  {
299  return &container_ == &second.container_ && position_ == second.position_;
300  }
306  bool operator!=(const section_iterator &second) const
307  {
308  return !(*this == second);
309  }
310 
315  reference operator*()
316  {
317  return *container_.options_.at(position_);
318  }
319 
324  pointer operator->()
325  {
326  return &(operator*());
327  }
328  };
329 }
330 
331 #endif
reference operator*()
Definition: section.h:315
Definition: config.h:15
bool operator==(const section_iterator &second) const
Definition: section.h:297
bool operator!=(const section_iterator &second) const
Definition: section.h:306
void add_option(const std::string &option_name, ValueType value)
Definition: section.h:89
section_iterator & operator++()
Definition: section.h:276
section_iterator(section &source)
Definition: section.h:268
section_iterator(section &source, size_t position)
Definition: section.h:261
section_iterator operator++(int)
Definition: section.h:285