summaryrefslogtreecommitdiff
path: root/TAO/CIAO/tools
diff options
context:
space:
mode:
authorWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-01-13 20:41:12 +0000
committerWilliam R. Otte <wotte@dre.vanderbilt.edu>2006-01-13 20:41:12 +0000
commite8fccfeee49f9a756cfe78ca6837e4163899ab7f (patch)
tree08d2ac0c94a6bd694493c916a95956e533b1c95e /TAO/CIAO/tools
parent74c26eddd15c00f1ebd756d6a2b8b2e8280bc752 (diff)
downloadATCD-e8fccfeee49f9a756cfe78ca6837e4163899ab7f.tar.gz
Fri Jan 13 20:39:21 UTC 2006 William Otte <wotte@dre.vanderbilt.edu>
Diffstat (limited to 'TAO/CIAO/tools')
-rw-r--r--TAO/CIAO/tools/Config_Handlers/XSCRT/Parser.hpp5
-rw-r--r--TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp31
2 files changed, 32 insertions, 4 deletions
diff --git a/TAO/CIAO/tools/Config_Handlers/XSCRT/Parser.hpp b/TAO/CIAO/tools/Config_Handlers/XSCRT/Parser.hpp
index 66fd4b6db5c..5fa1e827f8d 100644
--- a/TAO/CIAO/tools/Config_Handlers/XSCRT/Parser.hpp
+++ b/TAO/CIAO/tools/Config_Handlers/XSCRT/Parser.hpp
@@ -30,8 +30,7 @@ namespace XSCRT
XML::Element<C>
next_element ()
{
- return XML::Element<C> (
- dynamic_cast<xercesc::DOMElement*> (e_->item (ei_++)));
+ return XML::Element<C> (XML::dom_cast <xercesc::DOMElement*> (e_->item (ei_++)));
}
bool
@@ -44,7 +43,7 @@ namespace XSCRT
next_attribute ()
{
return XML::Attribute<C> (
- dynamic_cast<xercesc::DOMAttr*> (a_->item (ai_++)));
+ XML::dom_cast <xercesc::DOMAttr*> (a_->item (ai_++)));
}
private:
diff --git a/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp b/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp
index 4b440803a0f..588cb61dc84 100644
--- a/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp
+++ b/TAO/CIAO/tools/Config_Handlers/XSCRT/XML.hpp
@@ -144,6 +144,35 @@ namespace XSCRT
template <typename C>
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: