| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: hashset.h
- // Purpose: interface of wxHashSet
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @class wxHashSet
- This is a simple, type-safe, and reasonably efficient hash set class,
- whose interface is a subset of the interface of STL containers.
- The interface is similar to std::tr1::hash_set or std::set classes but
- notice that, unlike std::set, the contents of a hash set is not sorted.
- Example:
- @code
- class MyClass { ... };
- // same, with MyClass* keys (only uses pointer equality!)
- WX_DECLARE_HASH_SET( MyClass*, wxPointerHash, wxPointerEqual, MySet1 );
- // same, with int keys
- WX_DECLARE_HASH_SET( int, wxIntegerHash, wxIntegerEqual, MySet2 );
- // declare a hash set with string keys
- WX_DECLARE_HASH_SET( wxString, wxStringHash, wxStringEqual, MySet3 );
- MySet1 h1;
- MySet2 h1;
- MySet3 h3;
- // store and retrieve values
- h1.insert( new MyClass( 1 ) );
- h3.insert( "foo" );
- h3.insert( "bar" );
- h3.insert( "baz" );
- int size = h3.size(); // now is three
- bool has_foo = h3.find( "foo" ) != h3.end();
- h3.insert( "bar" ); // still has size three
- // iterate over all the elements in the class
- MySet3::iterator it;
- for( it = h3.begin(); it != h3.end(); ++it )
- {
- wxString key = *it;
- // do something useful with key
- }
- @endcode
- @section hashset_declaringnew Declaring new hash set types
- @code
- WX_DECLARE_HASH_SET( KEY_T, // type of the keys
- HASH_T, // hasher
- KEY_EQ_T, // key equality predicate
- CLASSNAME); // name of the class
- @endcode
- The HASH_T and KEY_EQ_T are the types used for the hashing function and key
- comparison. wxWidgets provides three predefined hashing functions:
- wxIntegerHash for integer types ( int, long, short, and their unsigned counterparts ),
- wxStringHash for strings ( wxString, wxChar*, char* ), and wxPointerHash for
- any kind of pointer.
- Similarly three equality predicates: wxIntegerEqual, wxStringEqual, wxPointerEqual
- are provided. Using this you could declare a hash set using int values like this:
- @code
- WX_DECLARE_HASH_SET( int,
- wxIntegerHash,
- wxIntegerEqual,
- MySet );
- // using an user-defined class for keys
- class MyKey { ... };
- // hashing function
- class MyKeyHash
- {
- public:
- MyKeyHash() { }
- unsigned long operator()( const MyKey& k ) const
- {
- // compute the hash
- }
- MyKeyHash& operator=(const MyKeyHash&) { return *this; }
- };
- // comparison operator
- class MyKeyEqual
- {
- public:
- MyKeyEqual() { }
- bool operator()( const MyKey& a, const MyKey& b ) const
- {
- // compare for equality
- }
- MyKeyEqual& operator=(const MyKeyEqual&) { return *this; }
- };
- WX_DECLARE_HASH_SET( MyKey, // type of the keys
- MyKeyHash, // hasher
- MyKeyEqual, // key equality predicate
- CLASSNAME); // name of the class
- @endcode
- @section hashset_types Types
- In the documentation below you should replace wxHashSet with the name you
- used in the class declaration.
- - wxHashSet::key_type: Type of the hash keys
- - wxHashSet::mapped_type: Type of hash keys
- - wxHashSet::value_type: Type of hash keys
- - wxHashSet::iterator: Used to enumerate all the elements in a hash set;
- it is similar to a value_type*
- - wxHashSet::const_iterator: Used to enumerate all the elements in a constant
- hash set; it is similar to a const value_type*
- - wxHashSet::size_type: Used for sizes
- - wxHashSet::Insert_Result: The return value for insert()
- @section hashset_iter Iterators
- An iterator is similar to a pointer, and so you can use the usual pointer
- operations: ++it ( and it++ ) to move to the next element, *it to access the
- element pointed to, *it to access the value of the element pointed to.
- Hash sets provide forward only iterators, this means that you can't use --it,
- it + 3, it1 - it2.
- @library{wxbase}
- @category{containers}
- */
- class wxHashSet
- {
- public:
- /**
- The size parameter is just a hint, the table will resize automatically
- to preserve performance.
- */
- wxHashSet(size_type size = 10);
- /**
- Copy constructor.
- */
- wxHashSet(const wxHashSet& set);
- //@{
- /**
- Returns an iterator pointing at the first element of the hash set.
- Please remember that hash sets do not guarantee ordering.
- */
- const_iterator begin() const;
- iterator begin();
- //@}
- /**
- Removes all elements from the hash set.
- */
- void clear();
- /**
- Counts the number of elements with the given key present in the set.
- This function returns only 0 or 1.
- */
- size_type count(const key_type& key) const;
- /**
- Returns @true if the hash set does not contain any elements, @false otherwise.
- */
- bool empty() const;
- //@{
- /**
- Returns an iterator pointing at the one-after-the-last element of the hash set.
- Please remember that hash sets do not guarantee ordering.
- */
- const_iterator end() const;
- iterator end();
- //@}
- /**
- Erases the element with the given key, and returns the number of elements
- erased (either 0 or 1).
- */
- size_type erase(const key_type& key);
- //@{
- /**
- Erases the element pointed to by the iterator. After the deletion
- the iterator is no longer valid and must not be used.
- */
- void erase(iterator it);
- void erase(const_iterator it);
- //@}
- //@{
- /**
- If an element with the given key is present, the functions returns
- an iterator pointing at that element, otherwise an invalid iterator
- is returned.
- i.e.
- @code
- hashset.find( non_existent_key ) == hashset.end()
- @endcode
- */
- iterator find(const key_type& key) const;
- const_iterator find(const key_type& key) const;
- //@}
- /**
- Inserts the given value in the hash set.
- The return value is equivalent to a
- @code std::pair<wxHashMap::iterator, bool> @endcode
- The iterator points to the inserted element, the boolean value is @true
- if @a v was actually inserted.
- */
- Insert_Result insert(const value_type& v);
- /**
- Returns the number of elements in the set.
- */
- size_type size() const;
- };
|