EXT_ID
s with
INT_ID
s.
#include <ace/Hash_Map_Manager.h>
template<class EXT_ID, class INT_ID, class ACE_LOCK> class ACE_Hash_Map_Manager {
public:
friend class ACE_Hash_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>;
friend class ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK>;
friend class ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, 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<EXT_ID, INT_ID, ACE_LOCK> ITERATOR;
typedef ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> REVERSE_ITERATOR;typedef ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> iterator;
typedef ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> reverse_iterator;ACE_Hash_Map_Manager (size_t size, ACE_Allocator *alloc = 0);
ACE_Hash_Map_Manager (ACE_Allocator *alloc = 0);
int open ( size_t length = ACE_DEFAULT_MAP_SIZE, ACE_Allocator *alloc = 0 );
int close (void);
~ACE_Hash_Map_Manager (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, 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);
void dump (void) const;
ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> begin (void);
ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> end (void);
ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rbegin ( void );
ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, 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, 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_;
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_;
};
EXT_ID
contains a method called
hash
. In addition, the EXT_ID
must support operator==
(both of these constraints can be alleviated via template
specialization). This class uses an ACE_Allocator to
allocate memory The user can make this a persistant class by
providing an ACE_Allocator with a persistable memory pool
ACE_Hash_Map_Manager (size_t size, ACE_Allocator *alloc = 0);
Hash_Map_Manager
with size length
.
ACE_Hash_Map_Manager (ACE_Allocator *alloc = 0);
Hash_Map_Manager
with default size.
int open (
size_t length = ACE_DEFAULT_MAP_SIZE,
ACE_Allocator *alloc = 0
);
Hash_Map_Manager
with size length
.
int close (void);
Hash_Map_Manager
and release dynamically allocated
resources.
~ACE_Hash_Map_Manager (void);
Hash_Map_Manager
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 &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_id
s 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);
void dump (void) const;
ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> begin (void);
ACE_Hash_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> end (void);
ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rbegin (void);
ACE_Hash_Map_Reverse_Iterator<EXT_ID, INT_ID, 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,
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
. Must be called with
locks held.
ACE_Allocator *allocator_;
ACE_LOCK lock_;
ACE_Hash_Map_Manager
.