Avoid redundant isElementNode() checks in Traversal<HTML*Element> / Traversal<SVG...
[WebKit-https.git] / Source / WebCore / dom / Element.h
index 74c2fbb..1e37eec 100644 (file)
@@ -670,9 +670,24 @@ inline bool isElement(const Node& node) { return node.isElementNode(); }
 
 NODE_TYPE_CASTS(Element)
 
-template <typename Type> bool isElementOfType(const Element&);
-template <typename Type> inline bool isElementOfType(const Node& node) { return node.isElementNode() && isElementOfType<const Type>(toElement(node)); }
-template <> inline bool isElementOfType<const Element>(const Element&) { return true; }
+template <typename ExpectedType, typename ArgType>
+struct ElementTypeCastTraits {
+    static bool is(ArgType&);
+};
+
+// This is needed so that the compiler can deduce the second template parameter (ArgType).
+template <typename ExpectedType, typename ArgType>
+inline bool isElementOfType(const ArgType& node) { return ElementTypeCastTraits<ExpectedType, const ArgType>::is(node); }
+
+template <>
+struct ElementTypeCastTraits<const Element, const Node> {
+    static bool is(const Node& node) { return node.isElementNode(); }
+};
+
+template <typename ExpectedType>
+struct ElementTypeCastTraits<ExpectedType, ExpectedType> {
+    static bool is(ExpectedType&) { return true; }
+};
 
 inline bool Node::hasAttributes() const
 {