// hash_map standard header #ifndef _HASH_MAP_ #define _HASH_MAP_ #include _STD_BEGIN // TEMPLATE CLASS _Hmap_traits template // true if multiple equivalent keys are permitted class _Hmap_traits : public _Container_base { // traits required to make _Hash behave like a map public: typedef _Kty key_type; typedef pair value_type; typedef _Tr key_compare; typedef typename _Alloc::template rebind::other allocator_type; #if _HAS_IMMUTABLE_SETS typedef _POINTER_X(value_type, allocator_type) _ITptr; typedef _REFERENCE_X(value_type, allocator_type) _IReft; #endif /* _HAS_IMMUTABLE_SETS */ enum { // make multi parameter visible as an enum constant _Multi = _Mfl}; _Hmap_traits() : comp() { // construct with default comparator } _Hmap_traits(const _Tr& _Traits) : comp(_Traits) { // construct with specified comparator } class value_compare : public binary_function { // functor for comparing two element values friend class _Hmap_traits<_Kty, _Ty, _Tr, _Alloc, _Mfl>; public: bool operator()(const value_type& _Left, const value_type& _Right) const { // test if _Left precedes _Right by comparing just keys return (comp(_Left.first, _Right.first)); } value_compare(const key_compare& _Traits) : comp(_Traits) { // construct with specified predicate } protected: key_compare comp; // the comparator predicate for keys }; static const _Kty& _Kfn(const value_type& _Val) { // extract key from element value return (_Val.first); } _Tr comp; // the comparator predicate for keys }; // TEMPLATE CLASS hash_map template >, class _Alloc = allocator > > class hash_map : public _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, false> > { // hash table of {key, mapped} values, unique keys public: typedef hash_map<_Kty, _Ty, _Tr, _Alloc> _Myt; typedef _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, false> > _Mybase; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; typedef _Tr key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_map() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_map(const key_compare& _Traits) : _Mybase(_Traits, allocator_type()) { // construct empty map from comparator } hash_map(const key_compare& _Traits, const allocator_type& _Al) : _Mybase(_Traits, _Al) { // construct empty map from comparator and allocator } template hash_map(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, const key_compare& _Traits) : _Mybase(_Traits, allocator_type()) { // construct map from sequence, comparator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, const key_compare& _Traits, const allocator_type& _Al) : _Mybase(_Traits, _Al) { // construct map from sequence, comparator, and allocator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } mapped_type& operator[](const key_type& _Keyval) { // find element matching _Keyval or insert with default mapped iterator _Where = this->lower_bound(_Keyval); if (_Where == this->end()) _Where = this->insert(value_type(_Keyval, mapped_type())).first; return ((*_Where).second); } }; template inline void swap(hash_map<_Kty, _Ty, _Tr, _Alloc>& _Left, hash_map<_Kty, _Ty, _Tr, _Alloc>& _Right) { // swap _Left and _Right hash_maps _Left.swap(_Right); } #if _HAS_STLPORT_EMULATION // TEMPLATE CLASS hash_map, PARTIAL SPECIALIZATION (for STLport) template class hash_map<_Kty, _Ty, hash<_Kty>, _Keyeq> : public _Hash<_Hmap_traits<_Kty, _Ty, _Hash_compare<_Kty, hash<_Kty>, _Keyeq>, allocator<_Kty>, false> > { // hash table of {key, mapped} values, unique keys public: typedef hash_map<_Kty, _Ty, _Keyeq> _Myt; typedef _Hash_compare<_Kty, hash<_Kty>, _Keyeq> _Mytraits; typedef _Hash<_Hmap_traits<_Kty, _Ty, _Mytraits, allocator<_Kty>, false> > _Mybase; typedef hash<_Kty> hasher; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; typedef _Keyeq key_equal; typedef _Mytraits key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_map() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_map(size_type) : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults, ignore initial size } hash_map(size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct empty map from hasher } hash_map(size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct empty map from hasher and equality comparator } template hash_map(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, ignore initial size _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct map from sequence, comparator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct map from sequence, comparator, and allocator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } hasher hash_funct() const { // return hasher object return (this->comp._Hashobj); } key_equal key_eq() const { // return equality comparator object return (this->comp._Keyeqobj); } void resize(size_type) { // accept but ignore resize hint } mapped_type& operator[](const key_type& _Keyval) { // find element matching _Keyval or insert with default mapped iterator _Where = this->lower_bound(_Keyval); if (_Where == this->end()) _Where = this->insert(value_type(_Keyval, mapped_type())).first; return ((*_Where).second); } }; _STD_END #ifndef _NAMESPACE_STLPORT #define _NAMESPACE_STLPORT stlport #endif /* _NAMESPACE_STLPORT */ namespace _NAMESPACE_STLPORT { // TEMPLATE CLASS hash_map, REPLACEMENT (for STLport) template, class _Keyeq = _STD equal_to<_Kty>, class _Alloc = _STD allocator<_STD pair > > class hash_map : public _STD _Hash<_STD _Hmap_traits<_Kty, _Ty, _STD _Hash_compare<_Kty, _Hasher, _Keyeq>, _Alloc, false> > { // hash table of {key, mapped} values, unique keys public: typedef _STD _Hash_compare<_Kty, _Hasher, _Keyeq> _Mytraits; typedef _STD _Hash<_STD _Hmap_traits<_Kty, _Ty, _Mytraits, _Alloc, false> > _Mybase; typedef _Hasher hasher; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; typedef _Keyeq key_equal; typedef _Mytraits key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_map() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_map(size_type) : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults, ignore initial size } hash_map(size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct empty map from hasher } hash_map(size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct empty map from hasher and equality comparator } template hash_map(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, ignore initial size for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct map from sequence, comparator for (; _First != _Last; ++_First) this->insert(*_First); } template hash_map(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct map from sequence, comparator, and allocator for (; _First != _Last; ++_First) this->insert(*_First); } hasher hash_funct() const { // return hasher object return (this->comp._Hashobj); } key_equal key_eq() const { // return equality comparator object return (this->comp._Keyeqobj); } void resize(size_type) { // accept but ignore resize hint } mapped_type& operator[](const key_type& _Keyval) { // find element matching _Keyval or insert with default mapped iterator _Where = this->lower_bound(_Keyval); if (_Where == this->end()) _Where = this->insert(value_type(_Keyval, mapped_type())).first; return ((*_Where).second); } }; } // namespace _NAMESPACE_STLPORT _STD_BEGIN #endif /* _HAS_STLPORT_EMULATION */ // TEMPLATE CLASS hash_multimap template >, class _Alloc = allocator > > class hash_multimap : public _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, true> > { // hash table of {key, mapped} values, non-unique keys public: typedef hash_multimap<_Kty, _Ty, _Tr, _Alloc> _Myt; typedef _Hash<_Hmap_traits<_Kty, _Ty, _Tr, _Alloc, true> > _Mybase; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; // old name, magically gone typedef _Tr key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_multimap() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_multimap(const key_compare& _Traits) : _Mybase(_Traits, allocator_type()) { // construct empty map from comparator } hash_multimap(const key_compare& _Traits, const allocator_type& _Al) : _Mybase(_Traits, _Al) { // construct empty map from comparator and allocator } template hash_multimap(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, const key_compare& _Traits) : _Mybase(_Traits, allocator_type()) { // construct map from sequence, comparator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, const key_compare& _Traits, const allocator_type& _Al) : _Mybase(_Traits, _Al) { // construct map from sequence, comparator, and allocator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } iterator insert(const value_type& _Val) { // insert a {key, mapped} value return (_Mybase::insert(_Val).first); } iterator insert(iterator _Where, const value_type& _Val) { // insert a {key, mapped} value, with hint return (_Mybase::insert(_Where, _Val)); } template void insert(_Iter _First, _Iter _Last) { // insert [_First, _Last), arbitrary iterators #if _HAS_ITERATOR_DEBUGGING _DEBUG_RANGE(_First, _Last); if (_Debug_get_cont(_First) == this) _DEBUG_ERROR("hash_multimap insertion overlaps range"); #endif /* _HAS_ITERATOR_DEBUGGING */ for (; _First != _Last; ++_First) insert(*_First); } }; template inline void swap(hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Left, hash_multimap<_Kty, _Ty, _Tr, _Alloc>& _Right) { // swap _Left and _Right hash_multimaps _Left.swap(_Right); } #if _HAS_STLPORT_EMULATION // TEMPLATE CLASS hash_multimap, PARTIAL SPECIALIZATION (for STLport) template class hash_multimap<_Kty, _Ty, hash<_Kty>, _Keyeq> : public _Hash<_Hmap_traits<_Kty, _Ty, _Hash_compare<_Kty, hash<_Kty>, _Keyeq>, allocator<_Kty>, true> > { // hash table of {key, mapped} values, non-unique keys public: typedef hash_multimap<_Kty, _Ty, _Keyeq> _Myt; typedef _Hash_compare<_Kty, hash<_Kty>, _Keyeq> _Mytraits; typedef _Hash<_Hmap_traits<_Kty, _Ty, _Mytraits, allocator<_Kty>, true> > _Mybase; typedef hash<_Kty> hasher; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; // old name, magically gone typedef _Keyeq key_equal; typedef _Mytraits key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_multimap() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_multimap(size_type) : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults, ignore initial size } hash_multimap(size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct empty map from hasher } hash_multimap(size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct empty map from hasher and equality comparator } template hash_multimap(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults, ignore initial size _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct map from sequence, comparator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct map from sequence, comparator, and allocator _DEBUG_RANGE(_First, _Last); for (; _First != _Last; ++_First) this->insert(*_First); } hasher hash_funct() const { // return hasher object return (this->comp._Hashobj); } key_equal key_eq() const { // return equality comparator object return (this->comp._Keyeqobj); } void resize(size_type) { // accept but ignore resize hint } iterator insert(const value_type& _Val) { // insert a {key, mapped} value return (_Mybase::insert(_Val).first); } iterator insert(iterator _Where, const value_type& _Val) { // insert a {key, mapped} value, with hint return (_Mybase::insert(_Where, _Val)); } template void insert(_Iter _First, _Iter _Last) { // insert [_First, _Last), arbitrary iterators #if _HAS_ITERATOR_DEBUGGING _DEBUG_RANGE(_First, _Last); if (_Debug_get_cont(_First) == this) _DEBUG_ERROR("hash_multimap insertion overlaps range"); #endif /* _HAS_ITERATOR_DEBUGGING */ for (; _First != _Last; ++_First) insert(*_First); } }; _STD_END namespace _NAMESPACE_STLPORT { // TEMPLATE CLASS hash_multimap, REPLACEMENT (for STLport) template, class _Keyeq = _STD equal_to<_Kty>, class _Alloc = _STD allocator<_STD pair > > class hash_multimap : public _STD _Hash<_STD _Hmap_traits<_Kty, _Ty, _STD _Hash_compare<_Kty, _Hasher, _Keyeq>, _Alloc, true> > { // hash table of {key, mapped} values, non-unique keys public: typedef _STD _Hash_compare<_Kty, _Hasher, _Keyeq> _Mytraits; typedef _STD _Hash<_STD _Hmap_traits<_Kty, _Ty, _Mytraits, _Alloc, true> > _Mybase; typedef _Hasher hasher; typedef _Kty key_type; typedef _Ty mapped_type; typedef _Ty referent_type; // old name, magically gone typedef _Keyeq key_equal; typedef _Mytraits key_compare; typedef typename _Mybase::value_compare value_compare; typedef typename _Mybase::allocator_type allocator_type; typedef typename _Mybase::size_type size_type; typedef typename _Mybase::difference_type difference_type; typedef typename _Mybase::pointer pointer; typedef typename _Mybase::const_pointer const_pointer; typedef typename _Mybase::reference reference; typedef typename _Mybase::const_reference const_reference; typedef typename _Mybase::iterator iterator; typedef typename _Mybase::const_iterator const_iterator; typedef typename _Mybase::reverse_iterator reverse_iterator; typedef typename _Mybase::const_reverse_iterator const_reverse_iterator; typedef typename _Mybase::value_type value_type; hash_multimap() : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults } explicit hash_multimap(size_type) : _Mybase(key_compare(), allocator_type()) { // construct empty map from defaults, ignore initial size } hash_multimap(size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct empty map from hasher } hash_multimap(size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct empty map from hasher and equality comparator } template hash_multimap(_Iter _First, _Iter _Last) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type) : _Mybase(key_compare(), allocator_type()) { // construct map from sequence, defaults, ignore initial size for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg) : _Mybase(key_compare(_Hasharg), allocator_type()) { // construct map from sequence, comparator for (; _First != _Last; ++_First) this->insert(*_First); } template hash_multimap(_Iter _First, _Iter _Last, size_type, const hasher& _Hasharg, const _Keyeq& _Keyeqarg) : _Mybase(key_compare(_Hasharg, _Keyeqarg), allocator_type()) { // construct map from sequence, comparator, and allocator for (; _First != _Last; ++_First) this->insert(*_First); } hasher hash_funct() const { // return hasher object return (this->comp._Hashobj); } key_equal key_eq() const { // return equality comparator object return (this->comp._Keyeqobj); } void resize(size_type) { // accept but ignore resize hint } iterator insert(const value_type& _Val) { // insert a {key, mapped} value return (_Mybase::insert(_Val).first); } iterator insert(iterator _Where, const value_type& _Val) { // insert a {key, mapped} value, with hint return (_Mybase::insert(_Where, _Val)); } template void insert(_Iter _First, _Iter _Last) { // insert [_First, _Last), arbitrary iterators for (; _First != _Last; ++_First) insert(*_First); } }; } // namespace _NAMESPACE_STLPORT _STD_BEGIN #endif /* _HAS_STLPORT_EMULATION */ _STD_END #endif /* _HASH_MAP_ */ /* * Copyright (c) 1992-2004 by P.J. Plauger. ALL RIGHTS RESERVED. * Consult your license regarding permissions and restrictions. V4.02:1476 */