Ariles
writer.cpp
Go to the documentation of this file.
1 /**
2  @file
3  @author Alexander Sherikov
4 
5  @copyright 2018-2024 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 
12 
13 #include <boost/lexical_cast.hpp>
14 
15 
16 namespace ariles2
17 {
18  namespace ns_namevalue2
19  {
20  Writer::Writer(const std::shared_ptr<NameValueContainer> &container, const std::size_t reserve)
21  {
22  name_value_pairs_ = container;
23  name_value_pairs_->reserve(reserve);
24  initialize_names_ = true;
25  index_ = 0;
26  }
27 
28  void Writer::startRoot(const std::string &name, const Writer::Parameters &param)
29  {
31  if (not param.persistent_structure_ or 0 == name_value_pairs_->size())
32  {
33  initialize_names_ = true;
34  }
35 
36  if (not name.empty())
37  {
38  startMapEntry(name);
39  }
40  }
41 
43  {
45  {
46  // drop trailing leftovers
47  name_value_pairs_->resize(index_);
48  initialize_names_ = false;
49  }
50  index_ = 0;
51  }
52 
53 
54  void Writer::startMap(const Writer::Parameters &, const std::size_t num_entries)
55  {
57  {
58  name_value_pairs_->reserve(index_ + num_entries);
59  }
60  }
61 
62  void Writer::startMapEntry(const std::string &map_name)
63  {
65  {
66  if (empty())
67  {
68  emplace(map_name);
69  }
70  else
71  {
72  if (back().isArray())
73  {
76  boost::lexical_cast<std::string>(back().index_),
78  separator_,
79  map_name);
80  }
81  else
82  {
84  }
85  }
86  }
87  }
88 
90  {
92  {
93  pop();
94  }
95  }
96 
98  {
99  }
100 
101 
102  bool Writer::startIteratedMap(const std::size_t /*num_entries*/, const Writer::Parameters &)
103  {
104  return (false);
105  }
106 
107  void Writer::startArray(const std::size_t size, const bool /*compact*/)
108  {
109  if (initialize_names_)
110  {
111  name_value_pairs_->reserve(index_ + size);
112  if (back().isArray())
113  {
114  emplace(concatWithNode(std::string("_"), boost::lexical_cast<std::string>(back().index_)), 0, size);
115  }
116  else
117  {
118  emplace(back().node_, 0, size);
119  }
120  }
121  }
122 
124  {
125  if (initialize_names_)
126  {
127  shiftArray();
128  }
129  }
130 
132  {
133  if (initialize_names_)
134  {
135  pop();
136  }
137  }
138 
139 
140 #define ARILES2_BASIC_TYPE(type) \
141  void Writer::writeElement(const type &element, const Writer::Parameters &) \
142  { \
143  if (index_ == name_value_pairs_->size()) \
144  { \
145  name_value_pairs_->resize(index_ + 1); \
146  } \
147  if (initialize_names_) \
148  { \
149  name_value_pairs_->name(index_) = back().node_; \
150  if (back().isArray()) \
151  { \
152  name_value_pairs_->name(index_) += "_"; \
153  name_value_pairs_->name(index_) += boost::lexical_cast<std::string>(back().index_); \
154  } \
155  } \
156  name_value_pairs_->value(index_) = element; \
157  ++index_; \
158  }
159 
161 
162 #undef ARILES2_BASIC_TYPE
163 
164 
165  void Writer::writeElement(const std::string &element, const Writer::Parameters &parameters)
166  {
167  writeElement(element.size(), parameters);
168  }
169 
171  {
172  static Writer::Parameters parameters(/*override_parameters=*/true);
173 
174  parameters.sloppy_maps_ = true;
175  parameters.sloppy_pairs_ = true;
176  parameters.explicit_matrix_size_ = false;
177  parameters.fallback_to_string_floats_ = false;
178  parameters.flat_matrices_ = false;
179  parameters.allow_missing_entries_ = true;
180 
181  parameters.persistent_structure_ = false;
182 
183  return parameters;
184  }
185  } // namespace ns_namevalue2
186 } // namespace ariles2
void flush()
Flush the configuration to the output.
Definition: writer.cpp:42
virtual void endMap()
Ends a nested map in the configuration file.
Definition: writer.cpp:97
virtual void startArray(const std::size_t size, const bool=false)
Definition: writer.cpp:107
const std::string bracket_right_
Definition: namevalue2.h:61
const std::string separator_
Definition: namevalue2.h:59
const std::string bracket_left_
Definition: namevalue2.h:60
virtual void startMap(const Parameters &, const std::size_t num_entries)
Starts a nested map in the configuration file.
Definition: writer.cpp:54
virtual void endMapEntry()
Definition: writer.cpp:89
virtual void endArrayElement()
Definition: writer.cpp:123
virtual bool startIteratedMap(const std::size_t, const Parameters &)
Definition: writer.cpp:102
std::shared_ptr< NameValueContainer > name_value_pairs_
Definition: namevalue2.h:57
virtual void startRoot(const std::string &name, const Parameters &param)
Definition: writer.cpp:28
virtual void startMapEntry(const std::string &map_name)
Starts a nested map in the configuration file.
Definition: writer.cpp:62
Writer(const std::shared_ptr< NameValueContainer > &container, const std::size_t reserve=0)
Definition: writer.cpp:20
virtual const t_Parameters & getDefaultParameters() const
Definition: common.h:52
t_Parameters Parameters
Definition: common.h:49
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
CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void Writer
Definition: writer.cpp:160
Definition: basic.h:17
std::string reserve(t_String &&...strings)
Definition: concat.h:31
#define CPPUT_TRACE_FUNCTION
Definition: trace.h:126