Ariles
Loading...
Searching...
No Matches
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
19namespace 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;
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 {
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 (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_),
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 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