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  using NameValuePair = std::pair<std::string, double>;
24 
25 
26  template <class t_NameValuePair>
28  {
29  };
30 
31 
32  template <>
34  {
35  public:
36  static inline std::string &name(NameValuePair &pair) // cppcheck-suppress constParameter
37  {
38  return (pair.first);
39  }
40 
41  static inline double &value(NameValuePair &pair) // cppcheck-suppress constParameter
42  {
43  return (pair.second);
44  }
45  };
46 
47 
48  /**
49  * @brief Configuration writer class
50  */
51  template <class t_NameValuePair>
53  public serialization::NodeStackBase<serialization::Node<std::string>>
54  {
55  protected:
56  std::size_t reserve_;
57 
58  std::vector<t_NameValuePair> buffer_name_value_pairs_;
59 
61 
62  const std::string separator_ = ".";
63  const std::string bracket_left_ = "{";
64  const std::string bracket_right_ = "}";
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  {
97 
98  if (reserve > 0)
99  {
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  {
113  }
114  reset();
115  }
116 
117 
118  void flush()
119  {
120  }
121 
122 
123  void reset(const bool initialize_structure = true)
124  {
125  if (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  {
138  {
139  expandReserve(num_entries);
140  }
141  }
142 
143  virtual void startMapEntry(const std::string &map_name)
144  {
146  {
147  if (empty())
148  {
149  emplace(map_name);
150  }
151  else
152  {
153  if (back().isArray())
154  {
157  boost::lexical_cast<std::string>(back().index_),
159  separator_,
160  map_name);
161  }
162  else
163  {
165  }
166  }
167  }
168  }
169 
170  virtual void endMapEntry()
171  {
173  {
174  pop();
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  {
191  {
192  expandReserve(size);
193  if (back().isArray())
194  {
195  emplace(concatWithNode(std::string("_"), boost::lexical_cast<std::string>(back().index_)),
196  0,
197  size);
198  }
199  else
200  {
201  emplace(back().node_, 0, size);
202  }
203  }
204  }
205 
206  virtual void endArrayElement()
207  {
209  {
210  shiftArray();
211  }
212  }
213 
214  virtual void endArray()
215  {
217  {
218  pop();
219  }
220  }
221 
222 
223 #define ARILES2_BASIC_TYPE(type) \
224  void writeElement(const type &element, const Parameters &) \
225  { \
226  expand(); \
227  if (initialize_structure_) \
228  { \
229  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) = back().node_; \
230  if (back().isArray()) \
231  { \
232  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += "_"; \
233  NameValuePairHandler<t_NameValuePair>::name((*name_value_pairs_)[index_]) += \
234  boost::lexical_cast<std::string>(back().index_); \
235  } \
236  } \
237  NameValuePairHandler<t_NameValuePair>::value((*name_value_pairs_)[index_]) = element; \
238  ++index_; \
239  }
240 
242 
243 #undef ARILES2_BASIC_TYPE
244 
245 
246  void writeElement(const std::string & /*element*/, const Parameters &)
247  {
248  }
249  };
250 
251 
253  } // namespace ns_namevalue
254 } // namespace ariles2
Configuration writer class.
Definition: writer.h:54
CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void writeElement(const std
Definition: writer.h:241
virtual void startArray(const std::size_t size, const bool=false)
Definition: writer.h:188
void expandReserve(const std::size_t size)
Definition: writer.h:81
const std::string bracket_left_
Definition: writer.h:63
const std::string separator_
Definition: writer.h:62
const std::string bracket_right_
Definition: writer.h:64
virtual void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.h:143
std::vector< t_NameValuePair > buffer_name_value_pairs_
Definition: writer.h:58
std::vector< t_NameValuePair > * name_value_pairs_
Definition: writer.h:68
void reset(const bool initialize_structure=true)
Definition: writer.h:123
virtual void startMap(const Parameters &, const std::size_t num_entries)
Starts a nested map in the configuration file.
Definition: writer.h:135
GenericWriter(std::vector< t_NameValuePair > *name_value_pairs, const std::size_t reserve=0)
Definition: writer.h:106
void flush()
Flush the configuration to the output.
Definition: writer.h:118
virtual void endMap()
Ends a nested map in the configuration file.
Definition: writer.h:178
virtual bool startIteratedMap(const std::size_t, const Parameters &)
Definition: writer.h:183
GenericWriter(const std::size_t reserve=0)
Definition: writer.h:94
static std::string & name(NameValuePair &pair)
Definition: writer.h:36
static double & value(NameValuePair &pair)
Definition: writer.h:41
void writeElement(const std::complex< t_Scalar > &entry, const Parameters &param)
Definition: write.h:264
#define ARILES2_BASIC_NUMERIC_TYPES_LIST
Definition: helpers.h:63
std::pair< std::string, double > NameValuePair
Definition: writer.h:23
Definition: basic.h:17
std::string reserve(t_String &&...strings)
Definition: concat.h:31