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 ariles
20 {
21  namespace ns_array
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 
119  {
120  static serialization::Features parameters;
121  return (parameters);
122  }
123 
124 
125  void flush()
126  {
127  }
128 
129 
130  void reset(const bool initialize_structure = true)
131  {
132  if (true == initialize_structure)
133  {
134  clear();
135  }
136  initialize_structure_ = initialize_structure;
137  index_ = 0;
138  reserve_ = 0;
139  }
140 
141 
142  virtual void descend(const std::string &map_name)
143  {
144  if (true == initialize_structure_)
145  {
146  if (0 == node_stack_.size())
147  {
148  node_stack_.push_back(map_name);
149  }
150  else
151  {
152  if (true == node_stack_.back().isArray())
153  {
154  std::string node = node_stack_.back().node_;
155  node += "{";
156  node += boost::lexical_cast<std::string>(node_stack_.back().index_);
157  node += "}.";
158  node += map_name;
159  node_stack_.push_back(node);
160  }
161  else
162  {
163  node_stack_.push_back(node_stack_.back().node_ + "." + map_name);
164  }
165  }
166  }
167  }
168 
169  virtual void ascend()
170  {
171  if (true == initialize_structure_)
172  {
173  node_stack_.pop_back();
174  }
175  }
176 
177 
178  virtual void startMap(const std::size_t num_entries)
179  {
180  if (true == initialize_structure_)
181  {
182  expandReserve(num_entries);
183  }
184  }
185 
186  virtual void endMap()
187  {
188  }
189 
190 
191  virtual void startArray(const std::size_t size, const bool compact = false)
192  {
193  if (true == initialize_structure_)
194  {
195  expandReserve(size);
196  if (true == node_stack_.back().isArray())
197  {
198  std::string node = node_stack_.back().node_;
199  node += "_";
200  node += boost::lexical_cast<std::string>(node_stack_.back().index_);
201  node_stack_.push_back(NodeWrapper(node, 0, size, compact));
202  }
203  else
204  {
205  node_stack_.push_back(NodeWrapper(node_stack_.back().node_, 0, size));
206  }
207  }
208  }
209 
210  virtual void shiftArray()
211  {
212  if (true == initialize_structure_)
213  {
214  ARILES_ASSERT(true == node_stack_.back().isArray(), "Internal error: array expected.");
215  ++node_stack_.back().index_;
216  }
217  }
218 
219  virtual void endArray()
220  {
221  if (true == initialize_structure_)
222  {
223  node_stack_.pop_back();
224  }
225  }
226 
227 
228 #define ARILES_BASIC_TYPE(type) \
229  void writeElement(const type &element) \
230  { \
231  expand(); \
232  if (true == initialize_structure_) \
233  { \
234  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) = node_stack_.back().node_; \
235  if (true == node_stack_.back().isArray()) \
236  { \
237  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += "_"; \
238  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += \
239  boost::lexical_cast<std::string>(node_stack_.back().index_); \
240  } \
241  } \
242  NameValuePairHandler<t_NameValuePair>::value((*name_value_pairs_)[index_]) = element; \
243  ++index_; \
244  }
245 
247 
248 #undef ARILES_BASIC_TYPE
249 
250 
251  void writeElement(const std::string & /*element*/)
252  {
253  }
254  };
255 
256 
258  } // namespace ns_array
259 } // namespace ariles
ARILES_MACRO_SUBSTITUTE(ARILES_BASIC_NUMERIC_TYPES_LIST) void writeElement(const std
Definition: writer.h:246
void flush()
Flush the configuration to the output.
Definition: writer.h:125
Configuration writer class.
Definition: writer.h:52
void reset(const bool initialize_structure=true)
Definition: writer.h:130
std::vector< NodeWrapper > node_stack_
Definition: writer.h:59
std::vector< t_NameValuePair > * name_value_pairs_
Definition: writer.h:68
virtual void shiftArray()
Definition: writer.h:210
virtual void startMap(const std::size_t num_entries)
Starts a nested map in the configuration file.
Definition: writer.h:178
static double & value(NameValuePair &pair)
Definition: writer.h:41
GenericWriter(std::vector< t_NameValuePair > *name_value_pairs, const std::size_t reserve=0)
Definition: writer.h:106
static std::string & name(NameValuePair &pair)
Definition: writer.h:36
GenericWriter< NameValuePair > Writer
Definition: writer.h:257
const serialization::Features & getSerializationFeatures() const
Definition: writer.h:118
std::pair< std::string, double > NameValuePair
Definition: writer.h:23
virtual void descend(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.h:142
virtual void startArray(const std::size_t size, const bool compact=false)
Definition: writer.h:191
GenericWriter(const std::size_t reserve=0)
Definition: writer.h:94
void expandReserve(const std::size_t size)
Definition: writer.h:81
virtual void endMap()
Ends a nested map in the configuration file.
Definition: writer.h:186
ariles::Node< const ::msgpack::object * > NodeWrapper
Definition: reader.cpp:23
#define ARILES_BASIC_NUMERIC_TYPES_LIST
Definition: helpers.h:100
#define ARILES_VISIBILITY_ATTRIBUTE
Definition: helpers.h:69
ariles::Node< std::string > NodeWrapper
Definition: writer.h:55
std::vector< t_NameValuePair > buffer_name_value_pairs_
Definition: writer.h:62
Definition: basic.h:17