18template <
typename Iterator>
93 std::uncaught_exceptions() == 0)
96 "This child, returned by getAllChildren(), has not been "
120 error(
"Key <" + param +
"> has not been found");
125 T
const& default_value)
const
132 return default_value;
137 std::string
const& param)
const
146 std::string
const& param, T* )
const
150 return p->getValue<T>();
158 std::string
const& param, std::vector<T>* )
const
162 std::string
const raw = p->getValue<std::string>();
164 std::size_t bad_idx = 0;
172 "' not convertible to a vector of the desired type."
173 " Could not convert token no. " +
174 std::to_string(bad_idx) +
".");
183 std::string
const& param)
const
188 auto p =
tree_->equal_range(param);
198 if (
auto p =
tree_->get_child_optional(param))
202 return p->get_value<T>();
204 catch (boost::property_tree::ptree_bad_data
const&)
207 "' not convertible to the desired type.");
212 error(
"Key <" + param +
"> has not been found");
221 error(
"The data of this subtree has already been read.");
226 if (
auto v =
tree_->get_value_optional<T>())
231 "' is not convertible to the desired type.");
242 error(
"Did not find XML attribute with name '" + attr +
"'.");
247 T
const& default_value)
const
254 return default_value;
259 std::string
const& attr)
const
264 if (
auto attrs =
tree_->get_child_optional(
"<xmlattr>"))
266 if (
auto a = attrs->get_child_optional(attr))
269 if (
auto v = a->get_value_optional<T>())
271 return std::make_optional(*v);
273 error(
"Value for XML attribute '" + attr +
"' `" +
275 "' not convertible to the desired type.");
285 bool const peek_only)
const
287 auto const type = std::type_index(
typeid(T));
294 auto& v = p.first->second;
304 error(
"There already was an attempt to obtain key <" + key +
306 "' (now: '" + type.name() +
"').");
310 return p.first->second;
Child(Child &&other) noexcept
Child(Child const &)=delete
ConfigTree const * operator->() const
ConfigTree const & operator*() const
T peekConfigParameter(std::string const ¶m) const
void checkUniqueAttr(std::string const &attr) const
Asserts that the attribute attr has not been read yet.
std::map< KeyType, CountType > visited_params_
static std::string shortString(std::string const &s)
returns a short string at suitable for error/warning messages
void error(std::string const &message) const
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
std::optional< T > getConfigParameterOptional(std::string const ¶m) const
void checkUnique(std::string const &key) const
Asserts that the key has not been read yet.
T getConfigParameter(std::string const ¶m) const
T getConfigAttribute(std::string const &attr) const
Attr
Used to indicate if dealing with XML tags or XML attributes.
CountType & markVisited(std::string const &key, Attr const is_attr, bool peek_only) const
std::optional< T > getConfigParameterOptionalImpl(std::string const ¶m, T *) const
Default implementation of reading a value of type T.
Range< ValueIterator< T > > getConfigParameterList(std::string const ¶m) const
std::optional< T > getConfigAttributeOptional(std::string const &attr) const
PTree const * tree_
The wrapped tree.
void checkKeyname(std::string const &key) const
Checks if key complies with the rules [a-z0-9_].
Wraps a pair of iterators for use as a range in range-based for-loops.
Range(Iterator begin, Iterator end)
std::string demangle(const char *mangled_name)
std::optional< std::vector< T > > tryParseVector(std::string const &raw, std::size_t *bad_token_idx)