// Copyright (C) 2003 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #undef DLIB_HASH_SET_KERNEl_ABSTRACT_ #ifdef DLIB_HASH_SET_KERNEl_ABSTRACT_ #include "../general_hash/general_hash.h" #include "../interfaces/enumerable.h" #include "../interfaces/remover.h" #include "../serialize.h" #include "../algs.h" #include <functional> namespace dlib { template < typename T, unsigned long expnum, typename mem_manager = default_memory_manager, typename compare = std::less<T> > class hash_set : public enumerable<const T>, public remover<T> { /*! REQUIREMENTS ON T domain must be comparable by compare where compare is a functor compatible with std::less and T must be hashable by general_hash (general_hash is defined in dlib/general_hash) and T must be swappable by a global swap() and T must have a default constructor REQUIREMENTS ON expnum expnum < 32 2^expnum is the number of buckets to hash items of type T into. Note that this is really just a suggestion to the hash table. Implementations are free to manage the table size however is most appropriate. REQUIREMENTS ON mem_manager must be an implementation of memory_manager/memory_manager_kernel_abstract.h or must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h mem_manager::type can be set to anything. POINTERS AND REFERENCES TO INTERNAL DATA swap() and is_member() functions do not invalidate pointers or references to internal data. All other functions have no such guarantee. INITIAL VALUE size() == 0 ENUMERATION ORDER No order is specified. Only that each element will be visited once and only once. WHAT THIS OBJECT REPRESENTS hash_set contains items of type T This object represents an unaddressed collection of items. Every element in a hash_set is unique. Also note that unless specified otherwise, no member functions of this object throw exceptions. definition of equivalent: a is equivalent to b if a < b == false and b < a == false !*/ public: typedef T type; typedef compare compare_type; typedef mem_manager mem_manager_type; hash_set( ); /*! ensures - #*this is properly initialized throws - std::bad_alloc or any exception thrown by T's constructor !*/ virtual ~hash_set( ); /*! ensures - all memory associated with *this has been released !*/ void clear( ); /*! ensures - #*this has its initial value throws - std::bad_alloc or any exception thrown by T's constructor if this exception is thrown then *this is unusable until clear() is called and succeeds !*/ void add ( T& item ); /*! requires - is_member(item) == false ensures - #is_member(item) == true - #item has an initial value for its type - #size() == size() + 1 - #at_start() == true throws - std::bad_alloc or any exception thrown by T's constructor if add() throws then it has no effect !*/ bool is_member ( const T& item ) const; /*! ensures - returns whether or not there is an element in *this equivalent to item !*/ void remove ( const T& item, T& item_copy ); /*! requires - is_member(item) == true - &item != &item_copy (i.e. item and item_copy cannot be the same variable) ensures - #is_member(item) == false - the element in *this equivalent to item has been removed and swapped into #item_copy - #size() == size() - 1 - #at_start() == true !*/ void destroy ( const T& item ); /*! requires - is_member(item) == true ensures - #is_member(item) == false - #size() == size() - 1 - #at_start() == true !*/ void swap ( hash_set& item ); /*! ensures - swaps *this and item !*/ private: // restricted functions hash_set(hash_set&); // copy constructor hash_set& operator=(hash_set&); // assignment operator }; template < typename T, unsigned long expnum, typename mem_manager, typename compare > inline void swap ( hash_set<T,expnum,mem_manager,compare>& a, hash_set<T,expnum,mem_manager,compare>& b ) { a.swap(b); } /*! provides a global swap function !*/ template < typename T, unsigned long expnum, typename mem_manager, typename compare > void deserialize ( hash_set<T,expnum,mem_manager,compare>& item, std::istream& in ); /*! provides deserialization support !*/ } #endif // DLIB_HASH_SET_KERNEl_ABSTRACT_