From 91d60fdc387e26f3236f6121af66b989feb8e142 Mon Sep 17 00:00:00 2001 From: irfan Date: Fri, 25 Dec 1998 07:54:25 +0000 Subject: *** empty log message *** --- ace/Hash_Map_Manager.h | 605 ++++++++++++++----------------------------------- 1 file changed, 172 insertions(+), 433 deletions(-) (limited to 'ace/Hash_Map_Manager.h') diff --git a/ace/Hash_Map_Manager.h b/ace/Hash_Map_Manager.h index 0c3ba0c47ce..e7f2bc612eb 100644 --- a/ace/Hash_Map_Manager.h +++ b/ace/Hash_Map_Manager.h @@ -23,481 +23,220 @@ # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ -#include "ace/Synch.h" +// Forward declaration since we are going to specialize that template +// here. The template itself requires this file so every user of the +// template should also see the specialization. +template class ACE_Hash; +template class ACE_Equal_To; -class ACE_Allocator; - -template -class ACE_Hash_Map_Entry +class ACE_Export ACE_Hash { // = TITLE - // Define an entry in the hash table. + // Function object for hashing a char public: - // = Initialization and termination methods. - ACE_Hash_Map_Entry (const EXT_ID &ext_id, - const INT_ID &int_id, - ACE_Hash_Map_Entry *next = 0, - ACE_Hash_Map_Entry *prev = 0); - // Constructor. - - ACE_Hash_Map_Entry (ACE_Hash_Map_Entry *next, - ACE_Hash_Map_Entry *prev); - // Constructor. - -# if ! defined (ACE_HAS_BROKEN_NOOP_DTORS) - ~ACE_Hash_Map_Entry (void); - // Destructor. -#endif /* ! defined (ACE_HAS_BROKEN_NOOP_DTORS) */ - - EXT_ID ext_id_; - // Key used to look up an entry. - - INT_ID int_id_; - // The contents of the entry itself. - - ACE_Hash_Map_Entry *next_; - // Pointer to the next item in the bucket of overflow nodes. - - ACE_Hash_Map_Entry *prev_; - // Pointer to the prev item in the bucket of overflow nodes. - - void dump (void) const; - // Dump the state of an object. + u_long operator () (char t) const; + // Simply returns t }; -// Forward decl. -template -class ACE_Hash_Map_Iterator_Base; - -// Forward decl. -template -class ACE_Hash_Map_Iterator; - -// Forward decl. -template -class ACE_Hash_Map_Reverse_Iterator; - -template -class ACE_Hash_Map_Manager +class ACE_Export ACE_Hash { // = TITLE - // Define a map abstraction that efficiently associates - // s with s. - // - // = DESCRIPTION - // This implementation of a map uses a hash table. Therefore, - // this class expects that the contains a method called - // . In addition, the must support . - // Both of these constraints can be alleviated via template - // specialization, as shown in the $ACE_ROOT/tests/Conn_Test.cpp - // test. - // - // This class uses an to allocate memory. The - // user can make this a persistent class by providing an - // with a persistable memory pool. + // Function object for hashing a signed char public: - friend class ACE_Hash_Map_Iterator_Base; - friend class ACE_Hash_Map_Iterator; - friend class ACE_Hash_Map_Reverse_Iterator; - - typedef EXT_ID KEY; - typedef INT_ID VALUE; - typedef ACE_Hash_Map_Entry - ENTRY; - typedef ACE_Hash_Map_Iterator - ITERATOR; - typedef ACE_Hash_Map_Reverse_Iterator - REVERSE_ITERATOR; - // = STL-style iterator typedefs. - typedef ACE_Hash_Map_Iterator - iterator; - typedef ACE_Hash_Map_Reverse_Iterator - reverse_iterator; - - // = Initialization and termination methods. - - ACE_Hash_Map_Manager (ACE_Allocator *alloc = 0); - // Initialize a with default size. - - ACE_Hash_Map_Manager (size_t size, - ACE_Allocator *alloc = 0); - // Initialize a with size . - - int open (size_t size = ACE_DEFAULT_MAP_SIZE, - ACE_Allocator *alloc = 0); - // Initialize a with elements. - - int close (void); - // Close down a and release dynamically allocated - // resources. - - ~ACE_Hash_Map_Manager (void); - // Initialize a with size . - - int bind (const EXT_ID &item, - const INT_ID &int_id); - // Associate with . If is already in the - // map then the 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 *&entry); - // Same as a normal bind, except the map entry is also passed back - // to the caller. The entry in this case will either be the newly - // created entry, or the existing one. - - int trybind (const EXT_ID &ext_id, - INT_ID &int_id); - // Associate with if and only if is not - // in the map. If is already in the map then the - // 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 *&entry); - // Same as a normal trybind, except the map entry is also passed - // back to the caller. The entry in this case will either be the - // newly created entry, or the existing one. - - int rebind (const EXT_ID &ext_id, - const INT_ID &int_id, - EXT_ID &old_ext_id, - INT_ID &old_int_id); - // Associate with . If is not in the map - // then behaves just like . Otherwise, store the old values - // of and into the "out" parameters and rebind the - // new parameters. This is very useful if you need to have an - // atomic way of updating 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 *&entry); - // Same as a normal rebind, except the map entry is also passed back - // to the caller. The entry in this case will either be the newly - // created entry, or the existing one. - - int find (const EXT_ID &ext_id, - INT_ID &int_id); - // Locate and pass out parameter via . If found, - // return 0, returns -1 if not found. - - int find (const EXT_ID &ext_id); - // Returns 0 if the is in the mapping, otherwise -1. - - int find (const EXT_ID &ext_id, - ACE_Hash_Map_Entry *&entry); - // Locate and pass out parameter via . If found, - // return 0, returns -1 if not found. - - int unbind (const EXT_ID &ext_id); - // Unbind (remove) the from the map. Don't return the - // to the caller (this is useful for collections where the - // s are *not* dynamically allocated...) - - int unbind (const EXT_ID &ext_id, - INT_ID &int_id); - // Break any association of . Returns the value of - // in case the caller needs to deallocate memory. - - int unbind (ACE_Hash_Map_Entry *entry); - // Remove entry from map. - - size_t current_size (void); - // Return the current size of the map. - - size_t total_size (void); - // Return the total size of the map. - - ACE_LOCK &mutex (void); - // Returns a reference to the underlying . This makes it - // possible to acquire the lock explicitly, which can be useful in - // some cases if you instantiate the with an - // or , or if you need to - // guard the state of an iterator. NOTE: the right name would be - // , but HP/C++ will choke on that! - - void dump (void) const; - // Dump the state of an object. - - // = STL styled iterator factory functions. - - ACE_Hash_Map_Iterator begin (void); - ACE_Hash_Map_Iterator end (void); - // Return forward iterator. - - ACE_Hash_Map_Reverse_Iterator rbegin (void); - ACE_Hash_Map_Reverse_Iterator rend (void); - // Return reverse iterator. - -protected: - // = The following methods do the actual work. - - int equal (const EXT_ID &id1, const EXT_ID &id2); - // Returns 1 if == , else 0. This is defined as a - // separate method to facilitate template specialization. - - u_long hash (const EXT_ID &ext_id); - // Compute the hash value of the . This is defined as a - // separate method to facilitate template specialization. - - // = These methods assume locks are held by private methods. - - int bind_i (const EXT_ID &ext_id, - const INT_ID &int_id); - // Performs bind. Must be called with locks held. - - int bind_i (const EXT_ID &ext_id, - const INT_ID &int_id, - ACE_Hash_Map_Entry *&entry); - // Performs bind. Must be called with locks held. - - int trybind_i (const EXT_ID &ext_id, - INT_ID &int_id); - // Performs trybind. Must be called with locks held. - - int trybind_i (const EXT_ID &ext_id, - INT_ID &int_id, - ACE_Hash_Map_Entry *&entry); - // Performs trybind. Must be called with locks held. - - int rebind_i (const EXT_ID &ext_id, - const INT_ID &int_id, - EXT_ID &old_ext_id, - INT_ID &old_int_id); - // Performs rebind. Must be called with locks held. - - 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 *&entry); - // Performs rebind. Must be called with locks held. - - int find_i (const EXT_ID &ext_id, - INT_ID &int_id); - // Performs a find of using as the key. Must be - // called with locks held. - - int find_i (const EXT_ID &ext_id); - // Performs a find using as the key. Must be called with - // locks held. - - int find_i (const EXT_ID &ext_id, - ACE_Hash_Map_Entry *&entry); - // Performs a find using as the key. Must be called with - // locks held. - - int unbind_i (const EXT_ID &ext_id, - INT_ID &int_id); - // Performs unbind. Must be called with locks held. - - int unbind_i (const EXT_ID &ext_id); - // Performs unbind. Must be called with locks held. - - int unbind_i (ACE_Hash_Map_Entry *entry); - // Performs unbind. Must be called with locks held. - - int create_buckets (size_t size); - // Resize the map. Must be called with locks held. Note, that this - // method should never be called more than once or else all the - // hashing will get screwed up as the size will change. - - int close_i (void); - // Close down a . Must be called with - // locks held. - - ACE_Allocator *allocator_; - // Pointer to a memory allocator. - - ACE_LOCK lock_; - // Synchronization variable for the MT_SAFE . - -private: - int shared_find (const EXT_ID &ext_id, - ACE_Hash_Map_Entry *&entry, - u_long &loc); - // Returns the that corresponds to . - - ACE_Hash_Map_Entry *table_; - // Array of *s, each of which points to an - // that serves as the beginning of a linked - // list of s that hash to that bucket. - - size_t total_size_; - // Total size of the hash table. - - size_t cur_size_; - // Current number of entries in the table (note that this can be - // larger than due to the bucket chaining). + u_long operator () (signed char t) const; + // Simply returns t }; -template -class ACE_Hash_Map_Iterator_Base +class ACE_Export ACE_Hash { // = TITLE - // Base iterator for the - // - // = DESCRIPTION - // This class factors out common code from its templatized - // subclasses. + // Function object for hashing an unsigned char public: - // = Initialization method. - ACE_Hash_Map_Iterator_Base (ACE_Hash_Map_Manager &mm, - int head); - // Contructor. If head != 0, the iterator constructed is positioned - // at the head of the map, it is positioned at the end otherwise. - - // = ITERATION methods. - - int next (ACE_Hash_Map_Entry *&next_entry); - // Pass back the next that hasn't been seen in the Set. - // Returns 0 when all items have been seen, else 1. - - int done (void) const; - // Returns 1 when all items have been seen, else 0. - - ACE_Hash_Map_Entry& operator* (void); - // Returns a reference to the interal element is pointing to. - - ACE_Hash_Map_Manager& map (void); - // Returns reference the Hash_Map_Manager that is being iterated - // over. - - int operator== (const ACE_Hash_Map_Iterator_Base &) const; - int operator!= (const ACE_Hash_Map_Iterator_Base &) const; - // Check if two iterators point to the same position - - ACE_ALLOC_HOOK_DECLARE; - // Declare the dynamic allocation hooks. - -protected: - int forward_i (void); - // Move forward by one element in the set. Returns 0 when there's - // no more item in the set after the current items, else 1. - - int reverse_i (void); - // Move backward by one element in the set. Returns 0 when there's - // no more item in the set before the current item, else 1. - - void dump_i (void) const; - // Dump the state of an object. - - ACE_Hash_Map_Manager *map_man_; - // Map we are iterating over. - - ssize_t index_; - // Keeps track of how far we've advanced in the table. - - ACE_Hash_Map_Entry *next_; - // Keeps track of how far we've advanced in a linked list in each - // table slot. + u_long operator () (unsigned char t) const; + // Simply returns t }; -template -class ACE_Hash_Map_Iterator : public ACE_Hash_Map_Iterator_Base +class ACE_Export ACE_Hash { // = TITLE - // Forward iterator for the . - // - // = DESCRIPTION - // This class does not perform any internal locking of the - // it is iterating upon since locking is - // inherently inefficient and/or error-prone within an STL-style - // iterator. If you require locking, you can explicitly use an - // or on the 's - // internal lock, which is accessible via its method. + // Function object for hashing a short public: - // = Initialization method. - ACE_Hash_Map_Iterator (ACE_Hash_Map_Manager &mm, - int tail = 0); - - // = Iteration methods. - - int advance (void); - // Move forward by one element in the set. Returns 0 when all the - // items in the set have been seen, else 1. + u_long operator () (short t) const; + // Simply returns t +}; - void dump (void) const; - // Dump the state of an object. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing an unsigned short +public: + u_long operator () (unsigned short t) const; + // Simply returns t +}; - // = STL styled iteration, compare, and reference functions. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing an int +public: + u_long operator () (int t) const; + // Simply returns t +}; - ACE_Hash_Map_Iterator &operator++ (void); - // Prefix advance. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing an unsigned int +public: + u_long operator () (unsigned int t) const; + // Simply returns t +}; - ACE_Hash_Map_Iterator operator++ (int); - // Postfix advance. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a long +public: + u_long operator () (long t) const; + // Simply returns t +}; - ACE_Hash_Map_Iterator &operator-- (void); - // Prefix reverse. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing an unsigned long +public: + u_long operator () (unsigned long t) const; + // Simply returns t +}; - ACE_Hash_Map_Iterator operator-- (int); - // Postfix reverse. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a const string +public: + u_long operator () (const char *t) const; + // Calls ACE::hash_pjw +}; - ACE_ALLOC_HOOK_DECLARE; - // Declare the dynamic allocation hooks. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a string +public: + u_long operator () (const char *t) const; + // Calls ACE::hash_pjw }; -template -class ACE_Hash_Map_Reverse_Iterator : public ACE_Hash_Map_Iterator_Base +#if !defined (ACE_HAS_WCHAR_TYPEDEFS_CHAR) +class ACE_Export ACE_Hash { // = TITLE - // Reverse iterator for the . - // - // = DESCRIPTION - // This class does not perform any internal locking of the - // it is iterating upon since locking is - // inherently inefficient and/or error-prone within an STL-style - // iterator. If you require locking, you can explicitly use an - // or on the 's - // internal lock, which is accessible via its method. + // Function object for hashing a const wide string public: - // = Initialization method. - ACE_Hash_Map_Reverse_Iterator (ACE_Hash_Map_Manager &mm, - int head = 0); + u_long operator () (const wchar_t *t) const; + // Calls ACE::hash_pjw +}; - // = Iteration methods. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a wide string +public: + u_long operator () (const wchar_t *t) const; + // Calls ACE::hash_pjw +}; +#endif /* ! ACE_HAS_WCHAR_TYPEDEFS_CHAR */ - int advance (void); - // Move forward by one element in the set. Returns 0 when all the - // items in the set have been seen, else 1. +#if !defined (ACE_HAS_WCHAR_TYPEDEFS_USHORT) +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a const wide string +public: + u_long operator () (const ACE_USHORT16 *t) const; + // Calls ACE::hash_pjw +}; - void dump (void) const; - // Dump the state of an object. +class ACE_Export ACE_Hash +{ + // = TITLE + // Function object for hashing a wide string +public: + u_long operator () (const ACE_USHORT16 *t) const; + // Calls ACE::hash_pjw +}; +#endif /* ! ACE_HAS_WCHAR_TYPEDEFS_USHORT */ - // = STL styled iteration, compare, and reference functions. +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two const strings +public: + int operator () (const char *lhs, + const char *rhs) const; + // Simply calls strcmp +}; - ACE_Hash_Map_Reverse_Iterator &operator++ (void); - // Prefix reverse. +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two strings +public: + int operator () (const char *lhs, + const char *rhs) const; + // Simply calls strcmp +}; - ACE_Hash_Map_Reverse_Iterator operator++ (int); - // Postfix reverse. +#if !defined (ACE_HAS_WCHAR_TYPEDEFS_CHAR) +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two const wide strings +public: + int operator () (const wchar_t *lhs, + const wchar_t *rhs) const; + // Simply calls strcmp +}; - ACE_Hash_Map_Reverse_Iterator &operator-- (void); - // Prefix advance. +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two wide strings +public: + int operator () (const wchar_t *lhs, + const wchar_t *rhs) const; + // Simply calls strcmp +}; +#endif /* ! ACE_HAS_WCHAR_TYPEDEFS_CHAR */ - ACE_Hash_Map_Reverse_Iterator operator-- (int); - // Postfix advance. +#if !defined (ACE_HAS_WCHAR_TYPEDEFS_USHORT) +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two const wide strings +public: + int operator () (const ACE_USHORT16 *lhs, + const ACE_USHORT16 *rhs) const; + // Simply calls strcmp +}; - ACE_ALLOC_HOOK_DECLARE; - // Declare the dynamic allocation hooks. +class ACE_Export ACE_Equal_To +{ + // = TITLE + // Function object for comparing two wide strings +public: + int operator () (const ACE_USHORT16 *lhs, + const ACE_USHORT16 *rhs) const; + // Simply calls strcmp }; +#endif /* ! ACE_HAS_WCHAR_TYPEDEFS_USHORT */ -#if defined (ACE_TEMPLATES_REQUIRE_SOURCE) -#include "ace/Hash_Map_Manager.cpp" -#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ +// Include the templates here. +#include "ace/Hash_Map_Manager_T.h" -#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) -#pragma implementation "Hash_Map_Manager.cpp" -#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ +#if defined (__ACE_INLINE__) +#include "ace/Hash_Map_Manager.i" +#endif /* __ACE_INLINE__ */ #endif /* ACE_HASH_MAP_MANAGER_H */ -- cgit v1.2.1