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 */