Ariles
Loading...
Searching...
No Matches
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
16namespace 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
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_),
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 {
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 {
126 {
127 shiftArray();
128 }
129 }
130
132 {
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 endArrayElement()
Definition writer.cpp:123
virtual bool startIteratedMap(const std::size_t, const Parameters &)
Definition writer.cpp:102
virtual CPPUT_MACRO_SUBSTITUTE(ARILES2_BASIC_NUMERIC_TYPES_LIST) void writeElement(const std const Parameters & getDefaultParameters() const
Definition writer.cpp:170
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
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
#define CPPUT_MACRO_SUBSTITUTE(macro)
Definition misc.h:21
#define CPPUT_TRACE_FUNCTION
Definition trace.h:126