diff options
Diffstat (limited to 'TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp')
-rw-r--r-- | TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp b/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp index 4b440803a0f..b12fda738d2 100644 --- a/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp +++ b/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp @@ -145,6 +145,35 @@ namespace XSCRT std::basic_string<C> ns_prefix (std::basic_string<C> const& ns, Element<C> const& e); + // Casting helpers, made necessary by the Xerces project's braindead + // avoidance of RTTI. + template <typename DERIVED> struct dom_traits; + + // Specializations for different node types + template <> + struct dom_traits<xercesc::DOMElement *> + { + enum { node_type = xercesc::DOMNode::ELEMENT_NODE }; + }; + + template <> + struct dom_traits<xercesc::DOMAttr *> + { + enum { node_type = xercesc::DOMNode::ATTRIBUTE_NODE }; + }; + + template <typename DERIVED_PTR> + DERIVED_PTR dom_cast (xercesc::DOMNode *node) + { + DERIVED_PTR elem = 0; + if ((node != 0) && + (node->getNodeType () == dom_traits<DERIVED_PTR>::node_type)) + { + elem = reinterpret_cast <DERIVED_PTR> (node); + } + return elem; + } + template <typename C> class Element { @@ -221,7 +250,7 @@ namespace XSCRT Element<C> parent () const { - return dynamic_cast<xercesc::DOMElement const*>(ce_->getParentNode ()); + return dom_cast <xercesc::DOMElement const*>(ce_->getParentNode ()); } public: |