Ariles
writer.h
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2019 Alexander Sherikov, Licensed under the Apache License, Version 2.0.
6  (see @ref LICENSE or http://www.apache.org/licenses/LICENSE-2.0)
7 
8  @brief
9 */
10 
11 #pragma once
12 
13 #include <string>
14 #include <vector>
15 #include <utility>
16 #include <boost/lexical_cast.hpp>
17 
18 
19 namespace ariles2
20 {
21  namespace ns_namevalue
22  {
23  typedef std::pair<std::string, double> NameValuePair;
24 
25 
26  template <class t_NameValuePair>
28  {
29  };
30 
31 
32  template <>
34  {
35  public:
36  static inline std::string &name(NameValuePair &pair)
37  {
38  return (pair.first);
39  }
40 
41  static inline double &value(NameValuePair &pair)
42  {
43  return (pair.second);
44  }
45  };
46 
47 
48  /**
49  * @brief Configuration writer class
50  */
51  template <class t_NameValuePair>
53  {
54  protected:
56 
57 
58  protected:
59  std::vector<NodeWrapper> node_stack_;
60  std::size_t reserve_;
61 
62  std::vector<t_NameValuePair> buffer_name_value_pairs_;
63 
65 
66 
67  public:
68  std::vector<t_NameValuePair> *name_value_pairs_;
69  std::size_t index_;
70 
71 
72  protected:
73  void expand()
74  {
75  if (index_ == name_value_pairs_->size())
76  {
77  name_value_pairs_->resize(name_value_pairs_->size() + 1);
78  }
79  }
80 
81  void expandReserve(const std::size_t size)
82  {
83  reserve_ += size;
84  name_value_pairs_->reserve(reserve_);
85  }
86 
87  void clear()
88  {
89  name_value_pairs_->clear();
90  }
91 
92 
93  public:
94  explicit GenericWriter(const std::size_t reserve = 0)
95  {
96  name_value_pairs_ = &buffer_name_value_pairs_;
97 
98  if (reserve > 0)
99  {
100  expandReserve(reserve);
101  }
102  reset();
103  }
104 
105 
106  explicit GenericWriter(std::vector<t_NameValuePair> *name_value_pairs, const std::size_t reserve = 0)
107  {
108  name_value_pairs_ = name_value_pairs;
109 
110  if (reserve > 0)
111  {
112  expandReserve(reserve);
113  }
114  reset();
115  }
116 
117 
118  void flush()
119  {
120  }
121 
122 
123  void reset(const bool initialize_structure = true)
124  {
125  if (true == initialize_structure)
126  {
127  clear();
128  }
129  initialize_structure_ = initialize_structure;
130  index_ = 0;
131  reserve_ = 0;
132  }
133 
134 
135  virtual void startMap(const Parameters &, const std::size_t num_entries)
136  {
137  if (true == initialize_structure_)
138  {
139  expandReserve(num_entries);
140  }
141  }
142 
143  virtual void startMapEntry(const std::string &map_name)
144  {
145  if (true == initialize_structure_)
146  {
147  if (0 == node_stack_.size())
148  {
149  node_stack_.push_back(map_name);
150  }
151  else
152  {
153  if (true == node_stack_.back().isArray())
154  {
155  std::string node = node_stack_.back().node_;
156  node += "{";
157  node += boost::lexical_cast<std::string>(node_stack_.back().index_);
158  node += "}.";
159  node += map_name;
160  node_stack_.push_back(node);
161  }
162  else
163  {
164  node_stack_.push_back(node_stack_.back().node_ + "." + map_name);
165  }
166  }
167  }
168  }
169 
170  virtual void endMapEntry()
171  {
172  if (true == initialize_structure_)
173  {
174  node_stack_.pop_back();
175  }
176  }
177 
178  virtual void endMap()
179  {
180  }
181 
182 
183  virtual bool startIteratedMap(const std::size_t /*num_entries*/, const Parameters &)
184  {
185  return (false);
186  }
187 
188  virtual void startArray(const std::size_t size, const bool /*compact*/ = false)
189  {
190  if (true == initialize_structure_)
191  {
192  expandReserve(size);
193  if (true == node_stack_.back().isArray())
194  {
195  std::string node = node_stack_.back().node_;
196  node += "_";
197  node += boost::lexical_cast<std::string>(node_stack_.back().index_);
198  node_stack_.push_back(NodeWrapper(node, 0, size));
199  }
200  else
201  {
202  node_stack_.push_back(NodeWrapper(node_stack_.back().node_, 0, size));
203  }
204  }
205  }
206 
207  virtual void endArrayElement()
208  {
209  if (true == initialize_structure_)
210  {
211  ARILES2_ASSERT(true == node_stack_.back().isArray(), "Internal error: array expected.");
212  ++node_stack_.back().index_;
213  }
214  }
215 
216  virtual void endArray()
217  {
218  if (true == initialize_structure_)
219  {
220  node_stack_.pop_back();
221  }
222  }
223 
224 
225 #define ARILES2_BASIC_TYPE(type) \
226  void writeElement(const type &element, const Parameters &) \
227  { \
228  expand(); \
229  if (true == initialize_structure_) \
230  { \
231  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) = node_stack_.back().node_; \
232  if (true == node_stack_.back().isArray()) \
233  { \
234  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += "_"; \
235  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += \
236  boost::lexical_cast<std::string>(node_stack_.back().index_); \
237  } \
238  } \
239  NameValuePairHandler<t_NameValuePair>::value((*name_value_pairs_)[index_]) = element; \
240  ++index_; \
241  }
242 
244 
245 #undef ARILES2_BASIC_TYPE
246 
247 
248  void writeElement(const std::string & /*element*/, const Parameters &)
249  {
250  }
251  };
252 
253 
255  } // namespace ns_namevalue
256 } // namespace ariles2
ariles2
Definition: basic.h:16
ariles2::ns_namevalue::GenericWriter::flush
void flush()
Flush the configuration to the output.
Definition: writer.h:118
ariles2::write::Visitor
Definition: write.h:367
ariles2::ns_namevalue::GenericWriter::initialize_structure_
bool initialize_structure_
Definition: writer.h:64
ariles2::ns_namevalue::NameValuePairHandler< NameValuePair >::value
static double & value(NameValuePair &pair)
Definition: writer.h:41
ariles2::ns_namevalue::GenericWriter::reset
void reset(const bool initialize_structure=true)
Definition: writer.h:123
ariles2::ns_namevalue::NameValuePairHandler
Definition: writer.h:27
ariles2::ns_namevalue::GenericWriter::endArray
virtual void endArray()
Definition: writer.h:216
ariles2::ns_namevalue::GenericWriter::expand
void expand()
Definition: writer.h:73
ariles2::ns_namevalue::NameValuePairHandler< NameValuePair >::name
static std::string & name(NameValuePair &pair)
Definition: writer.h:36
ariles2::ns_namevalue::GenericWriter::startMap
virtual void startMap(const Parameters &, const std::size_t num_entries)
Starts a nested map in the configuration file.
Definition: writer.h:135
ariles2::ns_namevalue::GenericWriter::NodeWrapper
serialization::Node< std::string > NodeWrapper
Definition: writer.h:55
ariles2::serialization::Base< Visitor, Parameters >::Parameters
Parameters Parameters
Definition: serialization.h:144
ariles2::ns_namevalue::GenericWriter::startMapEntry
virtual void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.h:143
ariles2::ns_namevalue::GenericWriter::GenericWriter
GenericWriter(const std::size_t reserve=0)
Definition: writer.h:94
ariles2::ns_namevalue::GenericWriter::endMap
virtual void endMap()
Ends a nested map in the configuration file.
Definition: writer.h:178
ariles2::ns_namevalue::Writer
GenericWriter< NameValuePair > Writer
Definition: writer.h:254
ariles2::ns_namevalue::GenericWriter::clear
void clear()
Definition: writer.h:87
ariles2::ns_namevalue::GenericWriter::ARILES2_MACRO_SUBSTITUTE
ARILES2_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void writeElement(const std
Definition: writer.h:243
ariles2::ns_namevalue::GenericWriter::endMapEntry
virtual void endMapEntry()
Definition: writer.h:170
ariles2::ns_namevalue::GenericWriter::GenericWriter
GenericWriter(std::vector< t_NameValuePair > *name_value_pairs, const std::size_t reserve=0)
Definition: writer.h:106
ariles2::ns_namevalue::NameValuePair
std::pair< std::string, double > NameValuePair
Definition: writer.h:23
ariles2::ns_namevalue::GenericWriter::index_
std::size_t index_
Definition: writer.h:69
ARILES2_VISIBILITY_ATTRIBUTE
#define ARILES2_VISIBILITY_ATTRIBUTE
Definition: helpers.h:138
ariles2::ns_namevalue::GenericWriter::endArrayElement
virtual void endArrayElement()
Definition: writer.h:207
ariles2::ns_namevalue::GenericWriter::startIteratedMap
virtual bool startIteratedMap(const std::size_t, const Parameters &)
Definition: writer.h:183
ariles2::ns_msgpack::NodeWrapper
serialization::Node< const ::msgpack::object * > NodeWrapper
Definition: reader.cpp:23
ariles2::ns_namevalue::GenericWriter
Configuration writer class.
Definition: writer.h:52
ariles2::ns_namevalue::GenericWriter::buffer_name_value_pairs_
std::vector< t_NameValuePair > buffer_name_value_pairs_
Definition: writer.h:62
ariles2::ns_namevalue::GenericWriter::startArray
virtual void startArray(const std::size_t size, const bool=false)
Definition: writer.h:188
ariles2::ns_namevalue::GenericWriter::node_stack_
std::vector< NodeWrapper > node_stack_
Definition: writer.h:59
ariles2::serialization::Node< std::string >
ARILES2_BASIC_NUMERIC_TYPES_LIST
#define ARILES2_BASIC_NUMERIC_TYPES_LIST
Definition: helpers.h:122
ariles2::ns_namevalue::GenericWriter::reserve_
std::size_t reserve_
Definition: writer.h:60
ariles2::ns_namevalue::GenericWriter::expandReserve
void expandReserve(const std::size_t size)
Definition: writer.h:81
ariles2::ns_namevalue::GenericWriter::name_value_pairs_
std::vector< t_NameValuePair > * name_value_pairs_
Definition: writer.h:68