windows-nt/Source/XPSP1/NT/com/rpc/midl/inc/mapset.hxx
2020-09-26 16:20:57 +08:00

210 lines
5.8 KiB
C++

/*++
Copyright (c) 1999-1999 Microsoft Corporation
Module Name:
mapset.hxx
Abstract:
Generic maps and sets based on the Dictionary class.
Author:
Mike Zoran mzoran 11-Nov-99
Revision History:
Notes:
The file contains template classes for simple generic maps and sets
that use the Dictionary class as the internal storage. If pointers
are stored, use the PTR versions of these classes for performance.
Note that these classes do not assume ownership of any pointers inserted
into the containers. The pointee as not freed when the structure is
destroyed.
--*/
#ifndef __MAPSET_HXX__
#define __MAPSET_HXX__
#include <dict.hxx>
////////////////////////////////////////////////////////////////////////
//
// MAP
//
////////////////////////////////////////////////////////////////////////
template<class K, class V>
class MAP : private Dictionary
{
public:
MAP() : Dictionary() {}
~MAP() { Discard(); }
BOOL Insert( K & NewKey, V & NewValue )
{
MapElement *pNewElement = new MapElement( NewKey, NewValue);
Dict_Status Status = Dict_Insert( pNewElement );
if (Status != SUCCESS)
{
delete pNewElement;
return FALSE;
}
return TRUE;
}
BOOL Lookup( K & FindKey, V * pFindValue = NULL)
{
MapElement TempElement( FindKey );
Dict_Status Status = Dict_Find( &TempElement );
if (SUCCESS != Status )
return FALSE;
if ( pFindValue )
*pFindValue = static_cast<MapElement*>( Dict_Item() )->Value;
return TRUE;
}
BOOL Delete( K & pFindKey )
{
MapElement TempElement( FindKey );
MapElement *pMapElement = &TempElement;
Dict_Status Status = Dict_Find( &pMapElement );
if (SUCCESS != Status)
return FALSE;
delete pMapElement;
return TRUE;
}
void Discard()
{
MapElement *pMapElement = NULL;
while ( pMapElement = static_cast<MapElement*>( Dict_Delete_One() ) )
delete pMapElement;
}
private:
struct MapElement
{
K Key;
V Value;
MapElement(K & NewKey, V & NewValue) :
Key(NewKey),
Value(NewValue) {}
MapElement(K & NewKey) :
Key(NewKey) {}
};
virtual
SSIZE_T Compare (pUserType p1, pUserType p2)
{
if ( static_cast<MapElement*>( p1 )->Key == static_cast<MapElement*>( p2 )->Key )
return 0;
if ( static_cast<MapElement*>( p1 )->Key < static_cast<MapElement*>( p2 )->Key )
return -1;
return 1;
}
};
template<class K, class V>
class PTR_MAP : private MAP<INT_PTR,INT_PTR>
{
public:
PTR_MAP() : MAP<INT_PTR,INT_PTR>() {}
~PTR_MAP() { Discard(); }
BOOL Insert( K * NewKey, V * NewValue)
{
INT_PTR TempNewKey = reinterpret_cast<INT_PTR>( NewKey );
INT_PTR TempNewValue = reinterpret_cast<INT_PTR>( NewValue);
return MAP<INT_PTR,INT_PTR>::Insert(TempNewKey,TempNewValue);
}
BOOL Lookup( K * FindKey, V ** pFindValue = NULL)
{
INT_PTR TempFindKey = reinterpret_cast<INT_PTR>( FindKey );
INT_PTR *pTempFindValue = reinterpret_cast<INT_PTR*>( pFindValue );
return MAP<INT_PTR,INT_PTR>::Lookup( TempFindKey, pTempFindValue );
}
BOOL Delete( K * FindKey )
{
INT_PTR TempFindKey = reinterpret_cast<INT_PTR>( FindKey );
return MAP<INT_PTR,INT_PTR>::Delete( TempFindKey );
}
void Discard() { MAP<INT_PTR,INT_PTR>::Discard(); }
};
////////////////////////////////////////////////////////////////////////
//
// SET
//
////////////////////////////////////////////////////////////////////////
template<class T> class SET : private Dictionary
{
public:
SET() : Dictionary() {}
~SET() { Discard(); }
BOOL Insert( T & NewItem )
{
T *pNewItem = new T(NewItem);
Dict_Status Status = Dict_Insert( pNewItem );
if ( SUCCESS == Status )
return TRUE;
delete pNewItem;
return FALSE;
}
BOOL Lookup( T & FindItem ) { return ( SUCCESS == Dict_Find( &NewItem ) ); }
BOOL Delete( T & DeleteItem )
{
void* pDeleteItem = &DeleteItem;
return (SUCCESS == Dict_Delete( &pDeleteItem ) );
}
void Discard()
{
T * pDeleteItem = NULL;
while( ( pDeleteItem = static_cast<T*>( Dict_Delete_One() ) ) != NULL )
delete pDeleteItem;
}
private:
SSIZE_T Compare(pUserType p1, pUserType p2)
{
if ( *static_cast<T*>( p1 ) == *static_cast<T*>( p2 ) )
return 0;
if ( *static_cast<T*>( p1 ) < *static_cast<T*>( p2 ) )
return -1;
return 1;
}
};
template<>
class SET<void*> : private Dictionary
{
public:
SET() : Dictionary() {}
~SET() { Discard(); }
BOOL Insert( void *pNewItem ) { return ( SUCCESS == Dict_Insert( pNewItem ) ); }
BOOL Lookup( void *pFindItem ) { return ( SUCCESS == Dict_Find( pFindItem ) ); }
BOOL Delete( void *pDeleteItem ) { return ( SUCCESS == Dict_Delete( &pDeleteItem ) );}
void Discard() { Dict_Discard(); }
};
template<class T>
class PTR_SET : private SET<void*>
{
public:
PTR_SET() : SET<void*>() {}
~PTR_SET() { Discard(); }
BOOL Insert( T *pNewItem ) { return SET<void*>::Insert( pNewItem ); }
BOOL Lookup( T *pFindItem ) { return SET<void*>::Lookup( pFindItem ); }
BOOL Delete( T *pDeleteItem ) { return SET<void*>::Delete( pDeleteItem ); }
void Discard() { SET<void*>::Discard(); }
};
#endif //__MAPSET_HXX__