OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [libstdc++-v3/] [include/] [backward/] [hash_set] - Blame information for rev 424

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// Hashing set implementation -*- C++ -*-
2
 
3
// Copyright (C) 2001, 2002, 2004, 2005, 2006, 2009, 2010
4
// Free Software Foundation, Inc.
5
//
6
// This file is part of the GNU ISO C++ Library.  This library is free
7
// software; you can redistribute it and/or modify it under the
8
// terms of the GNU General Public License as published by the
9
// Free Software Foundation; either version 3, or (at your option)
10
// any later version.
11
 
12
// This library is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
// GNU General Public License for more details.
16
 
17
// Under Section 7 of GPL version 3, you are granted additional
18
// permissions described in the GCC Runtime Library Exception, version
19
// 3.1, as published by the Free Software Foundation.
20
 
21
// You should have received a copy of the GNU General Public License and
22
// a copy of the GCC Runtime Library Exception along with this program;
23
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
// .
25
 
26
/*
27
 * Copyright (c) 1996
28
 * Silicon Graphics Computer Systems, Inc.
29
 *
30
 * Permission to use, copy, modify, distribute and sell this software
31
 * and its documentation for any purpose is hereby granted without fee,
32
 * provided that the above copyright notice appear in all copies and
33
 * that both that copyright notice and this permission notice appear
34
 * in supporting documentation.  Silicon Graphics makes no
35
 * representations about the suitability of this software for any
36
 * purpose.  It is provided "as is" without express or implied warranty.
37
 *
38
 *
39
 * Copyright (c) 1994
40
 * Hewlett-Packard Company
41
 *
42
 * Permission to use, copy, modify, distribute and sell this software
43
 * and its documentation for any purpose is hereby granted without fee,
44
 * provided that the above copyright notice appear in all copies and
45
 * that both that copyright notice and this permission notice appear
46
 * in supporting documentation.  Hewlett-Packard Company makes no
47
 * representations about the suitability of this software for any
48
 * purpose.  It is provided "as is" without express or implied warranty.
49
 *
50
 */
51
 
52
/** @file backward/hash_set
53
 *  This file is a GNU extension to the Standard C++ Library (possibly
54
 *  containing extensions from the HP/SGI STL subset).
55
 */
56
 
57
#ifndef _BACKWARD_HASH_SET
58
#define _BACKWARD_HASH_SET 1
59
 
60
#include "backward_warning.h"
61
#include 
62
#include 
63
#include 
64
 
65
_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
66
 
67
  using std::equal_to;
68
  using std::allocator;
69
  using std::pair;
70
  using std::_Identity;
71
 
72
  /**
73
   *  This is an SGI extension.
74
   *  @ingroup SGIextensions
75
   *  @doctodo
76
   */
77
  template,
78
           class _EqualKey = equal_to<_Value>,
79
           class _Alloc = allocator<_Value> >
80
    class hash_set
81
    {
82
      // concept requirements
83
      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
84
      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
85
      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
86
 
87
    private:
88
      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
89
                        _EqualKey, _Alloc> _Ht;
90
      _Ht _M_ht;
91
 
92
    public:
93
      typedef typename _Ht::key_type key_type;
94
      typedef typename _Ht::value_type value_type;
95
      typedef typename _Ht::hasher hasher;
96
      typedef typename _Ht::key_equal key_equal;
97
 
98
      typedef typename _Ht::size_type size_type;
99
      typedef typename _Ht::difference_type difference_type;
100
      typedef typename _Alloc::pointer pointer;
101
      typedef typename _Alloc::const_pointer const_pointer;
102
      typedef typename _Alloc::reference reference;
103
      typedef typename _Alloc::const_reference const_reference;
104
 
105
      typedef typename _Ht::const_iterator iterator;
106
      typedef typename _Ht::const_iterator const_iterator;
107
 
108
      typedef typename _Ht::allocator_type allocator_type;
109
 
110
      hasher
111
      hash_funct() const
112
      { return _M_ht.hash_funct(); }
113
 
114
      key_equal
115
      key_eq() const
116
      { return _M_ht.key_eq(); }
117
 
118
      allocator_type
119
      get_allocator() const
120
      { return _M_ht.get_allocator(); }
121
 
122
      hash_set()
123
      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
124
 
125
      explicit
126
      hash_set(size_type __n)
127
      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
128
 
129
      hash_set(size_type __n, const hasher& __hf)
130
      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
131
 
132
      hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
133
               const allocator_type& __a = allocator_type())
134
      : _M_ht(__n, __hf, __eql, __a) {}
135
 
136
      template
137
        hash_set(_InputIterator __f, _InputIterator __l)
138
        : _M_ht(100, hasher(), key_equal(), allocator_type())
139
        { _M_ht.insert_unique(__f, __l); }
140
 
141
      template
142
        hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
143
        : _M_ht(__n, hasher(), key_equal(), allocator_type())
144
        { _M_ht.insert_unique(__f, __l); }
145
 
146
      template
147
        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
148
                 const hasher& __hf)
149
        : _M_ht(__n, __hf, key_equal(), allocator_type())
150
        { _M_ht.insert_unique(__f, __l); }
151
 
152
      template
153
        hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
154
                 const hasher& __hf, const key_equal& __eql,
155
                 const allocator_type& __a = allocator_type())
156
        : _M_ht(__n, __hf, __eql, __a)
157
        { _M_ht.insert_unique(__f, __l); }
158
 
159
      size_type
160
      size() const
161
      { return _M_ht.size(); }
162
 
163
      size_type
164
      max_size() const
165
      { return _M_ht.max_size(); }
166
 
167
      bool
168
      empty() const
169
      { return _M_ht.empty(); }
170
 
171
      void
172
      swap(hash_set& __hs)
173
      { _M_ht.swap(__hs._M_ht); }
174
 
175
      template
176
        friend bool
177
        operator==(const hash_set<_Val, _HF, _EqK, _Al>&,
178
                   const hash_set<_Val, _HF, _EqK, _Al>&);
179
 
180
      iterator
181
      begin() const
182
      { return _M_ht.begin(); }
183
 
184
      iterator
185
      end() const
186
      { return _M_ht.end(); }
187
 
188
      pair
189
      insert(const value_type& __obj)
190
      {
191
        pair __p = _M_ht.insert_unique(__obj);
192
        return pair(__p.first, __p.second);
193
      }
194
 
195
      template
196
        void
197
        insert(_InputIterator __f, _InputIterator __l)
198
        { _M_ht.insert_unique(__f, __l); }
199
 
200
      pair
201
      insert_noresize(const value_type& __obj)
202
      {
203
        pair __p
204
          = _M_ht.insert_unique_noresize(__obj);
205
        return pair(__p.first, __p.second);
206
      }
207
 
208
      iterator
209
      find(const key_type& __key) const
210
      { return _M_ht.find(__key); }
211
 
212
      size_type
213
      count(const key_type& __key) const
214
      { return _M_ht.count(__key); }
215
 
216
      pair
217
      equal_range(const key_type& __key) const
218
      { return _M_ht.equal_range(__key); }
219
 
220
      size_type
221
      erase(const key_type& __key)
222
      {return _M_ht.erase(__key); }
223
 
224
      void
225
      erase(iterator __it)
226
      { _M_ht.erase(__it); }
227
 
228
      void
229
      erase(iterator __f, iterator __l)
230
      { _M_ht.erase(__f, __l); }
231
 
232
      void
233
      clear()
234
      { _M_ht.clear(); }
235
 
236
      void
237
      resize(size_type __hint)
238
      { _M_ht.resize(__hint); }
239
 
240
      size_type
241
      bucket_count() const
242
      { return _M_ht.bucket_count(); }
243
 
244
      size_type
245
      max_bucket_count() const
246
      { return _M_ht.max_bucket_count(); }
247
 
248
      size_type
249
      elems_in_bucket(size_type __n) const
250
      { return _M_ht.elems_in_bucket(__n); }
251
    };
252
 
253
  template
254
    inline bool
255
    operator==(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
256
               const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
257
    { return __hs1._M_ht == __hs2._M_ht; }
258
 
259
  template
260
    inline bool
261
    operator!=(const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs1,
262
               const hash_set<_Value, _HashFcn, _EqualKey, _Alloc>& __hs2)
263
    { return !(__hs1 == __hs2); }
264
 
265
  template
266
    inline void
267
    swap(hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
268
         hash_set<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
269
    { __hs1.swap(__hs2); }
270
 
271
 
272
  /**
273
   *  This is an SGI extension.
274
   *  @ingroup SGIextensions
275
   *  @doctodo
276
   */
277
  template
278
           class _HashFcn = hash<_Value>,
279
           class _EqualKey = equal_to<_Value>,
280
           class _Alloc = allocator<_Value> >
281
    class hash_multiset
282
    {
283
      // concept requirements
284
      __glibcxx_class_requires(_Value, _SGIAssignableConcept)
285
      __glibcxx_class_requires3(_HashFcn, size_t, _Value, _UnaryFunctionConcept)
286
      __glibcxx_class_requires3(_EqualKey, _Value, _Value, _BinaryPredicateConcept)
287
 
288
    private:
289
      typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>,
290
                        _EqualKey, _Alloc> _Ht;
291
      _Ht _M_ht;
292
 
293
    public:
294
      typedef typename _Ht::key_type key_type;
295
      typedef typename _Ht::value_type value_type;
296
      typedef typename _Ht::hasher hasher;
297
      typedef typename _Ht::key_equal key_equal;
298
 
299
      typedef typename _Ht::size_type size_type;
300
      typedef typename _Ht::difference_type difference_type;
301
      typedef typename _Alloc::pointer pointer;
302
      typedef typename _Alloc::const_pointer const_pointer;
303
      typedef typename _Alloc::reference reference;
304
      typedef typename _Alloc::const_reference const_reference;
305
 
306
      typedef typename _Ht::const_iterator iterator;
307
      typedef typename _Ht::const_iterator const_iterator;
308
 
309
      typedef typename _Ht::allocator_type allocator_type;
310
 
311
      hasher
312
      hash_funct() const
313
      { return _M_ht.hash_funct(); }
314
 
315
      key_equal
316
      key_eq() const
317
      { return _M_ht.key_eq(); }
318
 
319
      allocator_type
320
      get_allocator() const
321
      { return _M_ht.get_allocator(); }
322
 
323
      hash_multiset()
324
      : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
325
 
326
      explicit
327
      hash_multiset(size_type __n)
328
      : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
329
 
330
      hash_multiset(size_type __n, const hasher& __hf)
331
      : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
332
 
333
      hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
334
                    const allocator_type& __a = allocator_type())
335
      : _M_ht(__n, __hf, __eql, __a) {}
336
 
337
      template
338
        hash_multiset(_InputIterator __f, _InputIterator __l)
339
        : _M_ht(100, hasher(), key_equal(), allocator_type())
340
        { _M_ht.insert_equal(__f, __l); }
341
 
342
      template
343
        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
344
        : _M_ht(__n, hasher(), key_equal(), allocator_type())
345
        { _M_ht.insert_equal(__f, __l); }
346
 
347
      template
348
        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
349
                      const hasher& __hf)
350
        : _M_ht(__n, __hf, key_equal(), allocator_type())
351
        { _M_ht.insert_equal(__f, __l); }
352
 
353
      template
354
        hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
355
                      const hasher& __hf, const key_equal& __eql,
356
                      const allocator_type& __a = allocator_type())
357
        : _M_ht(__n, __hf, __eql, __a)
358
        { _M_ht.insert_equal(__f, __l); }
359
 
360
      size_type
361
      size() const
362
      { return _M_ht.size(); }
363
 
364
      size_type
365
      max_size() const
366
      { return _M_ht.max_size(); }
367
 
368
      bool
369
      empty() const
370
      { return _M_ht.empty(); }
371
 
372
      void
373
      swap(hash_multiset& hs)
374
      { _M_ht.swap(hs._M_ht); }
375
 
376
      template
377
        friend bool
378
        operator==(const hash_multiset<_Val, _HF, _EqK, _Al>&,
379
                   const hash_multiset<_Val, _HF, _EqK, _Al>&);
380
 
381
      iterator
382
      begin() const
383
      { return _M_ht.begin(); }
384
 
385
      iterator
386
      end() const
387
      { return _M_ht.end(); }
388
 
389
      iterator
390
      insert(const value_type& __obj)
391
      { return _M_ht.insert_equal(__obj); }
392
 
393
      template
394
        void
395
        insert(_InputIterator __f, _InputIterator __l)
396
        { _M_ht.insert_equal(__f,__l); }
397
 
398
      iterator
399
      insert_noresize(const value_type& __obj)
400
      { return _M_ht.insert_equal_noresize(__obj); }
401
 
402
      iterator
403
      find(const key_type& __key) const
404
      { return _M_ht.find(__key); }
405
 
406
      size_type
407
      count(const key_type& __key) const
408
      { return _M_ht.count(__key); }
409
 
410
      pair
411
      equal_range(const key_type& __key) const
412
      { return _M_ht.equal_range(__key); }
413
 
414
      size_type
415
      erase(const key_type& __key)
416
      { return _M_ht.erase(__key); }
417
 
418
      void
419
      erase(iterator __it)
420
      { _M_ht.erase(__it); }
421
 
422
      void
423
      erase(iterator __f, iterator __l)
424
      { _M_ht.erase(__f, __l); }
425
 
426
      void
427
      clear()
428
      { _M_ht.clear(); }
429
 
430
      void
431
      resize(size_type __hint)
432
      { _M_ht.resize(__hint); }
433
 
434
      size_type
435
      bucket_count() const
436
      { return _M_ht.bucket_count(); }
437
 
438
      size_type
439
      max_bucket_count() const
440
      { return _M_ht.max_bucket_count(); }
441
 
442
      size_type
443
      elems_in_bucket(size_type __n) const
444
      { return _M_ht.elems_in_bucket(__n); }
445
    };
446
 
447
  template
448
    inline bool
449
    operator==(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
450
               const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
451
    { return __hs1._M_ht == __hs2._M_ht; }
452
 
453
  template
454
    inline bool
455
    operator!=(const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
456
               const hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
457
    { return !(__hs1 == __hs2); }
458
 
459
  template
460
    inline void
461
    swap(hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs1,
462
         hash_multiset<_Val, _HashFcn, _EqualKey, _Alloc>& __hs2)
463
    { __hs1.swap(__hs2); }
464
 
465
_GLIBCXX_END_NAMESPACE
466
 
467
_GLIBCXX_BEGIN_NAMESPACE(std)
468
 
469
  // Specialization of insert_iterator so that it will work for hash_set
470
  // and hash_multiset.
471
  template
472
    class insert_iterator<__gnu_cxx::hash_set<_Value, _HashFcn,
473
                                              _EqualKey, _Alloc> >
474
    {
475
    protected:
476
      typedef __gnu_cxx::hash_set<_Value, _HashFcn, _EqualKey, _Alloc>
477
        _Container;
478
      _Container* container;
479
 
480
    public:
481
      typedef _Container          container_type;
482
      typedef output_iterator_tag iterator_category;
483
      typedef void                value_type;
484
      typedef void                difference_type;
485
      typedef void                pointer;
486
      typedef void                reference;
487
 
488
      insert_iterator(_Container& __x)
489
      : container(&__x) {}
490
 
491
      insert_iterator(_Container& __x, typename _Container::iterator)
492
      : container(&__x) {}
493
 
494
      insert_iterator<_Container>&
495
      operator=(const typename _Container::value_type& __value)
496
      {
497
        container->insert(__value);
498
        return *this;
499
      }
500
 
501
      insert_iterator<_Container>&
502
      operator*()
503
      { return *this; }
504
 
505
      insert_iterator<_Container>&
506
      operator++()
507
      { return *this; }
508
 
509
      insert_iterator<_Container>&
510
      operator++(int)
511
      { return *this; }
512
    };
513
 
514
  template
515
    class insert_iterator<__gnu_cxx::hash_multiset<_Value, _HashFcn,
516
                                                   _EqualKey, _Alloc> >
517
    {
518
    protected:
519
      typedef __gnu_cxx::hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc>
520
        _Container;
521
      _Container* container;
522
      typename _Container::iterator iter;
523
 
524
    public:
525
      typedef _Container          container_type;
526
      typedef output_iterator_tag iterator_category;
527
      typedef void                value_type;
528
      typedef void                difference_type;
529
      typedef void                pointer;
530
      typedef void                reference;
531
 
532
      insert_iterator(_Container& __x)
533
      : container(&__x) {}
534
 
535
      insert_iterator(_Container& __x, typename _Container::iterator)
536
      : container(&__x) {}
537
 
538
      insert_iterator<_Container>&
539
      operator=(const typename _Container::value_type& __value)
540
      {
541
        container->insert(__value);
542
        return *this;
543
      }
544
 
545
      insert_iterator<_Container>&
546
      operator*()
547
      { return *this; }
548
 
549
      insert_iterator<_Container>&
550
      operator++()
551
      { return *this; }
552
 
553
      insert_iterator<_Container>&
554
      operator++(int) { return *this; }
555
    };
556
 
557
_GLIBCXX_END_NAMESPACE
558
 
559
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.