EXT_IDs with
INT_IDs.
#include <ace/Map_Manager.h>
template<class EXT_ID, class INT_ID, class ACE_LOCK> class ACE_Map_Manager {
public:friend class ACE_Map_Iterator_Base<EXT_ID, INT_ID, ACE_LOCK>;friend class ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK>;friend class ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK>;typedef EXT_ID KEY;typedef INT_ID VALUE;typedef ACE_Map_Entry<EXT_ID, INT_ID> ENTRY;typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> ITERATOR;typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> REVERSE_ITERATOR;typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> iterator;typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> reverse_iterator;ACE_Map_Manager (ACE_Allocator *alloc = 0);ACE_Map_Manager (size_t size, ACE_Allocator *alloc = 0);int open ( size_t length = ACE_DEFAULT_MAP_SIZE, ACE_Allocator *alloc = 0 );int close (void);~ACE_Map_Manager (void);int bind (const EXT_ID &ext_id, const INT_ID &int_id);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, INT_ID &old_int_id );int rebind (const EXT_ID &ext_id, const INT_ID &int_id);int trybind (const EXT_ID &ext_id, INT_ID &int_id);int find (const EXT_ID &ext_id, INT_ID &int_id);int find (const EXT_ID &ext_id);int unbind (const EXT_ID &ext_id);int unbind (const EXT_ID &ext_id, INT_ID &int_id);size_t current_size (void);size_t total_size (void);ACE_LOCK &mutex (void);void dump (void) const;ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> begin (void);ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> end (void);ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rbegin (void);ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rend (void);ACE_ALLOC_HOOK_DECLARE;protected:int bind_i (const EXT_ID &ext_id, const INT_ID &int_id);int shared_bind (const EXT_ID &ext_id, const INT_ID &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 );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 trybind_i (const EXT_ID &ext_id, INT_ID &int_id);int find_i (const EXT_ID &ext_id, INT_ID &int_id);int find_and_return_index (const EXT_ID &ext_id, size_t &index);int unbind_i (const EXT_ID &ext_id, INT_ID &int_id);int unbind_i (const EXT_ID &ext_id);int unbind_and_return_index (const EXT_ID &ext_id, size_t &index);int resize_i (size_t size);int close_i (void);int equal (const EXT_ID &id1, const EXT_ID &id2);size_t new_size (void);void free_search_structure (void);size_t free_list_id (void) const;size_t occupied_list_id (void) const;int next_free (size_t &index);void move_from_free_list_to_occupied_list (size_t index);void move_from_occupied_list_to_free_list (size_t index);void shared_move ( size_t index, ACE_Map_Entry<EXT_ID, INT_ID> ¤t_list, size_t current_list_id, ACE_Map_Entry<EXT_ID, INT_ID> &new_list, size_t new_list_id );ACE_Allocator *allocator_;ACE_LOCK lock_;ACE_Map_Entry<EXT_ID, INT_ID> *search_structure_;size_t total_size_;size_t cur_size_;ACE_Map_Entry<EXT_ID, INT_ID> free_list_;ACE_Map_Entry<EXT_ID, INT_ID> occupied_list_;enum{ MAX_EXPONENTIAL = 64 * 1024, LINEAR_INCREASE = 32 * 1024 };private:inline ACE_UNIMPLEMENTED_FUNC ( void operator= (const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK> &) );};
EXT_ID must support operator==.  This constraint can
be alleviated via template specialization, as shown in the
$ACE_ROOT/tests/Conn_Test.cpp test.
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.
This implementation of a map uses an array, which is searched
linearly.  For more efficient searching you should use the
ACE_Hash_Map_Manager.
typedef EXT_ID KEY;
typedef INT_ID VALUE;
typedef ACE_Map_Entry<EXT_ID, INT_ID> ENTRY;
typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> ITERATOR;
    typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> REVERSE_ITERATOR;
    
typedef ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> iterator;
    typedef ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> reverse_iterator;
    
ACE_Map_Manager (ACE_Allocator *alloc = 0);
Map_Manager with the ACE_DEFAULT_MAP_SIZE.
ACE_Map_Manager (size_t size, ACE_Allocator *alloc = 0);
Map_Manager with size entries.
int open (
    size_t length = ACE_DEFAULT_MAP_SIZE,
    ACE_Allocator *alloc = 0
    );
Map_Manager with size length.
int close (void);
Map_Manager and release dynamically allocated
resources.
~ACE_Map_Manager (void);
Map_Manager and release dynamically allocated
resources.
int bind (const EXT_ID &ext_id, const INT_ID &int_id);
ext_id with int_id.  If ext_id is already in the
map then the 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 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 Map_Entries 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,
    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 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);
ext_id with int_id.  Old values in the map are
ignored.
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 overwritten with 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 find (const EXT_ID &ext_id, INT_ID &int_id);
ext_id and pass out parameter via int_id.  If found,
returns and non-negative integer; returns -1 if not found.
int find (const EXT_ID &ext_id);
ext_id is in the mapping, otherwise -1.
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...)  Returns 0 if
successful, else -1.
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.  Returns 0 if
successful, else -1.
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_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> begin (void);
ACE_Map_Iterator<EXT_ID, INT_ID, ACE_LOCK> end (void);
ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rbegin (void);
ACE_Map_Reverse_Iterator<EXT_ID, INT_ID, ACE_LOCK> rend (void);
ACE_ALLOC_HOOK_DECLARE;
int bind_i (const EXT_ID &ext_id, const INT_ID &int_id);
ext_id to int_id.  Must be called
with locks held.
int shared_bind (const EXT_ID &ext_id, const INT_ID &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
    );
ext_it to int_id.  Also, recovers old
values.  Must be called with locks held.
int rebind_i (
    const EXT_ID &ext_id,
    const INT_ID &int_id,
    INT_ID &old_int_id
    );
ext_it to int_id.  Also, recovers old
values.  Must be called with locks held.
int rebind_i (const EXT_ID &ext_id, const INT_ID &int_id);
ext_it to int_id.  Must be called
with locks held.
int trybind_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, INT_ID &int_id);
int_id using ext_id as the key.  Must be
called with locks held.
int find_and_return_index (const EXT_ID &ext_id, size_t &index);
ext_id as the key.  Must be called with
locks held.
int unbind_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 unbind_i (const EXT_ID &ext_id);
ext_id as the key.  Must be called
with locks held.
int unbind_and_return_index (const EXT_ID &ext_id, size_t &index);
ext_id as the key.  Must be called
with locks held.
int resize_i (size_t size);
int close_i (void);
Map_Manager.  Must be called with locks held.
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.
size_t new_size (void);
void free_search_structure (void);
search_structure_.
size_t free_list_id (void) const;
size_t occupied_list_id (void) const;
int next_free (size_t &index);
void move_from_free_list_to_occupied_list (size_t index);
void move_from_occupied_list_to_free_list (size_t index);
void shared_move (
    size_t index,
    ACE_Map_Entry<EXT_ID, INT_ID> ¤t_list,
    size_t current_list_id,
    ACE_Map_Entry<EXT_ID, INT_ID> &new_list,
    size_t new_list_id
    );
ACE_Allocator *allocator_;
ACE_LOCK lock_;
ACE_Map_Manager.
ACE_Map_Entry<EXT_ID, INT_ID> *search_structure_;
size_t total_size_;
size_t cur_size_;
ACE_Map_Entry<EXT_ID, INT_ID> free_list_;
ACE_Map_Entry<EXT_ID, INT_ID> occupied_list_;
inline ACE_UNIMPLEMENTED_FUNC (
    void operator= (const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK> &)
    );