100db7afdSDavid E. O'Brien // Multimap implementation -*- C++ -*-
200db7afdSDavid E. O'Brien 
3f8a1b7d9SAlexander Kabaev // Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
400db7afdSDavid E. O'Brien //
500db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
600db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
700db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
800db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
900db7afdSDavid E. O'Brien // any later version.
1000db7afdSDavid E. O'Brien 
1100db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1200db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1300db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1400db7afdSDavid E. O'Brien // GNU General Public License for more details.
1500db7afdSDavid E. O'Brien 
1600db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1700db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
18f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1900db7afdSDavid E. O'Brien // USA.
2000db7afdSDavid E. O'Brien 
2100db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2200db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2300db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2400db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2500db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2600db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2700db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License.
2900db7afdSDavid E. O'Brien 
3000db7afdSDavid E. O'Brien /*
3100db7afdSDavid E. O'Brien  *
3200db7afdSDavid E. O'Brien  * Copyright (c) 1994
3300db7afdSDavid E. O'Brien  * Hewlett-Packard Company
3400db7afdSDavid E. O'Brien  *
3500db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
3600db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
3700db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
3800db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
3900db7afdSDavid E. O'Brien  * in supporting documentation.  Hewlett-Packard Company makes no
4000db7afdSDavid E. O'Brien  * representations about the suitability of this software for any
4100db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
4200db7afdSDavid E. O'Brien  *
4300db7afdSDavid E. O'Brien  *
4400db7afdSDavid E. O'Brien  * Copyright (c) 1996,1997
4500db7afdSDavid E. O'Brien  * Silicon Graphics Computer Systems, Inc.
4600db7afdSDavid E. O'Brien  *
4700db7afdSDavid E. O'Brien  * Permission to use, copy, modify, distribute and sell this software
4800db7afdSDavid E. O'Brien  * and its documentation for any purpose is hereby granted without fee,
4900db7afdSDavid E. O'Brien  * provided that the above copyright notice appear in all copies and
5000db7afdSDavid E. O'Brien  * that both that copyright notice and this permission notice appear
5100db7afdSDavid E. O'Brien  * in supporting documentation.  Silicon Graphics makes no
5200db7afdSDavid E. O'Brien  * representations about the suitability of this software for any
5300db7afdSDavid E. O'Brien  * purpose.  It is provided "as is" without express or implied warranty.
5400db7afdSDavid E. O'Brien  */
5500db7afdSDavid E. O'Brien 
5600db7afdSDavid E. O'Brien /** @file stl_multimap.h
5700db7afdSDavid E. O'Brien  *  This is an internal header file, included by other library headers.
5800db7afdSDavid E. O'Brien  *  You should not attempt to use it directly.
5900db7afdSDavid E. O'Brien  */
6000db7afdSDavid E. O'Brien 
61ffeaf689SAlexander Kabaev #ifndef _MULTIMAP_H
62ffeaf689SAlexander Kabaev #define _MULTIMAP_H 1
6300db7afdSDavid E. O'Brien 
6400db7afdSDavid E. O'Brien #include <bits/concept_check.h>
6500db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NESTED_NAMESPACE(std,_GLIBCXX_STD)66f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD)
6700db7afdSDavid E. O'Brien 
6800db7afdSDavid E. O'Brien   /**
691b86b14eSAlexander Kabaev    *  @brief A standard container made up of (key,value) pairs, which can be
701b86b14eSAlexander Kabaev    *  retrieved based on a key, in logarithmic time.
7100db7afdSDavid E. O'Brien    *
721b86b14eSAlexander Kabaev    *  @ingroup Containers
731b86b14eSAlexander Kabaev    *  @ingroup Assoc_containers
741b86b14eSAlexander Kabaev    *
751b86b14eSAlexander Kabaev    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
761b86b14eSAlexander Kabaev    *  <a href="tables.html#66">reversible container</a>, and an
771b86b14eSAlexander Kabaev    *  <a href="tables.html#69">associative container</a> (using equivalent
781b86b14eSAlexander Kabaev    *  keys).  For a @c multimap<Key,T> the key_type is Key, the mapped_type
791b86b14eSAlexander Kabaev    *  is T, and the value_type is std::pair<const Key,T>.
801b86b14eSAlexander Kabaev    *
811b86b14eSAlexander Kabaev    *  Multimaps support bidirectional iterators.
821b86b14eSAlexander Kabaev    *
831b86b14eSAlexander Kabaev    *  @if maint
841b86b14eSAlexander Kabaev    *  The private tree data is declared exactly the same way for map and
851b86b14eSAlexander Kabaev    *  multimap; the distinction is made entirely in how the tree functions are
861b86b14eSAlexander Kabaev    *  called (*_unique versus *_equal, same as the standard).
871b86b14eSAlexander Kabaev    *  @endif
8800db7afdSDavid E. O'Brien   */
89f8a1b7d9SAlexander Kabaev   template <typename _Key, typename _Tp,
90f8a1b7d9SAlexander Kabaev 	    typename _Compare = std::less<_Key>,
91f8a1b7d9SAlexander Kabaev 	    typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
9200db7afdSDavid E. O'Brien     class multimap
9300db7afdSDavid E. O'Brien     {
9400db7afdSDavid E. O'Brien     public:
9500db7afdSDavid E. O'Brien       typedef _Key                                          key_type;
9600db7afdSDavid E. O'Brien       typedef _Tp                                           mapped_type;
97f8a1b7d9SAlexander Kabaev       typedef std::pair<const _Key, _Tp>                    value_type;
9800db7afdSDavid E. O'Brien       typedef _Compare                                      key_compare;
99f8a1b7d9SAlexander Kabaev       typedef _Alloc                                        allocator_type;
10000db7afdSDavid E. O'Brien 
101f8a1b7d9SAlexander Kabaev     private:
102f8a1b7d9SAlexander Kabaev       // concept requirements
103f8a1b7d9SAlexander Kabaev       typedef typename _Alloc::value_type                   _Alloc_value_type;
104f8a1b7d9SAlexander Kabaev       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
105f8a1b7d9SAlexander Kabaev       __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
106f8a1b7d9SAlexander Kabaev 				_BinaryFunctionConcept)
107f8a1b7d9SAlexander Kabaev       __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
108f8a1b7d9SAlexander Kabaev 
109f8a1b7d9SAlexander Kabaev     public:
1101b86b14eSAlexander Kabaev       class value_compare
111f8a1b7d9SAlexander Kabaev       : public std::binary_function<value_type, value_type, bool>
1121b86b14eSAlexander Kabaev       {
11300db7afdSDavid E. O'Brien 	friend class multimap<_Key, _Tp, _Compare, _Alloc>;
11400db7afdSDavid E. O'Brien       protected:
11500db7afdSDavid E. O'Brien 	_Compare comp;
116ffeaf689SAlexander Kabaev 
117ffeaf689SAlexander Kabaev 	value_compare(_Compare __c)
118ffeaf689SAlexander Kabaev 	: comp(__c) { }
119ffeaf689SAlexander Kabaev 
12000db7afdSDavid E. O'Brien       public:
1211b86b14eSAlexander Kabaev 	bool operator()(const value_type& __x, const value_type& __y) const
1221b86b14eSAlexander Kabaev 	{ return comp(__x.first, __y.first); }
12300db7afdSDavid E. O'Brien       };
12400db7afdSDavid E. O'Brien 
12500db7afdSDavid E. O'Brien     private:
1261b86b14eSAlexander Kabaev       /// @if maint  This turns a red-black tree into a [multi]map.  @endif
127f8a1b7d9SAlexander Kabaev       typedef typename _Alloc::template rebind<value_type>::other
128f8a1b7d9SAlexander Kabaev         _Pair_alloc_type;
129f8a1b7d9SAlexander Kabaev 
130f8a1b7d9SAlexander Kabaev       typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
131f8a1b7d9SAlexander Kabaev 		       key_compare, _Pair_alloc_type> _Rep_type;
1321b86b14eSAlexander Kabaev       /// @if maint  The actual tree structure.  @endif
1331b86b14eSAlexander Kabaev       _Rep_type _M_t;
1341b86b14eSAlexander Kabaev 
13500db7afdSDavid E. O'Brien     public:
1361b86b14eSAlexander Kabaev       // many of these are specified differently in ISO, but the following are
1371b86b14eSAlexander Kabaev       // "functionally equivalent"
138f8a1b7d9SAlexander Kabaev       typedef typename _Pair_alloc_type::pointer         pointer;
139f8a1b7d9SAlexander Kabaev       typedef typename _Pair_alloc_type::const_pointer   const_pointer;
140f8a1b7d9SAlexander Kabaev       typedef typename _Pair_alloc_type::reference       reference;
141f8a1b7d9SAlexander Kabaev       typedef typename _Pair_alloc_type::const_reference const_reference;
14200db7afdSDavid E. O'Brien       typedef typename _Rep_type::iterator               iterator;
14300db7afdSDavid E. O'Brien       typedef typename _Rep_type::const_iterator         const_iterator;
14400db7afdSDavid E. O'Brien       typedef typename _Rep_type::size_type              size_type;
14500db7afdSDavid E. O'Brien       typedef typename _Rep_type::difference_type        difference_type;
1461b86b14eSAlexander Kabaev       typedef typename _Rep_type::reverse_iterator       reverse_iterator;
1471b86b14eSAlexander Kabaev       typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
14800db7afdSDavid E. O'Brien 
1491b86b14eSAlexander Kabaev       // [23.3.2] construct/copy/destroy
1501b86b14eSAlexander Kabaev       // (get_allocator() is also listed in this section)
1511b86b14eSAlexander Kabaev       /**
1521b86b14eSAlexander Kabaev        *  @brief  Default constructor creates no elements.
1531b86b14eSAlexander Kabaev        */
154ffeaf689SAlexander Kabaev       multimap()
155dc3fe0ffSPedro F. Giffuni       : _M_t() { }
1561b86b14eSAlexander Kabaev 
1571b86b14eSAlexander Kabaev       // for some reason this was made a separate function
1581b86b14eSAlexander Kabaev       /**
1591b86b14eSAlexander Kabaev        *  @brief  Default constructor creates no elements.
1601b86b14eSAlexander Kabaev        */
1611b86b14eSAlexander Kabaev       explicit
162ffeaf689SAlexander Kabaev       multimap(const _Compare& __comp,
163ffeaf689SAlexander Kabaev 	       const allocator_type& __a = allocator_type())
16400db7afdSDavid E. O'Brien       : _M_t(__comp, __a) { }
16500db7afdSDavid E. O'Brien 
1661b86b14eSAlexander Kabaev       /**
1671b86b14eSAlexander Kabaev        *  @brief  %Multimap copy constructor.
1681b86b14eSAlexander Kabaev        *  @param  x  A %multimap of identical element and allocator types.
1691b86b14eSAlexander Kabaev        *
1701b86b14eSAlexander Kabaev        *  The newly-created %multimap uses a copy of the allocation object used
1711b86b14eSAlexander Kabaev        *  by @a x.
1721b86b14eSAlexander Kabaev        */
1731b86b14eSAlexander Kabaev       multimap(const multimap& __x)
1741b86b14eSAlexander Kabaev       : _M_t(__x._M_t) { }
1751b86b14eSAlexander Kabaev 
1761b86b14eSAlexander Kabaev       /**
1771b86b14eSAlexander Kabaev        *  @brief  Builds a %multimap from a range.
1781b86b14eSAlexander Kabaev        *  @param  first  An input iterator.
1791b86b14eSAlexander Kabaev        *  @param  last  An input iterator.
1801b86b14eSAlexander Kabaev        *
1811b86b14eSAlexander Kabaev        *  Create a %multimap consisting of copies of the elements from
1821b86b14eSAlexander Kabaev        *  [first,last).  This is linear in N if the range is already sorted,
1831b86b14eSAlexander Kabaev        *  and NlogN otherwise (where N is distance(first,last)).
1841b86b14eSAlexander Kabaev        */
1851b86b14eSAlexander Kabaev       template <typename _InputIterator>
18600db7afdSDavid E. O'Brien         multimap(_InputIterator __first, _InputIterator __last)
187dc3fe0ffSPedro F. Giffuni 	: _M_t()
188*b05e9616SMarius Strobl         { _M_t._M_insert_equal(__first, __last); }
18900db7afdSDavid E. O'Brien 
1901b86b14eSAlexander Kabaev       /**
1911b86b14eSAlexander Kabaev        *  @brief  Builds a %multimap from a range.
1921b86b14eSAlexander Kabaev        *  @param  first  An input iterator.
1931b86b14eSAlexander Kabaev        *  @param  last  An input iterator.
1941b86b14eSAlexander Kabaev        *  @param  comp  A comparison functor.
1951b86b14eSAlexander Kabaev        *  @param  a  An allocator object.
1961b86b14eSAlexander Kabaev        *
1971b86b14eSAlexander Kabaev        *  Create a %multimap consisting of copies of the elements from
1981b86b14eSAlexander Kabaev        *  [first,last).  This is linear in N if the range is already sorted,
1991b86b14eSAlexander Kabaev        *  and NlogN otherwise (where N is distance(first,last)).
2001b86b14eSAlexander Kabaev        */
2011b86b14eSAlexander Kabaev       template <typename _InputIterator>
20200db7afdSDavid E. O'Brien         multimap(_InputIterator __first, _InputIterator __last,
20300db7afdSDavid E. O'Brien 		 const _Compare& __comp,
20400db7afdSDavid E. O'Brien 		 const allocator_type& __a = allocator_type())
2051b86b14eSAlexander Kabaev         : _M_t(__comp, __a)
206f8a1b7d9SAlexander Kabaev         { _M_t._M_insert_equal(__first, __last); }
20700db7afdSDavid E. O'Brien 
2081b86b14eSAlexander Kabaev       // FIXME There is no dtor declared, but we should have something generated
2091b86b14eSAlexander Kabaev       // by Doxygen.  I don't know what tags to add to this paragraph to make
2101b86b14eSAlexander Kabaev       // that happen:
2111b86b14eSAlexander Kabaev       /**
2121b86b14eSAlexander Kabaev        *  The dtor only erases the elements, and note that if the elements
2131b86b14eSAlexander Kabaev        *  themselves are pointers, the pointed-to memory is not touched in any
2141b86b14eSAlexander Kabaev        *  way.  Managing the pointer is the user's responsibilty.
2151b86b14eSAlexander Kabaev        */
2161b86b14eSAlexander Kabaev 
2171b86b14eSAlexander Kabaev       /**
2181b86b14eSAlexander Kabaev        *  @brief  %Multimap assignment operator.
2191b86b14eSAlexander Kabaev        *  @param  x  A %multimap of identical element and allocator types.
2201b86b14eSAlexander Kabaev        *
2211b86b14eSAlexander Kabaev        *  All the elements of @a x are copied, but unlike the copy constructor,
2221b86b14eSAlexander Kabaev        *  the allocator object is not copied.
2231b86b14eSAlexander Kabaev        */
2241b86b14eSAlexander Kabaev       multimap&
2251b86b14eSAlexander Kabaev       operator=(const multimap& __x)
2261b86b14eSAlexander Kabaev       {
22700db7afdSDavid E. O'Brien 	_M_t = __x._M_t;
22800db7afdSDavid E. O'Brien 	return *this;
22900db7afdSDavid E. O'Brien       }
23000db7afdSDavid E. O'Brien 
2311b86b14eSAlexander Kabaev       /// Get a copy of the memory allocation object.
2321b86b14eSAlexander Kabaev       allocator_type
233ffeaf689SAlexander Kabaev       get_allocator() const
234ffeaf689SAlexander Kabaev       { return _M_t.get_allocator(); }
23500db7afdSDavid E. O'Brien 
2361b86b14eSAlexander Kabaev       // iterators
23700db7afdSDavid E. O'Brien       /**
23800db7afdSDavid E. O'Brien        *  Returns a read/write iterator that points to the first pair in the
239ffeaf689SAlexander Kabaev        *  %multimap.  Iteration is done in ascending order according to the
240ffeaf689SAlexander Kabaev        *  keys.
24100db7afdSDavid E. O'Brien        */
2421b86b14eSAlexander Kabaev       iterator
243ffeaf689SAlexander Kabaev       begin()
244ffeaf689SAlexander Kabaev       { return _M_t.begin(); }
24500db7afdSDavid E. O'Brien 
24600db7afdSDavid E. O'Brien       /**
24700db7afdSDavid E. O'Brien        *  Returns a read-only (constant) iterator that points to the first pair
248ffeaf689SAlexander Kabaev        *  in the %multimap.  Iteration is done in ascending order according to
249ffeaf689SAlexander Kabaev        *  the keys.
25000db7afdSDavid E. O'Brien        */
2511b86b14eSAlexander Kabaev       const_iterator
252ffeaf689SAlexander Kabaev       begin() const
253ffeaf689SAlexander Kabaev       { return _M_t.begin(); }
25400db7afdSDavid E. O'Brien 
25500db7afdSDavid E. O'Brien       /**
256ffeaf689SAlexander Kabaev        *  Returns a read/write iterator that points one past the last pair in
257ffeaf689SAlexander Kabaev        *  the %multimap.  Iteration is done in ascending order according to the
258ffeaf689SAlexander Kabaev        *  keys.
25900db7afdSDavid E. O'Brien        */
2601b86b14eSAlexander Kabaev       iterator
261ffeaf689SAlexander Kabaev       end()
262ffeaf689SAlexander Kabaev       { return _M_t.end(); }
26300db7afdSDavid E. O'Brien 
26400db7afdSDavid E. O'Brien       /**
26500db7afdSDavid E. O'Brien        *  Returns a read-only (constant) iterator that points one past the last
2661b86b14eSAlexander Kabaev        *  pair in the %multimap.  Iteration is done in ascending order according
26700db7afdSDavid E. O'Brien        *  to the keys.
26800db7afdSDavid E. O'Brien        */
2691b86b14eSAlexander Kabaev       const_iterator
270ffeaf689SAlexander Kabaev       end() const
271ffeaf689SAlexander Kabaev       { return _M_t.end(); }
27200db7afdSDavid E. O'Brien 
27300db7afdSDavid E. O'Brien       /**
27400db7afdSDavid E. O'Brien        *  Returns a read/write reverse iterator that points to the last pair in
2751b86b14eSAlexander Kabaev        *  the %multimap.  Iteration is done in descending order according to the
27600db7afdSDavid E. O'Brien        *  keys.
27700db7afdSDavid E. O'Brien        */
2781b86b14eSAlexander Kabaev       reverse_iterator
279ffeaf689SAlexander Kabaev       rbegin()
280ffeaf689SAlexander Kabaev       { return _M_t.rbegin(); }
28100db7afdSDavid E. O'Brien 
28200db7afdSDavid E. O'Brien       /**
283ffeaf689SAlexander Kabaev        *  Returns a read-only (constant) reverse iterator that points to the
284ffeaf689SAlexander Kabaev        *  last pair in the %multimap.  Iteration is done in descending order
285ffeaf689SAlexander Kabaev        *  according to the keys.
28600db7afdSDavid E. O'Brien        */
2871b86b14eSAlexander Kabaev       const_reverse_iterator
288ffeaf689SAlexander Kabaev       rbegin() const
289ffeaf689SAlexander Kabaev       { return _M_t.rbegin(); }
29000db7afdSDavid E. O'Brien 
29100db7afdSDavid E. O'Brien       /**
29200db7afdSDavid E. O'Brien        *  Returns a read/write reverse iterator that points to one before the
2931b86b14eSAlexander Kabaev        *  first pair in the %multimap.  Iteration is done in descending order
29400db7afdSDavid E. O'Brien        *  according to the keys.
29500db7afdSDavid E. O'Brien        */
2961b86b14eSAlexander Kabaev       reverse_iterator
297ffeaf689SAlexander Kabaev       rend()
298ffeaf689SAlexander Kabaev       { return _M_t.rend(); }
29900db7afdSDavid E. O'Brien 
30000db7afdSDavid E. O'Brien       /**
30100db7afdSDavid E. O'Brien        *  Returns a read-only (constant) reverse iterator that points to one
302ffeaf689SAlexander Kabaev        *  before the first pair in the %multimap.  Iteration is done in
303ffeaf689SAlexander Kabaev        *  descending order according to the keys.
30400db7afdSDavid E. O'Brien        */
3051b86b14eSAlexander Kabaev       const_reverse_iterator
306ffeaf689SAlexander Kabaev       rend() const
307ffeaf689SAlexander Kabaev       { return _M_t.rend(); }
30800db7afdSDavid E. O'Brien 
3091b86b14eSAlexander Kabaev       // capacity
3101b86b14eSAlexander Kabaev       /** Returns true if the %multimap is empty.  */
3111b86b14eSAlexander Kabaev       bool
312ffeaf689SAlexander Kabaev       empty() const
313ffeaf689SAlexander Kabaev       { return _M_t.empty(); }
31400db7afdSDavid E. O'Brien 
3151b86b14eSAlexander Kabaev       /** Returns the size of the %multimap.  */
3161b86b14eSAlexander Kabaev       size_type
317ffeaf689SAlexander Kabaev       size() const
318ffeaf689SAlexander Kabaev       { return _M_t.size(); }
31900db7afdSDavid E. O'Brien 
3201b86b14eSAlexander Kabaev       /** Returns the maximum size of the %multimap.  */
3211b86b14eSAlexander Kabaev       size_type
322ffeaf689SAlexander Kabaev       max_size() const
323ffeaf689SAlexander Kabaev       { return _M_t.max_size(); }
32400db7afdSDavid E. O'Brien 
3251b86b14eSAlexander Kabaev       // modifiers
32600db7afdSDavid E. O'Brien       /**
3271b86b14eSAlexander Kabaev        *  @brief Inserts a std::pair into the %multimap.
328ffeaf689SAlexander Kabaev        *  @param  x  Pair to be inserted (see std::make_pair for easy creation
329ffeaf689SAlexander Kabaev        *             of pairs).
33000db7afdSDavid E. O'Brien        *  @return An iterator that points to the inserted (key,value) pair.
33100db7afdSDavid E. O'Brien        *
332ffeaf689SAlexander Kabaev        *  This function inserts a (key, value) pair into the %multimap.
333ffeaf689SAlexander Kabaev        *  Contrary to a std::map the %multimap does not rely on unique keys and
334ffeaf689SAlexander Kabaev        *  thus multiple pairs with the same key can be inserted.
3351b86b14eSAlexander Kabaev        *
3361b86b14eSAlexander Kabaev        *  Insertion requires logarithmic time.
33700db7afdSDavid E. O'Brien        */
3381b86b14eSAlexander Kabaev       iterator
339ffeaf689SAlexander Kabaev       insert(const value_type& __x)
340f8a1b7d9SAlexander Kabaev       { return _M_t._M_insert_equal(__x); }
34100db7afdSDavid E. O'Brien 
34200db7afdSDavid E. O'Brien       /**
3431b86b14eSAlexander Kabaev        *  @brief Inserts a std::pair into the %multimap.
34400db7afdSDavid E. O'Brien        *  @param  position  An iterator that serves as a hint as to where the
34500db7afdSDavid E. O'Brien        *                    pair should be inserted.
346ffeaf689SAlexander Kabaev        *  @param  x  Pair to be inserted (see std::make_pair for easy creation
347ffeaf689SAlexander Kabaev        *             of pairs).
34800db7afdSDavid E. O'Brien        *  @return An iterator that points to the inserted (key,value) pair.
34900db7afdSDavid E. O'Brien        *
350ffeaf689SAlexander Kabaev        *  This function inserts a (key, value) pair into the %multimap.
351ffeaf689SAlexander Kabaev        *  Contrary to a std::map the %multimap does not rely on unique keys and
352ffeaf689SAlexander Kabaev        *  thus multiple pairs with the same key can be inserted.
35300db7afdSDavid E. O'Brien        *  Note that the first parameter is only a hint and can potentially
35400db7afdSDavid E. O'Brien        *  improve the performance of the insertion process.  A bad hint would
35500db7afdSDavid E. O'Brien        *  cause no gains in efficiency.
3561b86b14eSAlexander Kabaev        *
3571b86b14eSAlexander Kabaev        *  See http://gcc.gnu.org/onlinedocs/libstdc++/23_containers/howto.html#4
3581b86b14eSAlexander Kabaev        *  for more on "hinting".
3591b86b14eSAlexander Kabaev        *
3601b86b14eSAlexander Kabaev        *  Insertion requires logarithmic time (if the hint is not taken).
36100db7afdSDavid E. O'Brien        */
3621b86b14eSAlexander Kabaev       iterator
3631b86b14eSAlexander Kabaev       insert(iterator __position, const value_type& __x)
364f8a1b7d9SAlexander Kabaev       { return _M_t._M_insert_equal(__position, __x); }
36500db7afdSDavid E. O'Brien 
36600db7afdSDavid E. O'Brien       /**
3671b86b14eSAlexander Kabaev        *  @brief A template function that attemps to insert a range of elements.
36800db7afdSDavid E. O'Brien        *  @param  first  Iterator pointing to the start of the range to be
36900db7afdSDavid E. O'Brien        *                 inserted.
3701b86b14eSAlexander Kabaev        *  @param  last  Iterator pointing to the end of the range.
3711b86b14eSAlexander Kabaev        *
3721b86b14eSAlexander Kabaev        *  Complexity similar to that of the range constructor.
37300db7afdSDavid E. O'Brien        */
3741b86b14eSAlexander Kabaev       template <typename _InputIterator>
3751b86b14eSAlexander Kabaev         void
3761b86b14eSAlexander Kabaev         insert(_InputIterator __first, _InputIterator __last)
377f8a1b7d9SAlexander Kabaev         { _M_t._M_insert_equal(__first, __last); }
37800db7afdSDavid E. O'Brien 
37900db7afdSDavid E. O'Brien       /**
3801b86b14eSAlexander Kabaev        *  @brief Erases an element from a %multimap.
38100db7afdSDavid E. O'Brien        *  @param  position  An iterator pointing to the element to be erased.
38200db7afdSDavid E. O'Brien        *
383ffeaf689SAlexander Kabaev        *  This function erases an element, pointed to by the given iterator,
384ffeaf689SAlexander Kabaev        *  from a %multimap.  Note that this function only erases the element,
385ffeaf689SAlexander Kabaev        *  and that if the element is itself a pointer, the pointed-to memory is
386ffeaf689SAlexander Kabaev        *  not touched in any way.  Managing the pointer is the user's
387ffeaf689SAlexander Kabaev        *  responsibilty.
38800db7afdSDavid E. O'Brien        */
3891b86b14eSAlexander Kabaev       void
390ffeaf689SAlexander Kabaev       erase(iterator __position)
391ffeaf689SAlexander Kabaev       { _M_t.erase(__position); }
39200db7afdSDavid E. O'Brien 
39300db7afdSDavid E. O'Brien       /**
3941b86b14eSAlexander Kabaev        *  @brief Erases elements according to the provided key.
39500db7afdSDavid E. O'Brien        *  @param  x  Key of element to be erased.
3961b86b14eSAlexander Kabaev        *  @return  The number of elements erased.
39700db7afdSDavid E. O'Brien        *
3981b86b14eSAlexander Kabaev        *  This function erases all elements located by the given key from a
3991b86b14eSAlexander Kabaev        *  %multimap.
40000db7afdSDavid E. O'Brien        *  Note that this function only erases the element, and that if
40100db7afdSDavid E. O'Brien        *  the element is itself a pointer, the pointed-to memory is not touched
40200db7afdSDavid E. O'Brien        *  in any way.  Managing the pointer is the user's responsibilty.
40300db7afdSDavid E. O'Brien        */
4041b86b14eSAlexander Kabaev       size_type
405ffeaf689SAlexander Kabaev       erase(const key_type& __x)
406ffeaf689SAlexander Kabaev       { return _M_t.erase(__x); }
40700db7afdSDavid E. O'Brien 
40800db7afdSDavid E. O'Brien       /**
4091b86b14eSAlexander Kabaev        *  @brief Erases a [first,last) range of elements from a %multimap.
410ffeaf689SAlexander Kabaev        *  @param  first  Iterator pointing to the start of the range to be
411ffeaf689SAlexander Kabaev        *                 erased.
41200db7afdSDavid E. O'Brien        *  @param  last  Iterator pointing to the end of the range to be erased.
41300db7afdSDavid E. O'Brien        *
4141b86b14eSAlexander Kabaev        *  This function erases a sequence of elements from a %multimap.
41500db7afdSDavid E. O'Brien        *  Note that this function only erases the elements, and that if
41600db7afdSDavid E. O'Brien        *  the elements themselves are pointers, the pointed-to memory is not
41700db7afdSDavid E. O'Brien        *  touched in any way.  Managing the pointer is the user's responsibilty.
41800db7afdSDavid E. O'Brien        */
4191b86b14eSAlexander Kabaev       void
420ffeaf689SAlexander Kabaev       erase(iterator __first, iterator __last)
421ffeaf689SAlexander Kabaev       { _M_t.erase(__first, __last); }
42200db7afdSDavid E. O'Brien 
4231b86b14eSAlexander Kabaev       /**
4241b86b14eSAlexander Kabaev        *  @brief  Swaps data with another %multimap.
4251b86b14eSAlexander Kabaev        *  @param  x  A %multimap of the same element and allocator types.
4261b86b14eSAlexander Kabaev        *
4271b86b14eSAlexander Kabaev        *  This exchanges the elements between two multimaps in constant time.
4281b86b14eSAlexander Kabaev        *  (It is only swapping a pointer, an integer, and an instance of
4291b86b14eSAlexander Kabaev        *  the @c Compare type (which itself is often stateless and empty), so it
4301b86b14eSAlexander Kabaev        *  should be quite fast.)
4311b86b14eSAlexander Kabaev        *  Note that the global std::swap() function is specialized such that
4321b86b14eSAlexander Kabaev        *  std::swap(m1,m2) will feed to this function.
4331b86b14eSAlexander Kabaev        */
4341b86b14eSAlexander Kabaev       void
435ffeaf689SAlexander Kabaev       swap(multimap& __x)
436ffeaf689SAlexander Kabaev       { _M_t.swap(__x._M_t); }
4371b86b14eSAlexander Kabaev 
4381b86b14eSAlexander Kabaev       /**
439ffeaf689SAlexander Kabaev        *  Erases all elements in a %multimap.  Note that this function only
440ffeaf689SAlexander Kabaev        *  erases the elements, and that if the elements themselves are pointers,
441ffeaf689SAlexander Kabaev        *  the pointed-to memory is not touched in any way.  Managing the pointer
442ffeaf689SAlexander Kabaev        *  is the user's responsibilty.
44300db7afdSDavid E. O'Brien        */
4441b86b14eSAlexander Kabaev       void
445ffeaf689SAlexander Kabaev       clear()
446ffeaf689SAlexander Kabaev       { _M_t.clear(); }
44700db7afdSDavid E. O'Brien 
4481b86b14eSAlexander Kabaev       // observers
4491b86b14eSAlexander Kabaev       /**
4501b86b14eSAlexander Kabaev        *  Returns the key comparison object out of which the %multimap
4511b86b14eSAlexander Kabaev        *  was constructed.
4521b86b14eSAlexander Kabaev        */
4531b86b14eSAlexander Kabaev       key_compare
454ffeaf689SAlexander Kabaev       key_comp() const
455ffeaf689SAlexander Kabaev       { return _M_t.key_comp(); }
45600db7afdSDavid E. O'Brien 
45700db7afdSDavid E. O'Brien       /**
4581b86b14eSAlexander Kabaev        *  Returns a value comparison object, built from the key comparison
4591b86b14eSAlexander Kabaev        *  object out of which the %multimap was constructed.
4601b86b14eSAlexander Kabaev        */
4611b86b14eSAlexander Kabaev       value_compare
462ffeaf689SAlexander Kabaev       value_comp() const
463ffeaf689SAlexander Kabaev       { return value_compare(_M_t.key_comp()); }
4641b86b14eSAlexander Kabaev 
4651b86b14eSAlexander Kabaev       // multimap operations
4661b86b14eSAlexander Kabaev       /**
4671b86b14eSAlexander Kabaev        *  @brief Tries to locate an element in a %multimap.
46800db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
4691b86b14eSAlexander Kabaev        *  @return  Iterator pointing to sought-after element,
47000db7afdSDavid E. O'Brien        *           or end() if not found.
47100db7afdSDavid E. O'Brien        *
47200db7afdSDavid E. O'Brien        *  This function takes a key and tries to locate the element with which
47300db7afdSDavid E. O'Brien        *  the key matches.  If successful the function returns an iterator
4741b86b14eSAlexander Kabaev        *  pointing to the sought after %pair.  If unsuccessful it returns the
4751b86b14eSAlexander Kabaev        *  past-the-end ( @c end() ) iterator.
47600db7afdSDavid E. O'Brien        */
4771b86b14eSAlexander Kabaev       iterator
478ffeaf689SAlexander Kabaev       find(const key_type& __x)
479ffeaf689SAlexander Kabaev       { return _M_t.find(__x); }
48000db7afdSDavid E. O'Brien 
48100db7afdSDavid E. O'Brien       /**
4821b86b14eSAlexander Kabaev        *  @brief Tries to locate an element in a %multimap.
48300db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
4841b86b14eSAlexander Kabaev        *  @return  Read-only (constant) iterator pointing to sought-after
4851b86b14eSAlexander Kabaev        *           element, or end() if not found.
48600db7afdSDavid E. O'Brien        *
48700db7afdSDavid E. O'Brien        *  This function takes a key and tries to locate the element with which
488ffeaf689SAlexander Kabaev        *  the key matches.  If successful the function returns a constant
489ffeaf689SAlexander Kabaev        *  iterator pointing to the sought after %pair.  If unsuccessful it
490ffeaf689SAlexander Kabaev        *  returns the past-the-end ( @c end() ) iterator.
49100db7afdSDavid E. O'Brien        */
4921b86b14eSAlexander Kabaev       const_iterator
493ffeaf689SAlexander Kabaev       find(const key_type& __x) const
494ffeaf689SAlexander Kabaev       { return _M_t.find(__x); }
49500db7afdSDavid E. O'Brien 
49600db7afdSDavid E. O'Brien       /**
49700db7afdSDavid E. O'Brien        *  @brief Finds the number of elements with given key.
49800db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pairs to be located.
49900db7afdSDavid E. O'Brien        *  @return Number of elements with specified key.
50000db7afdSDavid E. O'Brien        */
5011b86b14eSAlexander Kabaev       size_type
502ffeaf689SAlexander Kabaev       count(const key_type& __x) const
503ffeaf689SAlexander Kabaev       { return _M_t.count(__x); }
50400db7afdSDavid E. O'Brien 
50500db7afdSDavid E. O'Brien       /**
50600db7afdSDavid E. O'Brien        *  @brief Finds the beginning of a subsequence matching given key.
50700db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
508ffeaf689SAlexander Kabaev        *  @return  Iterator pointing to first element equal to or greater
509ffeaf689SAlexander Kabaev        *           than key, or end().
51000db7afdSDavid E. O'Brien        *
51100db7afdSDavid E. O'Brien        *  This function returns the first element of a subsequence of elements
51200db7afdSDavid E. O'Brien        *  that matches the given key.  If unsuccessful it returns an iterator
51300db7afdSDavid E. O'Brien        *  pointing to the first element that has a greater value than given key
51400db7afdSDavid E. O'Brien        *  or end() if no such element exists.
51500db7afdSDavid E. O'Brien        */
5161b86b14eSAlexander Kabaev       iterator
517ffeaf689SAlexander Kabaev       lower_bound(const key_type& __x)
518ffeaf689SAlexander Kabaev       { return _M_t.lower_bound(__x); }
51900db7afdSDavid E. O'Brien 
52000db7afdSDavid E. O'Brien       /**
52100db7afdSDavid E. O'Brien        *  @brief Finds the beginning of a subsequence matching given key.
52200db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
52300db7afdSDavid E. O'Brien        *  @return  Read-only (constant) iterator pointing to first element
524ffeaf689SAlexander Kabaev        *           equal to or greater than key, or end().
52500db7afdSDavid E. O'Brien        *
52600db7afdSDavid E. O'Brien        *  This function returns the first element of a subsequence of elements
52700db7afdSDavid E. O'Brien        *  that matches the given key.  If unsuccessful the iterator will point
52800db7afdSDavid E. O'Brien        *  to the next greatest element or, if no such greater element exists, to
52900db7afdSDavid E. O'Brien        *  end().
53000db7afdSDavid E. O'Brien        */
5311b86b14eSAlexander Kabaev       const_iterator
532ffeaf689SAlexander Kabaev       lower_bound(const key_type& __x) const
533ffeaf689SAlexander Kabaev       { return _M_t.lower_bound(__x); }
53400db7afdSDavid E. O'Brien 
53500db7afdSDavid E. O'Brien       /**
53600db7afdSDavid E. O'Brien        *  @brief Finds the end of a subsequence matching given key.
53700db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
538ffeaf689SAlexander Kabaev        *  @return Iterator pointing to the first element
539ffeaf689SAlexander Kabaev        *          greater than key, or end().
54000db7afdSDavid E. O'Brien        */
5411b86b14eSAlexander Kabaev       iterator
542ffeaf689SAlexander Kabaev       upper_bound(const key_type& __x)
543ffeaf689SAlexander Kabaev       { return _M_t.upper_bound(__x); }
54400db7afdSDavid E. O'Brien 
54500db7afdSDavid E. O'Brien       /**
54600db7afdSDavid E. O'Brien        *  @brief Finds the end of a subsequence matching given key.
54700db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pair to be located.
548ffeaf689SAlexander Kabaev        *  @return  Read-only (constant) iterator pointing to first iterator
549ffeaf689SAlexander Kabaev        *           greater than key, or end().
55000db7afdSDavid E. O'Brien        */
5511b86b14eSAlexander Kabaev       const_iterator
552ffeaf689SAlexander Kabaev       upper_bound(const key_type& __x) const
553ffeaf689SAlexander Kabaev       { return _M_t.upper_bound(__x); }
55400db7afdSDavid E. O'Brien 
55500db7afdSDavid E. O'Brien       /**
55600db7afdSDavid E. O'Brien        *  @brief Finds a subsequence matching given key.
55700db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pairs to be located.
55800db7afdSDavid E. O'Brien        *  @return  Pair of iterators that possibly points to the subsequence
55900db7afdSDavid E. O'Brien        *           matching given key.
56000db7afdSDavid E. O'Brien        *
561ffeaf689SAlexander Kabaev        *  This function is equivalent to
562ffeaf689SAlexander Kabaev        *  @code
563ffeaf689SAlexander Kabaev        *    std::make_pair(c.lower_bound(val),
564ffeaf689SAlexander Kabaev        *                   c.upper_bound(val))
565ffeaf689SAlexander Kabaev        *  @endcode
566ffeaf689SAlexander Kabaev        *  (but is faster than making the calls separately).
56700db7afdSDavid E. O'Brien        */
568f8a1b7d9SAlexander Kabaev       std::pair<iterator, iterator>
569ffeaf689SAlexander Kabaev       equal_range(const key_type& __x)
570ffeaf689SAlexander Kabaev       { return _M_t.equal_range(__x); }
57100db7afdSDavid E. O'Brien 
57200db7afdSDavid E. O'Brien       /**
57300db7afdSDavid E. O'Brien        *  @brief Finds a subsequence matching given key.
57400db7afdSDavid E. O'Brien        *  @param  x  Key of (key, value) pairs to be located.
575ffeaf689SAlexander Kabaev        *  @return  Pair of read-only (constant) iterators that possibly points
576ffeaf689SAlexander Kabaev        *           to the subsequence matching given key.
57700db7afdSDavid E. O'Brien        *
578ffeaf689SAlexander Kabaev        *  This function is equivalent to
579ffeaf689SAlexander Kabaev        *  @code
580ffeaf689SAlexander Kabaev        *    std::make_pair(c.lower_bound(val),
581ffeaf689SAlexander Kabaev        *                   c.upper_bound(val))
582ffeaf689SAlexander Kabaev        *  @endcode
583ffeaf689SAlexander Kabaev        *  (but is faster than making the calls separately).
58400db7afdSDavid E. O'Brien        */
585f8a1b7d9SAlexander Kabaev       std::pair<const_iterator, const_iterator>
586ffeaf689SAlexander Kabaev       equal_range(const key_type& __x) const
587ffeaf689SAlexander Kabaev       { return _M_t.equal_range(__x); }
58800db7afdSDavid E. O'Brien 
5891b86b14eSAlexander Kabaev       template <typename _K1, typename _T1, typename _C1, typename _A1>
590ffeaf689SAlexander Kabaev         friend bool
591ffeaf689SAlexander Kabaev         operator== (const multimap<_K1, _T1, _C1, _A1>&,
59200db7afdSDavid E. O'Brien 		    const multimap<_K1, _T1, _C1, _A1>&);
593ffeaf689SAlexander Kabaev 
5941b86b14eSAlexander Kabaev       template <typename _K1, typename _T1, typename _C1, typename _A1>
595ffeaf689SAlexander Kabaev         friend bool
596ffeaf689SAlexander Kabaev         operator< (const multimap<_K1, _T1, _C1, _A1>&,
59700db7afdSDavid E. O'Brien 		   const multimap<_K1, _T1, _C1, _A1>&);
59800db7afdSDavid E. O'Brien   };
59900db7afdSDavid E. O'Brien 
6001b86b14eSAlexander Kabaev   /**
6011b86b14eSAlexander Kabaev    *  @brief  Multimap equality comparison.
6021b86b14eSAlexander Kabaev    *  @param  x  A %multimap.
6031b86b14eSAlexander Kabaev    *  @param  y  A %multimap of the same type as @a x.
6041b86b14eSAlexander Kabaev    *  @return  True iff the size and elements of the maps are equal.
6051b86b14eSAlexander Kabaev    *
6061b86b14eSAlexander Kabaev    *  This is an equivalence relation.  It is linear in the size of the
6071b86b14eSAlexander Kabaev    *  multimaps.  Multimaps are considered equivalent if their sizes are equal,
6081b86b14eSAlexander Kabaev    *  and if corresponding elements compare equal.
6091b86b14eSAlexander Kabaev   */
6101b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6111b86b14eSAlexander Kabaev     inline bool
6121b86b14eSAlexander Kabaev     operator==(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6131b86b14eSAlexander Kabaev                const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
614ffeaf689SAlexander Kabaev     { return __x._M_t == __y._M_t; }
61500db7afdSDavid E. O'Brien 
6161b86b14eSAlexander Kabaev   /**
6171b86b14eSAlexander Kabaev    *  @brief  Multimap ordering relation.
6181b86b14eSAlexander Kabaev    *  @param  x  A %multimap.
6191b86b14eSAlexander Kabaev    *  @param  y  A %multimap of the same type as @a x.
620ffeaf689SAlexander Kabaev    *  @return  True iff @a x is lexicographically less than @a y.
6211b86b14eSAlexander Kabaev    *
6221b86b14eSAlexander Kabaev    *  This is a total ordering relation.  It is linear in the size of the
6231b86b14eSAlexander Kabaev    *  multimaps.  The elements must be comparable with @c <.
6241b86b14eSAlexander Kabaev    *
625ffeaf689SAlexander Kabaev    *  See std::lexicographical_compare() for how the determination is made.
6261b86b14eSAlexander Kabaev   */
6271b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6281b86b14eSAlexander Kabaev     inline bool
6291b86b14eSAlexander Kabaev     operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6301b86b14eSAlexander Kabaev               const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6311b86b14eSAlexander Kabaev     { return __x._M_t < __y._M_t; }
63200db7afdSDavid E. O'Brien 
6331b86b14eSAlexander Kabaev   /// Based on operator==
6341b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6351b86b14eSAlexander Kabaev     inline bool
6361b86b14eSAlexander Kabaev     operator!=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6371b86b14eSAlexander Kabaev                const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6381b86b14eSAlexander Kabaev     { return !(__x == __y); }
63900db7afdSDavid E. O'Brien 
6401b86b14eSAlexander Kabaev   /// Based on operator<
6411b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6421b86b14eSAlexander Kabaev     inline bool
6431b86b14eSAlexander Kabaev     operator>(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6441b86b14eSAlexander Kabaev               const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6451b86b14eSAlexander Kabaev     { return __y < __x; }
64600db7afdSDavid E. O'Brien 
6471b86b14eSAlexander Kabaev   /// Based on operator<
6481b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6491b86b14eSAlexander Kabaev     inline bool
6501b86b14eSAlexander Kabaev     operator<=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6511b86b14eSAlexander Kabaev                const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6521b86b14eSAlexander Kabaev     { return !(__y < __x); }
65300db7afdSDavid E. O'Brien 
6541b86b14eSAlexander Kabaev   /// Based on operator<
6551b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6561b86b14eSAlexander Kabaev     inline bool
6571b86b14eSAlexander Kabaev     operator>=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6581b86b14eSAlexander Kabaev                const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6591b86b14eSAlexander Kabaev     { return !(__x < __y); }
66000db7afdSDavid E. O'Brien 
6611b86b14eSAlexander Kabaev   /// See std::multimap::swap().
6621b86b14eSAlexander Kabaev   template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
6631b86b14eSAlexander Kabaev     inline void
swap(multimap<_Key,_Tp,_Compare,_Alloc> & __x,multimap<_Key,_Tp,_Compare,_Alloc> & __y)6641b86b14eSAlexander Kabaev     swap(multimap<_Key, _Tp, _Compare, _Alloc>& __x,
6651b86b14eSAlexander Kabaev          multimap<_Key, _Tp, _Compare, _Alloc>& __y)
6661b86b14eSAlexander Kabaev     { __x.swap(__y); }
667f8a1b7d9SAlexander Kabaev 
668f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NESTED_NAMESPACE
66900db7afdSDavid E. O'Brien 
670ffeaf689SAlexander Kabaev #endif /* _MULTIMAP_H */
671