Home | History | Annotate | Download | only in stl
      1 /*
      2  *
      3  * Copyright (c) 1994
      4  * Hewlett-Packard Company
      5  *
      6  * Copyright (c) 1996,1997
      7  * Silicon Graphics Computer Systems, Inc.
      8  *
      9  * Copyright (c) 1997
     10  * Moscow Center for SPARC Technology
     11  *
     12  * Copyright (c) 1999
     13  * Boris Fomitchev
     14  *
     15  * This material is provided "as is", with absolutely no warranty expressed
     16  * or implied. Any use is at your own risk.
     17  *
     18  * Permission to use or copy this software for any purpose is hereby granted
     19  * without fee, provided the above notices are retained on all copies.
     20  * Permission to modify the code and to distribute modified code is granted,
     21  * provided the above notices are retained, and a notice that the code was
     22  * modified is included with the above copyright notice.
     23  *
     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 
     30 #ifndef _STLP_INTERNAL_HASH_SET_H
     31 #define _STLP_INTERNAL_HASH_SET_H
     32 
     33 #ifndef _STLP_INTERNAL_HASHTABLE_H
     34 #  include <stl/_hashtable.h>
     35 #endif
     36 
     37 _STLP_BEGIN_NAMESPACE
     38 
     39 //Specific iterator traits creation
     40 _STLP_CREATE_HASH_ITERATOR_TRAITS(HashSetTraitsT, Const_traits)
     41 
     42 template <class _Value, _STLP_DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
     43           _STLP_DFL_TMPL_PARAM(_EqualKey, equal_to<_Value>),
     44           _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Value>) >
     45 class hash_set
     46 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
     47                : public __stlport_class<hash_set<_Value, _HashFcn, _EqualKey, _Alloc> >
     48 #endif
     49 {
     50   typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
     51   //Specific iterator traits creation
     52   typedef _STLP_PRIV _HashSetTraitsT<_Value> _HashSetTraits;
     53 public:
     54   typedef hashtable<_Value, _Value, _HashFcn,
     55                     _HashSetTraits, _STLP_PRIV _Identity<_Value>, _EqualKey, _Alloc> _Ht;
     56 public:
     57   typedef typename _Ht::key_type key_type;
     58   typedef typename _Ht::value_type value_type;
     59   typedef typename _Ht::hasher hasher;
     60   typedef typename _Ht::key_equal key_equal;
     61 
     62   typedef typename _Ht::size_type size_type;
     63   typedef typename _Ht::difference_type difference_type;
     64   typedef typename _Ht::pointer         pointer;
     65   typedef typename _Ht::const_pointer   const_pointer;
     66   typedef typename _Ht::reference       reference;
     67   typedef typename _Ht::const_reference const_reference;
     68 
     69   typedef typename _Ht::iterator iterator;
     70   typedef typename _Ht::const_iterator const_iterator;
     71 
     72   typedef typename _Ht::allocator_type allocator_type;
     73 
     74   hasher hash_funct() const { return _M_ht.hash_funct(); }
     75   key_equal key_eq() const { return _M_ht.key_eq(); }
     76   allocator_type get_allocator() const { return _M_ht.get_allocator(); }
     77 
     78 private:
     79   _Ht _M_ht;
     80   _STLP_KEY_TYPE_FOR_CONT_EXT(key_type)
     81 
     82 public:
     83   hash_set()
     84     : _M_ht(0, hasher(), key_equal(), allocator_type()) {}
     85   explicit hash_set(size_type __n)
     86     : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
     87   hash_set(size_type __n, const hasher& __hf)
     88     : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
     89 #if !defined (_STLP_DONT_SUP_DFLT_PARAM)
     90   hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
     91            const allocator_type& __a = allocator_type())
     92 #else
     93   hash_set(size_type __n, const hasher& __hf, const key_equal& __eql)
     94     : _M_ht(__n, __hf, __eql, allocator_type()) {}
     95   hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
     96            const allocator_type& __a)
     97 #endif
     98     : _M_ht(__n, __hf, __eql, __a) {}
     99 
    100 #if !defined (_STLP_NO_MOVE_SEMANTIC)
    101   hash_set(__move_source<_Self> src)
    102     : _M_ht(__move_source<_Ht>(src.get()._M_ht)) {}
    103 #endif
    104 
    105 #if defined (_STLP_MEMBER_TEMPLATES)
    106   template <class _InputIterator>
    107   hash_set(_InputIterator __f, _InputIterator __l)
    108     : _M_ht(0, hasher(), key_equal(), allocator_type())
    109     { _M_ht.insert_unique(__f, __l); }
    110   template <class _InputIterator>
    111   hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
    112     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    113     { _M_ht.insert_unique(__f, __l); }
    114   template <class _InputIterator>
    115   hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
    116            const hasher& __hf)
    117     : _M_ht(__n, __hf, key_equal(), allocator_type())
    118     { _M_ht.insert_unique(__f, __l); }
    119   template <class _InputIterator>
    120   hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
    121            const hasher& __hf, const key_equal& __eql,
    122            const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
    123     : _M_ht(__n, __hf, __eql, __a)
    124     { _M_ht.insert_unique(__f, __l); }
    125 #  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
    126   template <class _InputIterator>
    127   hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
    128            const hasher& __hf, const key_equal& __eql)
    129     : _M_ht(__n, __hf, __eql, allocator_type())
    130     { _M_ht.insert_unique(__f, __l); }
    131 #  endif
    132 #else
    133   hash_set(const value_type* __f, const value_type* __l)
    134     : _M_ht(0, hasher(), key_equal(), allocator_type())
    135     { _M_ht.insert_unique(__f, __l); }
    136   hash_set(const value_type* __f, const value_type* __l, size_type __n)
    137     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    138     { _M_ht.insert_unique(__f, __l); }
    139   hash_set(const value_type* __f, const value_type* __l, size_type __n,
    140            const hasher& __hf)
    141     : _M_ht(__n, __hf, key_equal(), allocator_type())
    142     { _M_ht.insert_unique(__f, __l); }
    143   hash_set(const value_type* __f, const value_type* __l, size_type __n,
    144            const hasher& __hf, const key_equal& __eql,
    145            const allocator_type& __a = allocator_type())
    146     : _M_ht(__n, __hf, __eql, __a)
    147     { _M_ht.insert_unique(__f, __l); }
    148 
    149   hash_set(const_iterator __f, const_iterator __l)
    150     : _M_ht(0, hasher(), key_equal(), allocator_type())
    151     { _M_ht.insert_unique(__f, __l); }
    152   hash_set(const_iterator __f, const_iterator __l, size_type __n)
    153     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    154     { _M_ht.insert_unique(__f, __l); }
    155   hash_set(const_iterator __f, const_iterator __l, size_type __n,
    156            const hasher& __hf)
    157     : _M_ht(__n, __hf, key_equal(), allocator_type())
    158     { _M_ht.insert_unique(__f, __l); }
    159   hash_set(const_iterator __f, const_iterator __l, size_type __n,
    160            const hasher& __hf, const key_equal& __eql,
    161            const allocator_type& __a = allocator_type())
    162     : _M_ht(__n, __hf, __eql, __a)
    163     { _M_ht.insert_unique(__f, __l); }
    164 #endif /*_STLP_MEMBER_TEMPLATES */
    165 
    166 public:
    167   size_type size() const { return _M_ht.size(); }
    168   size_type max_size() const { return _M_ht.max_size(); }
    169   bool empty() const { return _M_ht.empty(); }
    170   void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
    171 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
    172   void _M_swap_workaround(_Self& __x) { swap(__x); }
    173 #endif
    174 
    175   iterator begin() { return _M_ht.begin(); }
    176   iterator end() { return _M_ht.end(); }
    177   const_iterator begin() const { return _M_ht.begin(); }
    178   const_iterator end() const { return _M_ht.end(); }
    179 
    180 public:
    181   pair<iterator, bool> insert(const value_type& __obj)
    182   { return _M_ht.insert_unique(__obj); }
    183 #if defined (_STLP_MEMBER_TEMPLATES)
    184   template <class _InputIterator>
    185   void insert(_InputIterator __f, _InputIterator __l)
    186 #else
    187   void insert(const_iterator __f, const_iterator __l)
    188   {_M_ht.insert_unique(__f, __l); }
    189   void insert(const value_type* __f, const value_type* __l)
    190 #endif
    191   { _M_ht.insert_unique(__f,__l); }
    192 
    193   pair<iterator, bool> insert_noresize(const value_type& __obj)
    194   { return _M_ht.insert_unique_noresize(__obj); }
    195 
    196   _STLP_TEMPLATE_FOR_CONT_EXT
    197   iterator find(const _KT& __key) { return _M_ht.find(__key); }
    198   _STLP_TEMPLATE_FOR_CONT_EXT
    199   const_iterator find(const _KT& __key) const { return _M_ht.find(__key); }
    200 
    201   _STLP_TEMPLATE_FOR_CONT_EXT
    202   size_type count(const _KT& __key) const { return _M_ht.count(__key); }
    203 
    204   _STLP_TEMPLATE_FOR_CONT_EXT
    205   pair<iterator, iterator> equal_range(const _KT& __key)
    206   { return _M_ht.equal_range(__key); }
    207   _STLP_TEMPLATE_FOR_CONT_EXT
    208   pair<const_iterator, const_iterator> equal_range(const _KT& __key) const
    209   { return _M_ht.equal_range(__key); }
    210 
    211   _STLP_TEMPLATE_FOR_CONT_EXT
    212   size_type erase(const _KT& __key) {return _M_ht.erase(__key); }
    213   void erase(iterator __it) { _M_ht.erase(__it); }
    214   void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
    215   void clear() { _M_ht.clear(); }
    216 
    217 public:
    218   void resize(size_type __hint) { _M_ht.resize(__hint); }
    219   size_type bucket_count() const { return _M_ht.bucket_count(); }
    220   size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
    221   size_type elems_in_bucket(size_type __n) const
    222   { return _M_ht.elems_in_bucket(__n); }
    223 };
    224 
    225 //Specific iterator traits creation
    226 _STLP_CREATE_HASH_ITERATOR_TRAITS(HashMultisetTraitsT, Const_traits)
    227 
    228 template <class _Value, _STLP_DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
    229           _STLP_DFL_TMPL_PARAM(_EqualKey, equal_to<_Value>),
    230           _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Value>) >
    231 class hash_multiset
    232 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
    233                     : public __stlport_class<hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> >
    234 #endif
    235 {
    236   typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
    237   //Specific iterator traits creation
    238   typedef _STLP_PRIV _HashMultisetTraitsT<_Value> _HashMultisetTraits;
    239 public:
    240   typedef hashtable<_Value, _Value, _HashFcn,
    241                     _HashMultisetTraits, _STLP_PRIV _Identity<_Value>, _EqualKey, _Alloc> _Ht;
    242 
    243   typedef typename _Ht::key_type key_type;
    244   typedef typename _Ht::value_type value_type;
    245   typedef typename _Ht::hasher hasher;
    246   typedef typename _Ht::key_equal key_equal;
    247 
    248   typedef typename _Ht::size_type size_type;
    249   typedef typename _Ht::difference_type difference_type;
    250   typedef typename _Ht::pointer       pointer;
    251   typedef typename _Ht::const_pointer const_pointer;
    252   typedef typename _Ht::reference reference;
    253   typedef typename _Ht::const_reference const_reference;
    254 
    255   typedef typename _Ht::iterator iterator;
    256   typedef typename _Ht::const_iterator const_iterator;
    257 
    258   typedef typename _Ht::allocator_type allocator_type;
    259 
    260   hasher hash_funct() const { return _M_ht.hash_funct(); }
    261   key_equal key_eq() const { return _M_ht.key_eq(); }
    262   allocator_type get_allocator() const { return _M_ht.get_allocator(); }
    263 
    264 private:
    265   _Ht _M_ht;
    266   _STLP_KEY_TYPE_FOR_CONT_EXT(key_type)
    267 
    268 public:
    269   hash_multiset()
    270     : _M_ht(0, hasher(), key_equal(), allocator_type()) {}
    271   explicit hash_multiset(size_type __n)
    272     : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
    273   hash_multiset(size_type __n, const hasher& __hf)
    274     : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
    275   hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql)
    276     : _M_ht(__n, __hf, __eql, allocator_type()) {}
    277   hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
    278                 const allocator_type& __a)
    279     : _M_ht(__n, __hf, __eql, __a) {}
    280 
    281 #if !defined (_STLP_NO_MOVE_SEMANTIC)
    282   hash_multiset(__move_source<_Self> src)
    283     : _M_ht(__move_source<_Ht>(src.get()._M_ht)) {}
    284 #endif
    285 
    286 #if defined (_STLP_MEMBER_TEMPLATES)
    287   template <class _InputIterator>
    288   hash_multiset(_InputIterator __f, _InputIterator __l)
    289     : _M_ht(0, hasher(), key_equal(), allocator_type())
    290     { _M_ht.insert_equal(__f, __l); }
    291   template <class _InputIterator>
    292   hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
    293     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    294     { _M_ht.insert_equal(__f, __l); }
    295   template <class _InputIterator>
    296   hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
    297                 const hasher& __hf)
    298     : _M_ht(__n, __hf, key_equal(), allocator_type())
    299     { _M_ht.insert_equal(__f, __l); }
    300 
    301   template <class _InputIterator>
    302   hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
    303                 const hasher& __hf, const key_equal& __eql,
    304                 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
    305     : _M_ht(__n, __hf, __eql, __a)
    306     { _M_ht.insert_equal(__f, __l); }
    307 #  if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
    308   template <class _InputIterator>
    309   hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
    310                 const hasher& __hf, const key_equal& __eql)
    311     : _M_ht(__n, __hf, __eql, allocator_type())
    312     { _M_ht.insert_equal(__f, __l); }
    313 #  endif
    314 #else
    315   hash_multiset(const value_type* __f, const value_type* __l)
    316     : _M_ht(0, hasher(), key_equal(), allocator_type())
    317     { _M_ht.insert_equal(__f, __l); }
    318   hash_multiset(const value_type* __f, const value_type* __l, size_type __n)
    319     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    320     { _M_ht.insert_equal(__f, __l); }
    321   hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
    322                 const hasher& __hf)
    323     : _M_ht(__n, __hf, key_equal(), allocator_type())
    324     { _M_ht.insert_equal(__f, __l); }
    325   hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
    326                 const hasher& __hf, const key_equal& __eql,
    327                 const allocator_type& __a = allocator_type())
    328     : _M_ht(__n, __hf, __eql, __a)
    329     { _M_ht.insert_equal(__f, __l); }
    330 
    331   hash_multiset(const_iterator __f, const_iterator __l)
    332     : _M_ht(0, hasher(), key_equal(), allocator_type())
    333     { _M_ht.insert_equal(__f, __l); }
    334   hash_multiset(const_iterator __f, const_iterator __l, size_type __n)
    335     : _M_ht(__n, hasher(), key_equal(), allocator_type())
    336     { _M_ht.insert_equal(__f, __l); }
    337   hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
    338                 const hasher& __hf)
    339     : _M_ht(__n, __hf, key_equal(), allocator_type())
    340     { _M_ht.insert_equal(__f, __l); }
    341   hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
    342                 const hasher& __hf, const key_equal& __eql,
    343                 const allocator_type& __a = allocator_type())
    344     : _M_ht(__n, __hf, __eql, __a)
    345     { _M_ht.insert_equal(__f, __l); }
    346 #endif /*_STLP_MEMBER_TEMPLATES */
    347 
    348 public:
    349   size_type size() const { return _M_ht.size(); }
    350   size_type max_size() const { return _M_ht.max_size(); }
    351   bool empty() const { return _M_ht.empty(); }
    352   void swap(_Self& hs) { _M_ht.swap(hs._M_ht); }
    353 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
    354   void _M_swap_workaround(_Self& __x) { swap(__x); }
    355 #endif
    356 
    357   iterator begin() { return _M_ht.begin(); }
    358   iterator end() { return _M_ht.end(); }
    359   const_iterator begin() const { return _M_ht.begin(); }
    360   const_iterator end() const { return _M_ht.end(); }
    361 
    362 public:
    363   iterator insert(const value_type& __obj) { return _M_ht.insert_equal(__obj); }
    364 #if defined (_STLP_MEMBER_TEMPLATES)
    365   template <class _InputIterator>
    366   void insert(_InputIterator __f, _InputIterator __l)
    367   { _M_ht.insert_equal(__f,__l); }
    368 #else
    369   void insert(const value_type* __f, const value_type* __l)
    370   { _M_ht.insert_equal(__f,__l); }
    371   void insert(const_iterator __f, const_iterator __l)
    372   { _M_ht.insert_equal(__f, __l); }
    373 #endif /*_STLP_MEMBER_TEMPLATES */
    374   iterator insert_noresize(const value_type& __obj)
    375   { return _M_ht.insert_equal_noresize(__obj); }
    376 
    377   _STLP_TEMPLATE_FOR_CONT_EXT
    378   iterator find(const _KT& __key) { return _M_ht.find(__key); }
    379 
    380   _STLP_TEMPLATE_FOR_CONT_EXT
    381   const_iterator find(const _KT& __key) const { return _M_ht.find(__key); }
    382 
    383   _STLP_TEMPLATE_FOR_CONT_EXT
    384   size_type count(const _KT& __key) const { return _M_ht.count(__key); }
    385 
    386   _STLP_TEMPLATE_FOR_CONT_EXT
    387   pair<iterator, iterator> equal_range(const _KT& __key)
    388   { return _M_ht.equal_range(__key); }
    389   _STLP_TEMPLATE_FOR_CONT_EXT
    390   pair<const_iterator, const_iterator> equal_range(const _KT& __key) const
    391   { return _M_ht.equal_range(__key); }
    392 
    393   _STLP_TEMPLATE_FOR_CONT_EXT
    394   size_type erase(const _KT& __key) {return _M_ht.erase(__key); }
    395   void erase(iterator __it) { _M_ht.erase(__it); }
    396   void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
    397   void clear() { _M_ht.clear(); }
    398 
    399 public:
    400   void resize(size_type __hint) { _M_ht.resize(__hint); }
    401   size_type bucket_count() const { return _M_ht.bucket_count(); }
    402   size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
    403   size_type elems_in_bucket(size_type __n) const
    404   { return _M_ht.elems_in_bucket(__n); }
    405 };
    406 
    407 #define _STLP_TEMPLATE_HEADER template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
    408 #define _STLP_TEMPLATE_CONTAINER hash_set<_Value,_HashFcn,_EqualKey,_Alloc>
    409 
    410 #include <stl/_relops_hash_cont.h>
    411 
    412 #undef _STLP_TEMPLATE_CONTAINER
    413 #define _STLP_TEMPLATE_CONTAINER hash_multiset<_Value,_HashFcn,_EqualKey,_Alloc>
    414 #include <stl/_relops_hash_cont.h>
    415 
    416 #undef _STLP_TEMPLATE_CONTAINER
    417 #undef _STLP_TEMPLATE_HEADER
    418 
    419 // Specialization of insert_iterator so that it will work for hash_set
    420 // and hash_multiset.
    421 
    422 #if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
    423 #  if !defined (_STLP_NO_MOVE_SEMANTIC)
    424 template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
    425 struct __move_traits<hash_set<_Value, _HashFcn, _EqualKey, _Alloc> > :
    426   _STLP_PRIV __move_traits_aux<typename hash_set<_Value, _HashFcn, _EqualKey, _Alloc>::_Ht>
    427 {};
    428 
    429 template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
    430 struct __move_traits<hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> > :
    431   _STLP_PRIV __move_traits_aux<typename hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc>::_Ht>
    432 {};
    433 #  endif
    434 
    435 template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
    436 class insert_iterator<hash_set<_Value, _HashFcn, _EqualKey, _Alloc> > {
    437 protected:
    438   typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
    439   _Container* container;
    440 public:
    441   typedef _Container          container_type;
    442   typedef output_iterator_tag iterator_category;
    443   typedef void                value_type;
    444   typedef void                difference_type;
    445   typedef void                pointer;
    446   typedef void                reference;
    447 
    448   insert_iterator(_Container& __x) : container(&__x) {}
    449   insert_iterator(_Container& __x, typename _Container::iterator)
    450     : container(&__x) {}
    451   insert_iterator<_Container>&
    452   operator=(const typename _Container::value_type& __val) {
    453     container->insert(__val);
    454     return *this;
    455   }
    456   insert_iterator<_Container>& operator*() { return *this; }
    457   insert_iterator<_Container>& operator++() { return *this; }
    458   insert_iterator<_Container>& operator++(int) { return *this; }
    459 };
    460 
    461 template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
    462 class insert_iterator<hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> > {
    463 protected:
    464   typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
    465   _Container* container;
    466   typename _Container::iterator iter;
    467 public:
    468   typedef _Container          container_type;
    469   typedef output_iterator_tag iterator_category;
    470   typedef void                value_type;
    471   typedef void                difference_type;
    472   typedef void                pointer;
    473   typedef void                reference;
    474 
    475   insert_iterator(_Container& __x) : container(&__x) {}
    476   insert_iterator(_Container& __x, typename _Container::iterator)
    477     : container(&__x) {}
    478   insert_iterator<_Container>&
    479   operator=(const typename _Container::value_type& __val) {
    480     container->insert(__val);
    481     return *this;
    482   }
    483   insert_iterator<_Container>& operator*() { return *this; }
    484   insert_iterator<_Container>& operator++() { return *this; }
    485   insert_iterator<_Container>& operator++(int) { return *this; }
    486 };
    487 #endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
    488 
    489 _STLP_END_NAMESPACE
    490 
    491 #endif /* _STLP_INTERNAL_HASH_SET_H */
    492 
    493 // Local Variables:
    494 // mode:C++
    495 // End:
    496