summaryrefslogtreecommitdiff
path: root/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp')
-rw-r--r--TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp31
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: