1 /* 2 * Copyright (C) 2005 Frerich Raabe <raabe (at) kde.org> 3 * Copyright (C) 2006, 2009 Apple Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef XPathExpressionNode_h 28 #define XPathExpressionNode_h 29 30 #if ENABLE(XPATH) 31 32 #include "Node.h" 33 #include "XPathValue.h" 34 #include <wtf/HashMap.h> 35 #include <wtf/Vector.h> 36 #include <wtf/text/StringHash.h> 37 38 namespace WebCore { 39 40 namespace XPath { 41 42 struct EvaluationContext { 43 WTF_MAKE_FAST_ALLOCATED; 44 public: 45 RefPtr<Node> node; 46 unsigned long size; 47 unsigned long position; 48 HashMap<String, String> variableBindings; 49 50 bool hadTypeConversionError; 51 }; 52 53 class ParseNode { 54 public: 55 virtual ~ParseNode() { } 56 }; 57 58 class Expression : public ParseNode { 59 WTF_MAKE_NONCOPYABLE(Expression); WTF_MAKE_FAST_ALLOCATED; 60 public: 61 static EvaluationContext& evaluationContext(); 62 63 Expression(); 64 virtual ~Expression(); 65 66 virtual Value evaluate() const = 0; 67 68 void addSubExpression(Expression* expr) 69 { 70 m_subExpressions.append(expr); 71 m_isContextNodeSensitive |= expr->m_isContextNodeSensitive; 72 m_isContextPositionSensitive |= expr->m_isContextPositionSensitive; 73 m_isContextSizeSensitive |= expr->m_isContextSizeSensitive; 74 } 75 76 bool isContextNodeSensitive() const { return m_isContextNodeSensitive; } 77 bool isContextPositionSensitive() const { return m_isContextPositionSensitive; } 78 bool isContextSizeSensitive() const { return m_isContextSizeSensitive; } 79 void setIsContextNodeSensitive(bool value) { m_isContextNodeSensitive = value; } 80 void setIsContextPositionSensitive(bool value) { m_isContextPositionSensitive = value; } 81 void setIsContextSizeSensitive(bool value) { m_isContextSizeSensitive = value; } 82 83 virtual Value::Type resultType() const = 0; 84 85 protected: 86 unsigned subExprCount() const { return m_subExpressions.size(); } 87 Expression* subExpr(unsigned i) { return m_subExpressions[i]; } 88 const Expression* subExpr(unsigned i) const { return m_subExpressions[i]; } 89 90 private: 91 Vector<Expression*> m_subExpressions; 92 93 // Evaluation details that can be used for optimization. 94 bool m_isContextNodeSensitive; 95 bool m_isContextPositionSensitive; 96 bool m_isContextSizeSensitive; 97 }; 98 99 } 100 101 } 102 103 #endif // ENABLE(XPATH) 104 105 #endif // EXPRESSION_H 106 107