#ifndef ARABICA_XPATHIC_XPATH_EXPRESSION_H #define ARABICA_XPATHIC_XPATH_EXPRESSION_H #include #include #include "xpath_object.hpp" #include "xpath_execution_context.hpp" namespace Arabica { namespace XPath { template class XPathExpression { protected: XPathExpression() { } public: virtual ~XPathExpression() { } XPathValuePtr evaluate(const DOM::Node& context) const { ExecutionContext executionContext; return evaluate(context, executionContext); } // evaluate virtual bool evaluateAsBool(const DOM::Node& context) const { return evaluate(context)->asBool(); } virtual double evaluateAsNumber(const DOM::Node& context) const { return evaluate(context)->asNumber(); } virtual string_type evaluateAsString(const DOM::Node& context) const { return evaluate(context)->asString(); } virtual NodeSet evaluateAsNodeSet(const DOM::Node& context) const { return evaluate(context)->asNodeSet(); } virtual XPathValuePtr evaluate(const DOM::Node& context, const ExecutionContext& executionContext) const = 0; private: XPathExpression(const XPathExpression&); bool operator==(const XPathExpression&); XPathExpression& operator=(const XPathExpression&); }; // class XPathExpression template > class XPathExpressionPtr : public boost::shared_ptr > { public: explicit XPathExpressionPtr(XPathExpression* xp) : boost::shared_ptr >(xp) { } // XPathExpressionPtr }; // class XPathExpressionPtr template class UnaryExpression { public: UnaryExpression(XPathExpression* expr) : expr_(expr) { } protected: ~UnaryExpression() { delete expr_; } // ~UnaryExpression XPathExpression* expr() const { return expr_; } private: XPathExpression* expr_; }; // class UnaryExpression template class BinaryExpression { public: BinaryExpression(XPathExpression* lhs, XPathExpression* rhs) : lhs_(lhs), rhs_(rhs) { } // BinaryExpression protected: ~BinaryExpression() { delete lhs_; delete rhs_; } // ~BinaryExpression XPathExpression* lhs() const { return lhs_; } XPathExpression* rhs() const { return rhs_; } private: XPathExpression* lhs_; XPathExpression* rhs_; }; // class BinaryExpression } // namespace XPath } // namespace Arabica #endif