EXT_IDs with INT_IDs.
#include <ace/Hash_Map_Manager_T.h>
template<class EXT_ID, class INT_ID, class HASH_KEY, class COMPARE_KEYS, class ACE_LOCK> class ACE_Hash_Map_Manager_Ex {
public:friend class ACE_Hash_Map_Iterator_Base_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK>; friend class ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK>; friend class ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK>;typedef EXT_ID KEY;typedef INT_ID VALUE;typedef ACE_Hash_Map_Entry<EXT_ID, INT_ID> ENTRY;typedef ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> ITERATOR; typedef ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> REVERSE_ITERATOR; typedef ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> iterator; typedef ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> reverse_iterator;ACE_Hash_Map_Manager_Ex (ACE_Allocator *alloc = 0);ACE_Hash_Map_Manager_Ex (size_t size, ACE_Allocator *alloc = 0);int open ( size_t size = ACE_DEFAULT_MAP_SIZE, ACE_Allocator *alloc = 0 );int close (void);~ACE_Hash_Map_Manager_Ex (void);int bind (const EXT_ID &item, const INT_ID &int_id);int bind ( const EXT_ID &ext_id, const INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int trybind (const EXT_ID &ext_id, INT_ID &int_id);int trybind ( const EXT_ID &ext_id, INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind (const EXT_ID &ext_id, const INT_ID &int_id);int rebind ( const EXT_ID &ext_id, const INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind ( const EXT_ID &ext_id, const INT_ID &int_id, INT_ID &old_int_id );int rebind ( const EXT_ID &ext_id, const INT_ID &int_id, INT_ID &old_int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind ( const EXT_ID &ext_id, const INT_ID &int_id, EXT_ID &old_ext_id, INT_ID &old_int_id );int rebind ( const EXT_ID &ext_id, const INT_ID &int_id, EXT_ID &old_ext_id, INT_ID &old_int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int find (const EXT_ID &ext_id, INT_ID &int_id);int find (const EXT_ID &ext_id);int find ( const EXT_ID &ext_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int unbind (const EXT_ID &ext_id);int unbind (const EXT_ID &ext_id, INT_ID &int_id);int unbind (ACE_Hash_Map_Entry<EXT_ID, INT_ID> *entry);size_t current_size (void);size_t total_size (void);ACE_LOCK &mutex (void);void dump (void) const;ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> begin ( void );ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> end ( void );ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> rbegin ( void );ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> rend ( void );protected:int equal (const EXT_ID &id1, const EXT_ID &id2);u_long hash (const EXT_ID &ext_id);int bind_i (const EXT_ID &ext_id, const INT_ID &int_id);int bind_i ( const EXT_ID &ext_id, const INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int trybind_i (const EXT_ID &ext_id, INT_ID &int_id);int trybind_i ( const EXT_ID &ext_id, INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind_i (const EXT_ID &ext_id, const INT_ID &int_id);int rebind_i ( const EXT_ID &ext_id, const INT_ID &int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind_i ( const EXT_ID &ext_id, const INT_ID &int_id, INT_ID &old_int_id );int rebind_i ( const EXT_ID &ext_id, const INT_ID &int_id, INT_ID &old_int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int rebind_i ( const EXT_ID &ext_id, const INT_ID &int_id, EXT_ID &old_ext_id, INT_ID &old_int_id );int rebind_i ( const EXT_ID &ext_id, const INT_ID &int_id, EXT_ID &old_ext_id, INT_ID &old_int_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int find_i (const EXT_ID &ext_id, INT_ID &int_id);int find_i (const EXT_ID &ext_id);int find_i ( const EXT_ID &ext_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry );int unbind_i (const EXT_ID &ext_id, INT_ID &int_id);int unbind_i (const EXT_ID &ext_id);int unbind_i (ACE_Hash_Map_Entry<EXT_ID, INT_ID> *entry);int create_buckets (size_t size);int close_i (void);ACE_Allocator *allocator_;ACE_LOCK lock_;HASH_KEY hash_key_;COMPARE_KEYS compare_keys_;private:int shared_find ( const EXT_ID &ext_id, ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry, u_long &loc );ACE_Hash_Map_Entry<EXT_ID, INT_ID> *table_;size_t total_size_;size_t cur_size_;};
This implementation of a map uses a hash table. Key hashing is achieved through the HASH_KEY object and key comparison is achieved through the COMPARE_KEYS object.
This class uses an ACE_Allocator to allocate memory.  The
user can make this a persistent class by providing an
ACE_Allocator with a persistable memory pool.
    typedef ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> ITERATOR;
    
    typedef ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> REVERSE_ITERATOR;
    
    typedef ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> iterator;
    
    typedef ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> reverse_iterator;
    
ACE_Hash_Map_Manager_Ex (ACE_Allocator *alloc = 0);
Hash_Map_Manager_Ex with default size.
ACE_Hash_Map_Manager_Ex (size_t size, ACE_Allocator *alloc = 0);
Hash_Map_Manager_Ex with size length.
int open (
    size_t size = ACE_DEFAULT_MAP_SIZE,
    ACE_Allocator *alloc = 0
    );
Hash_Map_Manager_Ex with size elements.
int close (void);
Hash_Map_Manager_Ex and release dynamically allocated
resources.
~ACE_Hash_Map_Manager_Ex (void);
Hash_Map_Manager_Ex with size length.
int bind (const EXT_ID &item, const INT_ID &int_id);
ext_id with int_id.  If ext_id is already in the
map then the ACE_Hash_Map_Entry is not changed.  Returns 0 if a
new entry is bound successfully, returns 1 if an attempt is made
to bind an existing entry, and returns -1 if failures occur.
int bind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int trybind (const EXT_ID &ext_id, INT_ID &int_id);
ext_id with int_id if and only if ext_id is not
in the map.  If ext_id is already in the map then the int_id
parameter is assigned the existing value in the map.  Returns 0
if a new entry is bound successfully, returns 1 if an attempt is
made to bind an existing entry, and returns -1 if failures occur.
int trybind (
    const EXT_ID &ext_id,
    INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind (const EXT_ID &ext_id, const INT_ID &int_id);
ext_id with int_id.  If ext_id is not in the
map then behaves just like bind.  Returns 0 if a new entry is
bound successfully, returns 1 if an existing entry was rebound,
and returns -1 if failures occur.
int rebind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    INT_ID &old_int_id
    );
ext_id with int_id.  If ext_id is not in the map
then behaves just like bind.  Otherwise, store the old value of
int_id into the "out" parameter and rebind the new parameters.
Returns 0 if a new entry is bound successfully, returns 1 if an
existing entry was rebound, and returns -1 if failures occur.
int rebind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    INT_ID &old_int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    EXT_ID &old_ext_id,
    INT_ID &old_int_id
    );
ext_id with int_id.  If ext_id is not in the map
then behaves just like bind.  Otherwise, store the old values
of ext_id and int_id into the "out" parameters and rebind the
new parameters.  This is very useful if you need to have an
atomic way of updating ACE_Hash_Map_Entrys and you also need
full control over memory allocation.  Returns 0 if a new entry is
bound successfully, returns 1 if an existing entry was rebound,
and returns -1 if failures occur.
int rebind (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    EXT_ID &old_ext_id,
    INT_ID &old_int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int find (const EXT_ID &ext_id, INT_ID &int_id);
ext_id and pass out parameter via int_id.  If found,
return 0, returns -1 if not found.
int find (const EXT_ID &ext_id);
ext_id is in the mapping, otherwise -1.
int find (
    const EXT_ID &ext_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
ext_id and pass out parameter via entry.  If found,
return 0, returns -1 if not found.
int unbind (const EXT_ID &ext_id);
ext_id from the map.  Don't return the
int_id to the caller (this is useful for collections where the
int_ids are *not* dynamically allocated...)
int unbind (const EXT_ID &ext_id, INT_ID &int_id);
ext_id.  Returns the value of int_id
in case the caller needs to deallocate memory.
int unbind (ACE_Hash_Map_Entry<EXT_ID, INT_ID> *entry);
size_t current_size (void);
size_t total_size (void);
ACE_LOCK &mutex (void);
ACE_LOCK.  This makes it
possible to acquire the lock explicitly, which can be useful in
some cases if you instantiate the ACE_Atomic_Op with an
ACE_Recursive_Mutex or ACE_Process_Mutex, or if you need to
guard the state of an iterator.  NOTE: the right name would be
lock, but HP/C++ will choke on that!
void dump (void) const;
ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> begin (
    void
    );
ACE_Hash_Map_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> end (
    void
    );
ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> rbegin (
    void
    );
ACE_Hash_Map_Reverse_Iterator_Ex<EXT_ID, INT_ID, HASH_KEY, COMPARE_KEYS, ACE_LOCK> rend (
    void
    );
int equal (const EXT_ID &id1, const EXT_ID &id2);
id1 == id2, else 0.  This is defined as a
separate method to facilitate template specialization.
u_long hash (const EXT_ID &ext_id);
ext_id.  This is defined as a
separate method to facilitate template specialization.
int bind_i (const EXT_ID &ext_id, const INT_ID &int_id);
int bind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int trybind_i (const EXT_ID &ext_id, INT_ID &int_id);
int trybind_i (
    const EXT_ID &ext_id,
    INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind_i (const EXT_ID &ext_id, const INT_ID &int_id);
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    INT_ID &old_int_id
    );
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    INT_ID &old_int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    EXT_ID &old_ext_id,
    INT_ID &old_int_id
    );
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    EXT_ID &old_ext_id,
    INT_ID &old_int_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
int find_i (const EXT_ID &ext_id, INT_ID &int_id);
int_id using ext_id as the key.  Must be
called with locks held.
int find_i (const EXT_ID &ext_id);
ext_id as the key.  Must be called with
locks held.
int find_i (
    const EXT_ID &ext_id,
    ACE_Hash_Map_Entry<EXT_ID, INT_ID> *&entry
    );
ext_id as the key.  Must be called with
locks held.
int unbind_i (const EXT_ID &ext_id, INT_ID &int_id);
int unbind_i (const EXT_ID &ext_id);
int unbind_i (ACE_Hash_Map_Entry<EXT_ID, INT_ID> *entry);
int create_buckets (size_t size);
int close_i (void);
Map_Manager_Ex.  Must be called with
locks held.
ACE_Allocator *allocator_;
ACE_LOCK lock_;
ACE_Hash_Map_Manager_Ex.
HASH_KEY hash_key_;
COMPARE_KEYS compare_keys_;