/* * Copyright (c) 2001-2006 * DecisionSoft Limited. All rights reserved. * Copyright (c) 2004-2006 * Progress Software Corporation. All rights reserved. * Copyright (c) 2004-2006 * Oracle. All rights reserved. * * See the file LICENSE for redistribution information. * * $Id: StaticResolutionContext.hpp,v 1.15 2006/11/01 16:37:11 jpcs Exp $ */ #ifndef _STATICRESOLUTIONCONTEXT_HPP #define _STATICRESOLUTIONCONTEXT_HPP #include #include #include #include #include #include class XPath2MemoryManager; typedef XERCES_CPP_NAMESPACE_QUALIFIER RefHash2KeysTableOf VariableAccessSet; typedef XERCES_CPP_NAMESPACE_QUALIFIER RefHash2KeysTableOfEnumerator VariableAccessSetEnumerator; /** * Records access to various parts of the context during static resolution. */ class XQILLA_API StaticResolutionContext { public: StaticResolutionContext(XPath2MemoryManager* memMgr); StaticResolutionContext(const StaticResolutionContext &o, XPath2MemoryManager* memMgr); void copy(const StaticResolutionContext &o); /// Clears all the information in this StaticResolutionContext void clear(); /** Overrides all the other flags, and never allows this sub-expression to be constant folded. */ void forceNoFolding(bool value); bool isNoFoldingForced() const; void contextItemUsed(bool value); void contextPositionUsed(bool value); void contextSizeUsed(bool value); bool isContextItemUsed() const; bool isContextPositionUsed() const; bool isContextSizeUsed() const; /** Returns true if any of the context item flags have been used */ bool areContextFlagsUsed() const; void currentTimeUsed(bool value); void implicitTimezoneUsed(bool value); bool areContextTimeUsed() const; void availableDocumentsUsed(bool value); void availableCollectionsUsed(bool value); bool areDocsOrCollectionsUsed() const; void variableUsed(const XMLCh *namespaceURI, const XMLCh *name); bool removeVariable(const XMLCh *namespaceURI, const XMLCh *name); bool isVariableUsed(const XMLCh *namespaceURI, const XMLCh *name) const; std::vector > variablesUsed() const; /** Sets the members of this StaticResolutionContext from the given StaticResolutionContext */ void add(const StaticResolutionContext &o); void addExceptContextFlags(const StaticResolutionContext &o); /** Returns true if flags are set, or variables have been used */ bool isUsed() const; bool isUsedExceptContextFlags() const; void creative(bool value); bool isCreative() const; /** * Properties that allow optimisation regarding sorting or not. * The values are OR'd as flags, so they must be distinct bits */ enum Properties { DOCORDER = 0x001, ///< Results are returned in document order PEER = 0x002, ///< Results do not appear in the descendants of other results SUBTREE = 0x004, ///< Results are members of the set of descendants of the context node GROUPED = 0x008, ///< Results are grouped by the document they come from SAMEDOC = 0x010, ///< Results are from the same document as the context node ONENODE = 0x020, ///< Only ever returns one node SELF = 0x040, ///< Only ever returns the context node FORWARDREF = 0x080, ///< This is a forward reference for a global variable that is declared later UNDEFINEDVAR = 0x100 ///< This is a variable that has been undefined }; unsigned int getProperties() const; void setProperties(unsigned int props); const StaticType &getStaticType() const; StaticType &getStaticType(); std::string toString() const; private: StaticResolutionContext(const StaticResolutionContext &o); StaticResolutionContext &operator=(const StaticResolutionContext &o); bool _contextItem; bool _contextPosition; bool _contextSize; bool _currentTime; bool _implicitTimezone; bool _availableDocuments; bool _availableCollections; bool _forceNoFolding; bool _creative; unsigned int _properties; StaticType _staticType; VariableAccessSet _dynamicVariables; XERCES_CPP_NAMESPACE_QUALIFIER XMLStringPool _uriPool; XPath2MemoryManager* _memMgr; }; #endif