#ifndef ARABICA_XPATHIC_XPATH_LOGICAL_HPP #define ARABICA_XPATHIC_XPATH_LOGICAL_HPP #include "xpath_value.hpp" namespace Arabica { namespace XPath { namespace impl { template class LogicalOperator : public BinaryExpression { public: using BinaryExpression::evaluateAsBool; LogicalOperator(XPathExpression_impl* lhs, XPathExpression_impl* rhs) : BinaryExpression(lhs, rhs) { } virtual ValueType type() const { return BOOL; } virtual XPathValue evaluate(const DOM::Node& context, const ExecutionContext& executionContext) const { return BoolValue::createValue(evaluateAsBool(context, executionContext)); } // evaluate }; // class LogicalOperator template class OrOperator : public LogicalOperator { typedef LogicalOperator LogicalOperatorT; using LogicalOperatorT::lhs; using LogicalOperatorT::rhs; public: OrOperator(XPathExpression_impl* lhs, XPathExpression_impl* rhs) : LogicalOperator(lhs, rhs) { } virtual bool evaluateAsBool(const DOM::Node& context, const ExecutionContext& executionContext) const { // From XPath 1.0 Rec, section 3.4 // An or expression is evaluated by evaluating each operand and converting its value // to a boolean as if by a call to the boolean function. The result is true if either // value is true and false otherwise. The right operand is not evaluated if the // left operand evaluates to true. return lhs()->evaluate(context, executionContext).asBool() || rhs()->evaluate(context, executionContext).asBool(); } // evaluateAsBool }; // class OrOperator template class AndOperator : public LogicalOperator { typedef LogicalOperator LogicalOperatorT; using LogicalOperatorT::lhs; using LogicalOperatorT::rhs; public: AndOperator(XPathExpression_impl* lhs, XPathExpression_impl* rhs) : LogicalOperator(lhs, rhs) { } virtual bool evaluateAsBool(const DOM::Node& context, const ExecutionContext& executionContext) const { // From XPath 1.0 Rec, section 3.4 // An and expression is evaluated by evaluating each operand and converting its value // to a boolean as if by a call to the boolean function. The result is true if both // values are true and false otherwise. The right operand is not evaluated if the left // operand evaluates to false. return lhs()->evaluate(context, executionContext).asBool() && rhs()->evaluate(context, executionContext).asBool(); } // evaluateAsBool }; // class AndOperator } // namespace impl } // namespace XPath } // namespace Arabica #endif