Program Listing for File xml_config_parser.hpp
↰ Return to documentation for file (rcppsw/config/xml/xml_config_parser.hpp
)
#pragma once
/*******************************************************************************
* Includes
******************************************************************************/
#include "rcppsw/er/client.hpp"
#include "rcppsw/config/base_parser.hpp"
#include "rcppsw/config/xml/ticpp.hpp"
/*******************************************************************************
* Namespaces/Decls
******************************************************************************/
namespace rcppsw::config {
struct base_config;
}
namespace rcppsw::config::xml {
/*******************************************************************************
* Macros
******************************************************************************/
#define XML_PARSE_ATTR(node, container, name) \
this->node_attr_get((node), #name, (container)->name)
#define XML_PARSE_ATTR_DFLT(node, container, name, dflt) \
this->node_attr_get((node), #name, (container)->name, dflt)
/*******************************************************************************
* Class Definitions
******************************************************************************/
class xml_config_parser : public rer::client<xml_config_parser>,
public rconfig::base_parser {
public:
xml_config_parser(void);
~xml_config_parser(void) override = default;
virtual std::string xml_root(void) const = 0;
virtual void parse(const ticpp::Element& node) = 0;
ticpp::Element& node_get(const ticpp::Element& node,
const std::string& tag) const RCPPSW_COLD;
template <typename T>
RCPPSW_COLD void node_attr_get(const ticpp::Element& node,
const std::string& attr,
T& buf) const {
node.GetAttribute(attr, &buf, true);
}
void node_attr_get(const ticpp::Element& node,
const std::string& attr,
bool& buf) const RCPPSW_COLD;
template <typename T,
typename U = T,
RCPPSW_SFINAE_DECLDEF(!std::is_same<T, bool>::value)>
RCPPSW_COLD void node_attr_get(const ticpp::Element& node,
const std::string& attr,
T& buf,
const T& dflt) const {
node.GetAttributeOrDefault(attr, &buf, dflt);
}
template <typename T,
typename U = T,
RCPPSW_SFINAE_DECLDEF(std::is_same<U, bool>::value)>
RCPPSW_COLD void node_attr_get(const ticpp::Element& node,
const std::string& attr,
T& buf,
const T& dflt) const {
if (!node.HasAttribute(attr)) {
buf = dflt;
return;
}
node_attr_get(node, attr, buf);
}
};
} /* namespace rcppsw::config::xml */