15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2005 Frerich Raabe <raabe@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 1402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef XPathPredicate_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define XPathPredicate_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathExpressionNode.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathValue.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namespace XPath { 3602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Number : public Expression { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit Number(double); 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::NumberValue; } 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Value m_value; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class StringExpression : public Expression { 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit StringExpression(const String&); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::StringValue; } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Value m_value; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Negative : public Expression { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::NumberValue; } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class NumericOp : public Expression { 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum Opcode { 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OP_Add, OP_Sub, OP_Mul, OP_Div, OP_Mod 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NumericOp(Opcode, Expression* lhs, Expression* rhs); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::NumberValue; } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opcode m_opcode; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class EqTestOp : public Expression { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum Opcode { OP_EQ, OP_NE, OP_GT, OP_LT, OP_GE, OP_LE }; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EqTestOp(Opcode, Expression* lhs, Expression* rhs); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::BooleanValue; } 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool compare(const Value&, const Value&) const; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opcode m_opcode; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class LogicalOp : public Expression { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum Opcode { OP_And, OP_Or }; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LogicalOp(Opcode, Expression* lhs, Expression* rhs); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::BooleanValue; } 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool shortCircuitOn() const; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opcode m_opcode; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Union : public Expression { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value evaluate() const; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual Value::Type resultType() const { return Value::NodeSetValue; } 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Predicate { 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(Predicate); WTF_MAKE_FAST_ALLOCATED; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit Predicate(Expression*); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~Predicate(); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool evaluate() const; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isContextPositionSensitive() const { return m_expr->isContextPositionSensitive() || m_expr->resultType() == Value::NumberValue; } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isContextSizeSensitive() const { return m_expr->isContextSizeSensitive(); } 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Expression* m_expr; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // XPathPredicate_h 125