STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Functions
SGIextensions

Functions

namespace __gnu_cxx _GLIBCXX_VISIBILITY (default)
 

Detailed Description

The identity_element functions are not part of the C++ standard; SGI provided them as an extension. Its argument is an operation, and its return value is the identity element for that operation. It is overloaded for addition and multiplication, and you can overload it for your own nefarious operations.

As an extension to the binders, SGI provided composition functors and wrapper functions to aid in their creation. The unary_compose functor is constructed from two functions/functors, f and g. Calling operator() with a single argument x returns f(g(x)). The function compose1 takes the two functions and constructs a unary_compose variable for you.

binary_compose is constructed from three functors, f, g1, and g2. Its operator() returns f(g1(x),g2(x)). The function compose2 takes f, g1, and g2, and constructs the binary_compose instance for you. For example, if f returns an int, then

int answer = (compose2(f,g1,g2))(x);

is equivalent to

int temp1 = g1(x);
int temp2 = g2(x);
int answer = f(temp1,temp2);

But the first form is more compact, and can be passed around as a functor to other algorithms.

As an extension, SGI provided a functor called identity. When a functor is required but no operations are desired, this can be used as a pass-through. Its operator() returns its argument unchanged.

select1st and select2nd are extensions provided by SGI. Their operator()s take a std::pair as an argument, and return either the first member or the second member, respectively. They can be used (especially with the composition functors) to strip data from a sequence before performing the remainder of an algorithm.

The operator() of the project1st functor takes two arbitrary arguments and returns the first one, while project2nd returns the second one. They are extensions provided by SGI.

These three functors are each constructed from a single arbitrary variable/value. Later, their operator()s completely ignore any arguments passed, and return the stored value.

The helper creator functions constant0, constant1, and constant2 each take a result argument and construct variables of the appropriate functor type.

Function Documentation

namespace __gnu_cxx _GLIBCXX_VISIBILITY ( default  )

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

Copies the range [first,first+count) into [result,result+count).

Parameters
__firstAn input iterator.
__countThe number of elements to copy.
__resultAn output iterator.
Returns
A std::pair composed of first+count and result+count.

This is an SGI extension. This inline function will boil down to a call to memmove whenever possible. Failing that, if random access iterators are passed, then the loop count will be known (and therefore a candidate for compiler optimizations such as unrolling).

memcmp on steroids.

Parameters
__first1An input iterator.
__last1An input iterator.
__first2An input iterator.
__last2An input iterator.
Returns
An int, as with memcmp.

The return value will be less than zero if the first range is lexigraphically less than the second, greater than zero if the second range is lexigraphically less than the first, and zero otherwise. This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

Find the median of three values.

Parameters
__aA value.
__bA value.
__cA value.
Returns
One of a, b or c.

If {l,m,n} is some convolution of {a,b,c} such that l<=m<=n then the value returned will be m. This is an SGI extension.

Find the median of three values using a predicate for comparison.

Parameters
__aA value.
__bA value.
__cA value.
__compA binary predicate.
Returns
One of a, b or c.

If {l,m,n} is some convolution of {a,b,c} such that comp(l,m) and comp(m,n) are both true then the value returned will be m. This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

Copies the range [first,last) into result.

Parameters
__firstAn input iterator.
__countLength
__resultAn output iterator.
Returns
__result + (__first + __count)

Like copy(), but does not require an initialized output range.

This class provides similar behavior and semantics of the standard functions get_temporary_buffer() and return_temporary_buffer(), but encapsulated in a type vaguely resembling a standard container.

By default, a temporary_buffer<Iter> stores space for objects of whatever type the Iter iterator points to. It is constructed from a typical [first,last) range, and provides the begin(), end(), size() functions, as well as requested_size(). For non-trivial types, copies of *first will be used to initialize the storage.

malloc is used to obtain underlying storage.

Like get_temporary_buffer(), not all the requested memory may be available. Ideally, the created buffer will be large enough to hold a copy of [first,last), but if size() is less than requested_size(), then this didn't happen.

Requests storage large enough to hold a copy of [first,last).

Destroys objects and frees storage.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

This is an SGI extension.

68 {
69 _GLIBCXX_BEGIN_NAMESPACE_VERSION
70 
71  using std::equal_to;
72  using std::allocator;
73  using std::pair;
74  using std::_Select1st;
75 
81  template<class _Key, class _Tp, class _HashFn = hash<_Key>,
82  class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> >
83  class hash_map
84  {
85  private:
86  typedef hashtable<pair<const _Key, _Tp>,_Key, _HashFn,
87  _Select1st<pair<const _Key, _Tp> >,
88  _EqualKey, _Alloc> _Ht;
89 
90  _Ht _M_ht;
91 
92  public:
93  typedef typename _Ht::key_type key_type;
94  typedef _Tp data_type;
95  typedef _Tp mapped_type;
96  typedef typename _Ht::value_type value_type;
97  typedef typename _Ht::hasher hasher;
98  typedef typename _Ht::key_equal key_equal;
99 
100  typedef typename _Ht::size_type size_type;
101  typedef typename _Ht::difference_type difference_type;
102  typedef typename _Ht::pointer pointer;
103  typedef typename _Ht::const_pointer const_pointer;
104  typedef typename _Ht::reference reference;
105  typedef typename _Ht::const_reference const_reference;
106 
107  typedef typename _Ht::iterator iterator;
108  typedef typename _Ht::const_iterator const_iterator;
109 
110  typedef typename _Ht::allocator_type allocator_type;
111 
112  hasher
113  hash_funct() const
114  { return _M_ht.hash_funct(); }
115 
116  key_equal
117  key_eq() const
118  { return _M_ht.key_eq(); }
119 
120  allocator_type
121  get_allocator() const
122  { return _M_ht.get_allocator(); }
123 
124  hash_map()
125  : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
126 
127  explicit
128  hash_map(size_type __n)
129  : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
130 
131  hash_map(size_type __n, const hasher& __hf)
132  : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
133 
134  hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
135  const allocator_type& __a = allocator_type())
136  : _M_ht(__n, __hf, __eql, __a) {}
137 
138  template<class _InputIterator>
139  hash_map(_InputIterator __f, _InputIterator __l)
140  : _M_ht(100, hasher(), key_equal(), allocator_type())
141  { _M_ht.insert_unique(__f, __l); }
142 
143  template<class _InputIterator>
144  hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
145  : _M_ht(__n, hasher(), key_equal(), allocator_type())
146  { _M_ht.insert_unique(__f, __l); }
147 
148  template<class _InputIterator>
149  hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
150  const hasher& __hf)
151  : _M_ht(__n, __hf, key_equal(), allocator_type())
152  { _M_ht.insert_unique(__f, __l); }
153 
154  template<class _InputIterator>
155  hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
156  const hasher& __hf, const key_equal& __eql,
157  const allocator_type& __a = allocator_type())
158  : _M_ht(__n, __hf, __eql, __a)
159  { _M_ht.insert_unique(__f, __l); }
160 
161  size_type
162  size() const
163  { return _M_ht.size(); }
164 
165  size_type
166  max_size() const
167  { return _M_ht.max_size(); }
168 
169  bool
170  empty() const
171  { return _M_ht.empty(); }
172 
173  void
174  swap(hash_map& __hs)
175  { _M_ht.swap(__hs._M_ht); }
176 
177  template<class _K1, class _T1, class _HF, class _EqK, class _Al>
178  friend bool
179  operator== (const hash_map<_K1, _T1, _HF, _EqK, _Al>&,
180  const hash_map<_K1, _T1, _HF, _EqK, _Al>&);
181 
182  iterator
183  begin()
184  { return _M_ht.begin(); }
185 
186  iterator
187  end()
188  { return _M_ht.end(); }
189 
190  const_iterator
191  begin() const
192  { return _M_ht.begin(); }
193 
194  const_iterator
195  end() const
196  { return _M_ht.end(); }
197 
198  pair<iterator, bool>
199  insert(const value_type& __obj)
200  { return _M_ht.insert_unique(__obj); }
201 
202  template<class _InputIterator>
203  void
204  insert(_InputIterator __f, _InputIterator __l)
205  { _M_ht.insert_unique(__f, __l); }
206 
207  pair<iterator, bool>
208  insert_noresize(const value_type& __obj)
209  { return _M_ht.insert_unique_noresize(__obj); }
210 
211  iterator
212  find(const key_type& __key)
213  { return _M_ht.find(__key); }
214 
215  const_iterator
216  find(const key_type& __key) const
217  { return _M_ht.find(__key); }
218 
219  _Tp&
220  operator[](const key_type& __key)
221  { return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
222 
223  size_type
224  count(const key_type& __key) const
225  { return _M_ht.count(__key); }
226 
227  pair<iterator, iterator>
228  equal_range(const key_type& __key)
229  { return _M_ht.equal_range(__key); }
230 
231  pair<const_iterator, const_iterator>
232  equal_range(const key_type& __key) const
233  { return _M_ht.equal_range(__key); }
234 
235  size_type
236  erase(const key_type& __key)
237  {return _M_ht.erase(__key); }
238 
239  void
240  erase(iterator __it)
241  { _M_ht.erase(__it); }
242 
243  void
244  erase(iterator __f, iterator __l)
245  { _M_ht.erase(__f, __l); }
246 
247  void
248  clear()
249  { _M_ht.clear(); }
250 
251  void
252  resize(size_type __hint)
253  { _M_ht.resize(__hint); }
254 
255  size_type
256  bucket_count() const
257  { return _M_ht.bucket_count(); }
258 
259  size_type
260  max_bucket_count() const
261  { return _M_ht.max_bucket_count(); }
262 
263  size_type
264  elems_in_bucket(size_type __n) const
265  { return _M_ht.elems_in_bucket(__n); }
266  };
267 
268  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
269  inline bool
270  operator==(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
271  const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
272  { return __hm1._M_ht == __hm2._M_ht; }
273 
274  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
275  inline bool
276  operator!=(const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
277  const hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
278  { return !(__hm1 == __hm2); }
279 
280  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
281  inline void
282  swap(hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
283  hash_map<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
284  { __hm1.swap(__hm2); }
285 
286 
292  template<class _Key, class _Tp,
293  class _HashFn = hash<_Key>,
294  class _EqualKey = equal_to<_Key>,
295  class _Alloc = allocator<_Tp> >
296  class hash_multimap
297  {
298  // concept requirements
299  __glibcxx_class_requires(_Key, _SGIAssignableConcept)
300  __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
301  __glibcxx_class_requires3(_HashFn, size_t, _Key, _UnaryFunctionConcept)
302  __glibcxx_class_requires3(_EqualKey, _Key, _Key, _BinaryPredicateConcept)
303 
304  private:
305  typedef hashtable<pair<const _Key, _Tp>, _Key, _HashFn,
306  _Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc>
307  _Ht;
308 
309  _Ht _M_ht;
310 
311  public:
312  typedef typename _Ht::key_type key_type;
313  typedef _Tp data_type;
314  typedef _Tp mapped_type;
315  typedef typename _Ht::value_type value_type;
316  typedef typename _Ht::hasher hasher;
317  typedef typename _Ht::key_equal key_equal;
318 
319  typedef typename _Ht::size_type size_type;
320  typedef typename _Ht::difference_type difference_type;
321  typedef typename _Ht::pointer pointer;
322  typedef typename _Ht::const_pointer const_pointer;
323  typedef typename _Ht::reference reference;
324  typedef typename _Ht::const_reference const_reference;
325 
326  typedef typename _Ht::iterator iterator;
327  typedef typename _Ht::const_iterator const_iterator;
328 
329  typedef typename _Ht::allocator_type allocator_type;
330 
331  hasher
332  hash_funct() const
333  { return _M_ht.hash_funct(); }
334 
335  key_equal
336  key_eq() const
337  { return _M_ht.key_eq(); }
338 
339  allocator_type
340  get_allocator() const
341  { return _M_ht.get_allocator(); }
342 
343  hash_multimap()
344  : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
345 
346  explicit
347  hash_multimap(size_type __n)
348  : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
349 
350  hash_multimap(size_type __n, const hasher& __hf)
351  : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
352 
353  hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
354  const allocator_type& __a = allocator_type())
355  : _M_ht(__n, __hf, __eql, __a) {}
356 
357  template<class _InputIterator>
358  hash_multimap(_InputIterator __f, _InputIterator __l)
359  : _M_ht(100, hasher(), key_equal(), allocator_type())
360  { _M_ht.insert_equal(__f, __l); }
361 
362  template<class _InputIterator>
363  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
364  : _M_ht(__n, hasher(), key_equal(), allocator_type())
365  { _M_ht.insert_equal(__f, __l); }
366 
367  template<class _InputIterator>
368  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
369  const hasher& __hf)
370  : _M_ht(__n, __hf, key_equal(), allocator_type())
371  { _M_ht.insert_equal(__f, __l); }
372 
373  template<class _InputIterator>
374  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
375  const hasher& __hf, const key_equal& __eql,
376  const allocator_type& __a = allocator_type())
377  : _M_ht(__n, __hf, __eql, __a)
378  { _M_ht.insert_equal(__f, __l); }
379 
380  size_type
381  size() const
382  { return _M_ht.size(); }
383 
384  size_type
385  max_size() const
386  { return _M_ht.max_size(); }
387 
388  bool
389  empty() const
390  { return _M_ht.empty(); }
391 
392  void
393  swap(hash_multimap& __hs)
394  { _M_ht.swap(__hs._M_ht); }
395 
396  template<class _K1, class _T1, class _HF, class _EqK, class _Al>
397  friend bool
398  operator==(const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&,
399  const hash_multimap<_K1, _T1, _HF, _EqK, _Al>&);
400 
401  iterator
402  begin()
403  { return _M_ht.begin(); }
404 
405  iterator
406  end()
407  { return _M_ht.end(); }
408 
409  const_iterator
410  begin() const
411  { return _M_ht.begin(); }
412 
413  const_iterator
414  end() const
415  { return _M_ht.end(); }
416 
417  iterator
418  insert(const value_type& __obj)
419  { return _M_ht.insert_equal(__obj); }
420 
421  template<class _InputIterator>
422  void
423  insert(_InputIterator __f, _InputIterator __l)
424  { _M_ht.insert_equal(__f,__l); }
425 
426  iterator
427  insert_noresize(const value_type& __obj)
428  { return _M_ht.insert_equal_noresize(__obj); }
429 
430  iterator
431  find(const key_type& __key)
432  { return _M_ht.find(__key); }
433 
434  const_iterator
435  find(const key_type& __key) const
436  { return _M_ht.find(__key); }
437 
438  size_type
439  count(const key_type& __key) const
440  { return _M_ht.count(__key); }
441 
442  pair<iterator, iterator>
443  equal_range(const key_type& __key)
444  { return _M_ht.equal_range(__key); }
445 
446  pair<const_iterator, const_iterator>
447  equal_range(const key_type& __key) const
448  { return _M_ht.equal_range(__key); }
449 
450  size_type
451  erase(const key_type& __key)
452  { return _M_ht.erase(__key); }
453 
454  void
455  erase(iterator __it)
456  { _M_ht.erase(__it); }
457 
458  void
459  erase(iterator __f, iterator __l)
460  { _M_ht.erase(__f, __l); }
461 
462  void
463  clear()
464  { _M_ht.clear(); }
465 
466  void
467  resize(size_type __hint)
468  { _M_ht.resize(__hint); }
469 
470  size_type
471  bucket_count() const
472  { return _M_ht.bucket_count(); }
473 
474  size_type
475  max_bucket_count() const
476  { return _M_ht.max_bucket_count(); }
477 
478  size_type
479  elems_in_bucket(size_type __n) const
480  { return _M_ht.elems_in_bucket(__n); }
481  };
482 
483  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
484  inline bool
485  operator==(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
486  const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
487  { return __hm1._M_ht == __hm2._M_ht; }
488 
489  template<class _Key, class _Tp, class _HF, class _EqKey, class _Alloc>
490  inline bool
491  operator!=(const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm1,
492  const hash_multimap<_Key, _Tp, _HF, _EqKey, _Alloc>& __hm2)
493  { return !(__hm1 == __hm2); }
494 
495  template<class _Key, class _Tp, class _HashFn, class _EqlKey, class _Alloc>
496  inline void
497  swap(hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm1,
498  hash_multimap<_Key, _Tp, _HashFn, _EqlKey, _Alloc>& __hm2)
499  { __hm1.swap(__hm2); }
500 
501 _GLIBCXX_END_NAMESPACE_VERSION
502 } // namespace
#define __glibcxx_class_requires3(_a, _b, _c, _d)
Definition: concept_check.h:50
bool operator==(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
#define __glibcxx_class_requires(_a, _b)
Definition: concept_check.h:48
bool operator!=(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
void swap(exception_ptr &__lhs, exception_ptr &__rhs)
Definition: exception_ptr.h:160