/* * 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: Scope.hpp,v 1.10 2006/12/02 02:11:48 jpcs Exp $ */ /* Scope */ #ifndef _SCOPE_HPP #define _SCOPE_HPP #include #include #include #include #include template class VarHashEntry; /** used inside VariableStore to implement variable scoping */ template class Scope : public XERCES_CPP_NAMESPACE_QUALIFIER XMemory { 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); ~Scope(); void clear(); Type getType() const; VarHashEntry* get(unsigned int nsID, const XMLCh* name); void put(unsigned int nsID, const XMLCh* name, VarHashEntry* value); void remove(unsigned int nsID, const XMLCh* name); std::vector< std::pair > getVars() const; Scope* getNext(); void setNext(Scope* next); private: typename Scope::Type _type; VarHash _map; XPath2MemoryManager* _memMgr; Scope* _next; }; template Scope::Scope(XPath2MemoryManager* memMgr, Type type) : _map(17, true, 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 Scope::~Scope() { _map.removeAll(); } template Scope* Scope::getNext() { return _next; } template void Scope::setNext(Scope* next) { _next=next; } #endif // _SCOPE_HPP