/* * Copyright (c) 2001, DecisionSoft Limited All rights reserved. * Please see LICENSE.TXT for more information. */ /* Scope */ #ifndef _SCOPE_HPP #define _SCOPE_HPP #include #include #include template class VarHashEntry; /** used inside VariableStore to implement variable scoping */ template class Scope { public: /** enum for classifying type of scope */ typedef enum { GLOBAL_SCOPE, LOCAL_SCOPE, LOGICAL_BLOCK_SCOPE } Type; typedef XERCES_CPP_NAMESPACE_QUALIFIER RefHash2KeysTableOf< VarHashEntry > VarHash; /** constructor. */ Scope(XPath2MemoryManager* memMgr, Type type); virtual ~Scope() {}; virtual void clear(); virtual Type getType() const; virtual VarHashEntry* get(unsigned int nsID, const XMLCh* name); virtual void put(unsigned int nsID, const XMLCh* name, VarHashEntry* value); virtual void remove(unsigned int nsID, const XMLCh* name); virtual std::vector< std::pair > getVars() const; virtual void release(); virtual Scope* getNext(); virtual void setNext(Scope* next); private: typename Scope::Type _type; VarHash _map; XPath2MemoryManager* _memMgr; Scope* _next; }; template Scope::Scope(XPath2MemoryManager* memMgr, typename Scope::Type type) : _map(17, false, memMgr) { _memMgr=memMgr; _type = type; _next = NULL; } template void Scope::clear() { _map.removeAll(); } template typename Scope::Type Scope::getType() const { return _type; } template VarHashEntry* Scope::get(unsigned int nsID, const XMLCh* name) { return _map.get(name,nsID); } template void Scope::put(unsigned int nsID, const XMLCh* name, VarHashEntry* value) { _map.put((void*)_memMgr->getPooledString(name),nsID,value); } template void Scope::remove(unsigned int nsID, const XMLCh* name) { _map.removeKey(name,nsID); } template std::vector< std::pair > Scope::getVars() const { std::vector< std::pair > result; XERCES_CPP_NAMESPACE_QUALIFIER RefHash2KeysTableOfEnumerator< VarHashEntry > iterator(const_cast(&_map)); while(iterator.hasMoreElements()) { XMLCh* name; int nsID; iterator.nextElementKey((void*&)name, nsID); result.push_back(std::pair(nsID,name)); } return result; } template void Scope::release() { _map.removeAll(); _memMgr->deallocate(this); } template Scope* Scope::getNext() { return _next; } template void Scope::setNext(Scope* next) { _next=next; } #endif // _SCOPE_HPP