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