/* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ #ifndef _DATAITEMFOR_HPP #define _DATAITEMFOR_HPP #include #include #include #include #include typedef std::vector > VectorOfBindings; template class VarHashEntry; /** For function. */ class PATHAN_EXPORT DataItemFor : public DataItemImpl { public: DataItemFor(VectorOfBindings* bindings, DataItem* returnExpr, XPath2MemoryManager* memMgr); /** loop over the evaluation and evaluate the return argument multiple times **/ virtual Sequence collapseTreeInternal(DynamicContext* context, int flags=0) const; /** * Called during static analysis to determine if statically correct. If * not an appropriate error is thrown. */ virtual DataItem* staticResolution(StaticContext *context, StaticResolutionContext *src); class VB { public: VB(const XMLCh* const variable, DataItem* allValues); VB(const VB &o); const XMLCh *_variable, *_uri, *_name; DataItem* _allValues; bool _valuesExprDependsOnPreviousBindings; bool _needsNewScope; }; typedef std::vector > Bindings; const Bindings &getBindings() const; const DataItem *getReturnExpr() const; void setReturnExpr(DataItem *item); protected: class VBExecution { public: VBExecution(const VB *vb, DynamicContext *context); bool initialise(DynamicContext *context); bool next(DynamicContext *context); private: const VB *_vb; Sequence _currentValues; Sequence::iterator _valueIt; VarHashEntry *_refVar; bool _valuesComputed; }; typedef std::vector ExecutionBindings; bool next(ExecutionBindings &ebs, DynamicContext *context, bool initialisationState) const; virtual Sequence collapseTreeInternal(Bindings::const_iterator it, Bindings::const_iterator end, DynamicContext* context, int flags = 0) const; void staticResolutionImpl(StaticContext* context, StaticResolutionContext *src); Bindings _bindings; DataItem* _returnExpr; }; #endif // _DATAITEMFOR_HPP