NAME

ACE_Map_Manager - Define a map abstraction that associates EXT_IDs with INT_IDs.

SYNOPSIS

#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) const; int find (const EXT_ID &ext_id) const; int unbind (const EXT_ID &ext_id); int unbind (const EXT_ID &ext_id, INT_ID &int_id); size_t current_size (void) const; size_t total_size (void) const; 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 &slot); 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 &slot); 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 &slot); void move_from_free_list_to_occupied_list (size_t slot); void move_from_occupied_list_to_free_list (size_t slot); void move_all_free_slots_from_occupied_list (void); void shared_move ( size_t slot, ACE_Map_Entry<EXT_ID, INT_ID> &current_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> &) ); };

DESCRIPTION

The 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.

Traits.

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;
    

Initialization and termination methods.

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) const;

int find (const EXT_ID &ext_id) const;

int unbind (const EXT_ID &ext_id);

int unbind (const EXT_ID &ext_id, INT_ID &int_id);

size_t current_size (void) const;

size_t total_size (void) const;

ACE_LOCK &mutex (void);

void dump (void) const;

STL styled iterator factory functions.

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;

The following methods do the actual work.

These methods assume that the locks are held by the private methods.
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 &slot);

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 &slot);

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 &slot);

void move_from_free_list_to_occupied_list (size_t slot);

void move_from_occupied_list_to_free_list (size_t slot);

void move_all_free_slots_from_occupied_list (void);

void shared_move (
    size_t slot,
    ACE_Map_Entry<EXT_ID, INT_ID> &current_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_;

Disallow these operations.

inline ACE_UNIMPLEMENTED_FUNC (
    void operator= (const ACE_Map_Manager<EXT_ID, INT_ID, ACE_LOCK> &)
    );

AUTHOR

Douglas C. Schmidt schmidt@cs.wustl.edu

LIBRARY

ace