#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 : public BinaryExpression { typedef BinaryExpression baseT; public: OrOperator(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 { // 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 : public BinaryExpression { typedef BinaryExpression baseT; public: AndOperator(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 { // 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