#ifndef ARABICA_XPATHIC_XPATH_LOGICAL_HPP #define ARABICA_XPATHIC_XPATH_LOGICAL_HPP #include "xpath_value.hpp" namespace Arabica { namespace XPath { namespace impl { template class OrOperator : private BinaryExpression, public XPathExpression { typedef BinaryExpression baseT; public: OrOperator(XPathExpression* lhs, XPathExpression* rhs) : BinaryExpression(lhs, rhs) { } virtual XPathValuePtr evaluate(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. if(baseT::lhs()->evaluate(context, executionContext)->asBool()) return BoolValue::createValue(true); return BoolValue::createValue(baseT::rhs()->evaluate(context, executionContext)->asBool()); } // evaluate }; // class OrOperator template class AndOperator : private BinaryExpression, public XPathExpression { typedef BinaryExpression baseT; public: AndOperator(XPathExpression* lhs, XPathExpression* rhs) : BinaryExpression(lhs, rhs) { } virtual XPathValuePtr evaluate(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. if(!baseT::lhs()->evaluate(context, executionContext)->asBool()) return BoolValue::createValue(false); return BoolValue::createValue(baseT::rhs()->evaluate(context, executionContext)->asBool()); } // evaluate }; // class AndOperator } // namespace impl } // namespace XPath } // namespace Arabica #endif