XQuilla/include/xqilla/context/Scope.hpp
2020-02-17 22:11:31 +01:00

137 lines
3 KiB
C++

/*
* 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 <xqilla/framework/XQillaExport.hpp>
#include <xqilla/context/VarHashEntry.hpp>
#include <vector>
#include <xercesc/util/RefHash2KeysTableOf.hpp>
#include <xercesc/util/XMemory.hpp>
template<class TYPE> class VarHashEntry;
/** used inside VariableStore to implement variable scoping */
template<class TYPE>
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<TYPE> > VarHash;
/** constructor. */
Scope(XPath2MemoryManager* memMgr, Type type);
~Scope();
void clear();
Type getType() const;
VarHashEntry<TYPE>* get(unsigned int nsID, const XMLCh* name);
void put(unsigned int nsID, const XMLCh* name, VarHashEntry<TYPE>* value);
void remove(unsigned int nsID, const XMLCh* name);
std::vector< std::pair<unsigned int, const XMLCh*> > getVars() const;
Scope* getNext();
void setNext(Scope* next);
private:
typename Scope<TYPE>::Type _type;
VarHash _map;
XPath2MemoryManager* _memMgr;
Scope<TYPE>* _next;
};
template<class TYPE>
Scope<TYPE>::Scope(XPath2MemoryManager* memMgr, Type type) :
_map(17, true, memMgr)
{
_memMgr=memMgr;
_type = type;
_next = NULL;
}
template<class TYPE>
void Scope<TYPE>::clear()
{
_map.removeAll();
}
template<class TYPE>
typename Scope<TYPE>::Type Scope<TYPE>::getType() const
{
return _type;
}
template<class TYPE>
VarHashEntry<TYPE>* Scope<TYPE>::get(unsigned int nsID, const XMLCh* name)
{
return _map.get(name,nsID);
}
template<class TYPE>
void Scope<TYPE>::put(unsigned int nsID, const XMLCh* name, VarHashEntry<TYPE>* value)
{
_map.put((void*)_memMgr->getPooledString(name),nsID,value);
}
template<class TYPE>
void Scope<TYPE>::remove(unsigned int nsID, const XMLCh* name)
{
_map.removeKey(name,nsID);
}
template<class TYPE>
std::vector< std::pair<unsigned int, const XMLCh*> > Scope<TYPE>::getVars() const
{
std::vector< std::pair<unsigned int, const XMLCh*> > result;
XERCES_CPP_NAMESPACE_QUALIFIER RefHash2KeysTableOfEnumerator< VarHashEntry<TYPE> > iterator(const_cast<VarHash*>(&_map));
while(iterator.hasMoreElements())
{
XMLCh* name;
int nsID;
iterator.nextElementKey((void*&)name, nsID);
result.push_back(std::pair<unsigned int, const XMLCh*>(nsID,name));
}
return result;
}
template<class TYPE>
Scope<TYPE>::~Scope()
{
_map.removeAll();
}
template<class TYPE>
Scope<TYPE>* Scope<TYPE>::getNext()
{
return _next;
}
template<class TYPE>
void Scope<TYPE>::setNext(Scope<TYPE>* next)
{
_next=next;
}
#endif // _SCOPE_HPP