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