stl_hash_map.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:16k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1996
  3.  * Silicon Graphics Computer Systems, Inc.
  4.  *
  5.  * Permission to use, copy, modify, distribute and sell this software
  6.  * and its documentation for any purpose is hereby granted without fee,
  7.  * provided that the above copyright notice appear in all copies and
  8.  * that both that copyright notice and this permission notice appear
  9.  * in supporting documentation.  Silicon Graphics makes no
  10.  * representations about the suitability of this software for any
  11.  * purpose.  It is provided "as is" without express or implied warranty.
  12.  *
  13.  *
  14.  * Copyright (c) 1994
  15.  * Hewlett-Packard Company
  16.  *
  17.  * Permission to use, copy, modify, distribute and sell this software
  18.  * and its documentation for any purpose is hereby granted without fee,
  19.  * provided that the above copyright notice appear in all copies and
  20.  * that both that copyright notice and this permission notice appear
  21.  * in supporting documentation.  Hewlett-Packard Company makes no
  22.  * representations about the suitability of this software for any
  23.  * purpose.  It is provided "as is" without express or implied warranty.
  24.  *
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_HASH_MAP_H
  30. #define __SGI_STL_INTERNAL_HASH_MAP_H
  31. __STL_BEGIN_NAMESPACE
  32. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  33. #pragma set woff 1174
  34. #pragma set woff 1375
  35. #endif
  36. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  37. template <class _Key, class _T, class _HashFcn = hash<_Key>,
  38.           class _EqualKey = equal_to<_Key>,
  39.           class _Alloc = __STL_DEFAULT_ALLOCATOR(_T) >
  40. #else
  41. template <class _Key, class _T, class _HashFcn, class _EqualKey, 
  42.           class _Alloc = __STL_DEFAULT_ALLOCATOR(_T) >
  43. #endif
  44. class hash_map
  45. {
  46. private:
  47.   typedef hashtable<pair<const _Key,_T>,_Key,_HashFcn,
  48.                     _Select1st<pair<const _Key,_T> >,_EqualKey,_Alloc> _Ht;
  49.   _Ht _M_ht;
  50. public:
  51.   typedef typename _Ht::key_type key_type;
  52.   typedef _T data_type;
  53.   typedef _T mapped_type;
  54.   typedef typename _Ht::value_type value_type;
  55.   typedef typename _Ht::hasher hasher;
  56.   typedef typename _Ht::key_equal key_equal;
  57.   
  58.   typedef typename _Ht::size_type size_type;
  59.   typedef typename _Ht::difference_type difference_type;
  60.   typedef typename _Ht::pointer pointer;
  61.   typedef typename _Ht::const_pointer const_pointer;
  62.   typedef typename _Ht::reference reference;
  63.   typedef typename _Ht::const_reference const_reference;
  64.   typedef typename _Ht::iterator iterator;
  65.   typedef typename _Ht::const_iterator const_iterator;
  66.   typedef typename _Ht::allocator_type allocator_type;
  67.   hasher hash_funct() const { return _M_ht.hash_funct(); }
  68.   key_equal key_eq() const { return _M_ht.key_eq(); }
  69.   allocator_type get_allocator() const { return _M_ht.get_allocator(); }
  70. public:
  71.   hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
  72.   explicit hash_map(size_type __n)
  73.     : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
  74.   hash_map(size_type __n, const hasher& __hf)
  75.     : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
  76.   hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
  77.            const allocator_type& __a = allocator_type())
  78.     : _M_ht(__n, __hf, __eql, __a) {}
  79. #ifdef __STL_MEMBER_TEMPLATES
  80.   template <class _InputIterator>
  81.   hash_map(_InputIterator __f, _InputIterator __l)
  82.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  83.     { _M_ht.insert_unique(__f, __l); }
  84.   template <class _InputIterator>
  85.   hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
  86.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  87.     { _M_ht.insert_unique(__f, __l); }
  88.   template <class _InputIterator>
  89.   hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
  90.            const hasher& __hf)
  91.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  92.     { _M_ht.insert_unique(__f, __l); }
  93.   template <class _InputIterator>
  94.   hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
  95.            const hasher& __hf, const key_equal& __eql,
  96.            const allocator_type& __a = allocator_type())
  97.     : _M_ht(__n, __hf, __eql, __a)
  98.     { _M_ht.insert_unique(__f, __l); }
  99. #else
  100.   hash_map(const value_type* __f, const value_type* __l)
  101.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  102.     { _M_ht.insert_unique(__f, __l); }
  103.   hash_map(const value_type* __f, const value_type* __l, size_type __n)
  104.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  105.     { _M_ht.insert_unique(__f, __l); }
  106.   hash_map(const value_type* __f, const value_type* __l, size_type __n,
  107.            const hasher& __hf)
  108.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  109.     { _M_ht.insert_unique(__f, __l); }
  110.   hash_map(const value_type* __f, const value_type* __l, size_type __n,
  111.            const hasher& __hf, const key_equal& __eql,
  112.            const allocator_type& __a = allocator_type())
  113.     : _M_ht(__n, __hf, __eql, __a)
  114.     { _M_ht.insert_unique(__f, __l); }
  115.   hash_map(const_iterator __f, const_iterator __l)
  116.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  117.     { _M_ht.insert_unique(__f, __l); }
  118.   hash_map(const_iterator __f, const_iterator __l, size_type __n)
  119.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  120.     { _M_ht.insert_unique(__f, __l); }
  121.   hash_map(const_iterator __f, const_iterator __l, size_type __n,
  122.            const hasher& __hf)
  123.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  124.     { _M_ht.insert_unique(__f, __l); }
  125.   hash_map(const_iterator __f, const_iterator __l, size_type __n,
  126.            const hasher& __hf, const key_equal& __eql,
  127.            const allocator_type& __a = allocator_type())
  128.     : _M_ht(__n, __hf, __eql, __a)
  129.     { _M_ht.insert_unique(__f, __l); }
  130. #endif /*__STL_MEMBER_TEMPLATES */
  131. public:
  132.   size_type size() const { return _M_ht.size(); }
  133.   size_type max_size() const { return _M_ht.max_size(); }
  134.   bool empty() const { return _M_ht.empty(); }
  135.   void swap(hash_map& __hs) { _M_ht.swap(__hs._M_ht); }
  136.   friend bool
  137.   operator== __STL_NULL_TMPL_ARGS (const hash_map&, const hash_map&);
  138.   iterator begin() { return _M_ht.begin(); }
  139.   iterator end() { return _M_ht.end(); }
  140.   const_iterator begin() const { return _M_ht.begin(); }
  141.   const_iterator end() const { return _M_ht.end(); }
  142. public:
  143.   pair<iterator,bool> insert(const value_type& __obj)
  144.     { return _M_ht.insert_unique(__obj); }
  145. #ifdef __STL_MEMBER_TEMPLATES
  146.   template <class _InputIterator>
  147.   void insert(_InputIterator __f, _InputIterator __l)
  148.     { _M_ht.insert_unique(__f,__l); }
  149. #else
  150.   void insert(const value_type* __f, const value_type* __l) {
  151.     _M_ht.insert_unique(__f,__l);
  152.   }
  153.   void insert(const_iterator __f, const_iterator __l)
  154.     { _M_ht.insert_unique(__f, __l); }
  155. #endif /*__STL_MEMBER_TEMPLATES */
  156.   pair<iterator,bool> insert_noresize(const value_type& __obj)
  157.     { return _M_ht.insert_unique_noresize(__obj); }    
  158.   iterator find(const key_type& __key) { return _M_ht.find(__key); }
  159.   const_iterator find(const key_type& __key) const 
  160.     { return _M_ht.find(__key); }
  161.   _T& operator[](const key_type& __key) {
  162.     return _M_ht.find_or_insert(value_type(__key, _T())).second;
  163.   }
  164.   size_type count(const key_type& __key) const { return _M_ht.count(__key); }
  165.   
  166.   pair<iterator, iterator> equal_range(const key_type& __key)
  167.     { return _M_ht.equal_range(__key); }
  168.   pair<const_iterator, const_iterator>
  169.   equal_range(const key_type& __key) const
  170.     { return _M_ht.equal_range(__key); }
  171.   size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
  172.   void erase(iterator __it) { _M_ht.erase(__it); }
  173.   void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
  174.   void clear() { _M_ht.clear(); }
  175.   void resize(size_type __hint) { _M_ht.resize(__hint); }
  176.   size_type bucket_count() const { return _M_ht.bucket_count(); }
  177.   size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
  178.   size_type elems_in_bucket(size_type __n) const
  179.     { return _M_ht.elems_in_bucket(__n); }
  180. };
  181. template <class _Key, class _T, class _HashFcn, class _EqualKey, class _Alloc>
  182. inline bool 
  183. operator==(const hash_map<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm1,
  184.            const hash_map<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm2)
  185. {
  186.   return __hm1._M_ht == __hm2._M_ht;
  187. }
  188. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  189. template <class _Key, class _T, class _HashFcn, class _EqualKey, class _Alloc>
  190. inline void 
  191. swap(hash_map<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm1,
  192.      hash_map<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm2)
  193. {
  194.   __hm1.swap(__hm2);
  195. }
  196. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  197. #ifndef __STL_LIMITED_DEFAULT_TEMPLATES
  198. template <class _Key, class _T, class _HashFcn = hash<_Key>,
  199.           class _EqualKey = equal_to<_Key>,
  200.           class _Alloc = __STL_DEFAULT_ALLOCATOR(_T) >
  201. #else
  202. template <class _Key, class _T, class _HashFcn, class _EqualKey,
  203.           class _Alloc = __STL_DEFAULT_ALLOCATOR(_T) >
  204. #endif
  205. class hash_multimap
  206. {
  207. private:
  208.   typedef hashtable<pair<const _Key, _T>, _Key, _HashFcn,
  209.                     _Select1st<pair<const _Key, _T> >, _EqualKey, _Alloc> _Ht;
  210.   _Ht _M_ht;
  211. public:
  212.   typedef typename _Ht::key_type key_type;
  213.   typedef _T data_type;
  214.   typedef _T mapped_type;
  215.   typedef typename _Ht::value_type value_type;
  216.   typedef typename _Ht::hasher hasher;
  217.   typedef typename _Ht::key_equal key_equal;
  218.   typedef typename _Ht::size_type size_type;
  219.   typedef typename _Ht::difference_type difference_type;
  220.   typedef typename _Ht::pointer pointer;
  221.   typedef typename _Ht::const_pointer const_pointer;
  222.   typedef typename _Ht::reference reference;
  223.   typedef typename _Ht::const_reference const_reference;
  224.   typedef typename _Ht::iterator iterator;
  225.   typedef typename _Ht::const_iterator const_iterator;
  226.   typedef typename _Ht::allocator_type allocator_type;
  227.   hasher hash_funct() const { return _M_ht.hash_funct(); }
  228.   key_equal key_eq() const { return _M_ht.key_eq(); }
  229.   allocator_type get_allocator() const { return _M_ht.get_allocator(); }
  230. public:
  231.   hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
  232.   explicit hash_multimap(size_type __n)
  233.     : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
  234.   hash_multimap(size_type __n, const hasher& __hf)
  235.     : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
  236.   hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
  237.                 const allocator_type& __a = allocator_type())
  238.     : _M_ht(__n, __hf, __eql, __a) {}
  239. #ifdef __STL_MEMBER_TEMPLATES
  240.   template <class _InputIterator>
  241.   hash_multimap(_InputIterator __f, _InputIterator __l)
  242.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  243.     { _M_ht.insert_equal(__f, __l); }
  244.   template <class _InputIterator>
  245.   hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
  246.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  247.     { _M_ht.insert_equal(__f, __l); }
  248.   template <class _InputIterator>
  249.   hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
  250.                 const hasher& __hf)
  251.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  252.     { _M_ht.insert_equal(__f, __l); }
  253.   template <class _InputIterator>
  254.   hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
  255.                 const hasher& __hf, const key_equal& __eql,
  256.                 const allocator_type& __a = allocator_type())
  257.     : _M_ht(__n, __hf, __eql, __a)
  258.     { _M_ht.insert_equal(__f, __l); }
  259. #else
  260.   hash_multimap(const value_type* __f, const value_type* __l)
  261.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  262.     { _M_ht.insert_equal(__f, __l); }
  263.   hash_multimap(const value_type* __f, const value_type* __l, size_type __n)
  264.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  265.     { _M_ht.insert_equal(__f, __l); }
  266.   hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
  267.                 const hasher& __hf)
  268.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  269.     { _M_ht.insert_equal(__f, __l); }
  270.   hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
  271.                 const hasher& __hf, const key_equal& __eql,
  272.                 const allocator_type& __a = allocator_type())
  273.     : _M_ht(__n, __hf, __eql, __a)
  274.     { _M_ht.insert_equal(__f, __l); }
  275.   hash_multimap(const_iterator __f, const_iterator __l)
  276.     : _M_ht(100, hasher(), key_equal(), allocator_type())
  277.     { _M_ht.insert_equal(__f, __l); }
  278.   hash_multimap(const_iterator __f, const_iterator __l, size_type __n)
  279.     : _M_ht(__n, hasher(), key_equal(), allocator_type())
  280.     { _M_ht.insert_equal(__f, __l); }
  281.   hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
  282.                 const hasher& __hf)
  283.     : _M_ht(__n, __hf, key_equal(), allocator_type())
  284.     { _M_ht.insert_equal(__f, __l); }
  285.   hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
  286.                 const hasher& __hf, const key_equal& __eql,
  287.                 const allocator_type& __a = allocator_type())
  288.     : _M_ht(__n, __hf, __eql, __a)
  289.     { _M_ht.insert_equal(__f, __l); }
  290. #endif /*__STL_MEMBER_TEMPLATES */
  291. public:
  292.   size_type size() const { return _M_ht.size(); }
  293.   size_type max_size() const { return _M_ht.max_size(); }
  294.   bool empty() const { return _M_ht.empty(); }
  295.   void swap(hash_multimap& __hs) { _M_ht.swap(__hs._M_ht); }
  296.   friend bool
  297.   operator== __STL_NULL_TMPL_ARGS (const hash_multimap&,
  298.                                    const hash_multimap&);
  299.   iterator begin() { return _M_ht.begin(); }
  300.   iterator end() { return _M_ht.end(); }
  301.   const_iterator begin() const { return _M_ht.begin(); }
  302.   const_iterator end() const { return _M_ht.end(); }
  303. public:
  304.   iterator insert(const value_type& __obj) 
  305.     { return _M_ht.insert_equal(__obj); }
  306. #ifdef __STL_MEMBER_TEMPLATES
  307.   template <class _InputIterator>
  308.   void insert(_InputIterator __f, _InputIterator __l) 
  309.     { _M_ht.insert_equal(__f,__l); }
  310. #else
  311.   void insert(const value_type* __f, const value_type* __l) {
  312.     _M_ht.insert_equal(__f,__l);
  313.   }
  314.   void insert(const_iterator __f, const_iterator __l) 
  315.     { _M_ht.insert_equal(__f, __l); }
  316. #endif /*__STL_MEMBER_TEMPLATES */
  317.   iterator insert_noresize(const value_type& __obj)
  318.     { return _M_ht.insert_equal_noresize(__obj); }    
  319.   iterator find(const key_type& __key) { return _M_ht.find(__key); }
  320.   const_iterator find(const key_type& __key) const 
  321.     { return _M_ht.find(__key); }
  322.   size_type count(const key_type& __key) const { return _M_ht.count(__key); }
  323.   
  324.   pair<iterator, iterator> equal_range(const key_type& __key)
  325.     { return _M_ht.equal_range(__key); }
  326.   pair<const_iterator, const_iterator>
  327.   equal_range(const key_type& __key) const
  328.     { return _M_ht.equal_range(__key); }
  329.   size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
  330.   void erase(iterator __it) { _M_ht.erase(__it); }
  331.   void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
  332.   void clear() { _M_ht.clear(); }
  333. public:
  334.   void resize(size_type __hint) { _M_ht.resize(__hint); }
  335.   size_type bucket_count() const { return _M_ht.bucket_count(); }
  336.   size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
  337.   size_type elems_in_bucket(size_type __n) const
  338.     { return _M_ht.elems_in_bucket(__n); }
  339. };
  340. template <class _Key, class _T, class _HF, class _EqKey, class _Alloc>
  341. inline bool 
  342. operator==(const hash_multimap<_Key,_T,_HF,_EqKey,_Alloc>& __hm1,
  343.            const hash_multimap<_Key,_T,_HF,_EqKey,_Alloc>& __hm2)
  344. {
  345.   return __hm1._M_ht == __hm2._M_ht;
  346. }
  347. #ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
  348. template <class _Key, class _T, class _HashFcn, class _EqualKey, class _Alloc>
  349. inline void 
  350. swap(hash_multimap<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm1,
  351.      hash_multimap<_Key,_T,_HashFcn,_EqualKey,_Alloc>& __hm2)
  352. {
  353.   __hm1.swap(__hm2);
  354. }
  355. #endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
  356. #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
  357. #pragma reset woff 1174
  358. #pragma reset woff 1375
  359. #endif
  360. __STL_END_NAMESPACE
  361. #endif /* __SGI_STL_INTERNAL_HASH_MAP_H */
  362. // Local Variables:
  363. // mode:C++
  364. // End: