Files
geant4/source/analysis/g4tools/include/tools/xml/element
T
2016-06-10 14:11:04 +02:00

146 lines
3.3 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_xml_element
#define tools_xml_element
#include "../srep"
#include "../sto"
#include "../scast"
#ifdef TOOLS_MEM
#include "../mem"
#include "../S_STRING"
#endif
namespace tools {
namespace xml {
class ielem {
public:
virtual ~ielem(){}
public:
virtual void* cast(cid) const = 0;
};
class element : public virtual ielem {
#ifdef TOOLS_MEM
TOOLS_SCLASS(tools::xml::element)
#endif
public:
static cid id_class() {return 0;}
virtual void* cast(cid a_class) const {
if(void* p = cmp_cast<element>(this,a_class)) {return p;}
else return 0;
}
public:
typedef std::pair<std::string,std::string> atb;
public:
element(const std::string& a_name,
const std::vector<atb>& a_atbs,
const std::string& a_value){
#ifdef TOOLS_MEM
mem::increment(s_class().c_str());
#endif
m_name = a_name;
m_atbs = a_atbs;
m_value = a_value;
}
virtual ~element(){
#ifdef TOOLS_MEM
mem::decrement(s_class().c_str());
#endif
}
public:
element(const element& a_from)
:ielem(a_from) {
#ifdef TOOLS_MEM
mem::increment(s_class().c_str());
#endif
m_name = a_from.m_name;
m_atbs = a_from.m_atbs;
m_value = a_from.m_value;
}
element& operator=(const element& a_from) {
m_name = a_from.m_name;
m_atbs = a_from.m_atbs;
m_value = a_from.m_value;
return *this;
}
public:
const std::string& name() const {return m_name;}
const std::vector<atb>& attributes() const {return m_atbs;}
const std::string& value() const {return m_value;}
void set_value(const std::string& a_value) {m_value = a_value;}
bool is_attribute(const std::string& a_name) const {
tools_vforcit(atb,m_atbs,it) {
if((*it).first==a_name) return true;
}
return false;
}
void add_attribute(const std::string& a_name,const std::string& a_value){
// No check is done about an existing a_name.
m_atbs.push_back(atb(a_name,a_value));
}
bool attribute_value(const std::string& a_atb,std::string& a_value) const {
tools_vforcit(atb,m_atbs,it) {
if((*it).first==a_atb) {
a_value = (*it).second;
return true;
}
}
a_value.clear();
return false;
}
template <class T>
bool attribute_value(const std::string& a_atb,T& a_value) const {
std::string sv;
if(!attribute_value(a_atb,sv)) {a_value=T();return false;}
return to<T>(sv,a_value);
}
bool set_attribute_value(const std::string& a_atb,const std::string& a_value) {
tools_vforit(atb,m_atbs,it) {
if((*it).first==a_atb) {
(*it).second = a_value;
return true;
}
}
// Not found, add one :
m_atbs.push_back(atb(a_atb,a_value));
return true;
}
void remove_attributes(const std::string& a_atb) {
std::vector<atb>::iterator it;
for(it=m_atbs.begin();it!=m_atbs.end();) {
if((*it).first==a_atb) {
it = m_atbs.erase(it);
} else {
++it;
}
}
}
void replace(const std::string& a_old,const std::string& a_new) {
// Used by the obuild template system.
tools_vforit(atb,m_atbs,it) {
tools::replace((*it).second,a_old,a_new);
}
tools::replace(m_value,a_old,a_new);
}
protected:
std::string m_name;
std::vector<atb> m_atbs;
std::string m_value;
};
}}
#endif