1    	// Map implementation -*- C++ -*-
2    	
3    	// Copyright (C) 2001-2013 Free Software Foundation, Inc.
4    	//
5    	// This file is part of the GNU ISO C++ Library.  This library is free
6    	// software; you can redistribute it and/or modify it under the
7    	// terms of the GNU General Public License as published by the
8    	// Free Software Foundation; either version 3, or (at your option)
9    	// any later version.
10   	
11   	// This library is distributed in the hope that it will be useful,
12   	// but WITHOUT ANY WARRANTY; without even the implied warranty of
13   	// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   	// GNU General Public License for more details.
15   	
16   	// Under Section 7 of GPL version 3, you are granted additional
17   	// permissions described in the GCC Runtime Library Exception, version
18   	// 3.1, as published by the Free Software Foundation.
19   	
20   	// You should have received a copy of the GNU General Public License and
21   	// a copy of the GCC Runtime Library Exception along with this program;
22   	// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23   	// <http://www.gnu.org/licenses/>.
24   	
25   	/*
26   	 *
27   	 * Copyright (c) 1994
28   	 * Hewlett-Packard Company
29   	 *
30   	 * Permission to use, copy, modify, distribute and sell this software
31   	 * and its documentation for any purpose is hereby granted without fee,
32   	 * provided that the above copyright notice appear in all copies and
33   	 * that both that copyright notice and this permission notice appear
34   	 * in supporting documentation.  Hewlett-Packard Company makes no
35   	 * representations about the suitability of this software for any
36   	 * purpose.  It is provided "as is" without express or implied warranty.
37   	 *
38   	 *
39   	 * Copyright (c) 1996,1997
40   	 * Silicon Graphics Computer Systems, Inc.
41   	 *
42   	 * Permission to use, copy, modify, distribute and sell this software
43   	 * and its documentation for any purpose is hereby granted without fee,
44   	 * provided that the above copyright notice appear in all copies and
45   	 * that both that copyright notice and this permission notice appear
46   	 * in supporting documentation.  Silicon Graphics makes no
47   	 * representations about the suitability of this software for any
48   	 * purpose.  It is provided "as is" without express or implied warranty.
49   	 */
50   	
51   	/** @file bits/stl_map.h
52   	 *  This is an internal header file, included by other library headers.
53   	 *  Do not attempt to use it directly. @headername{map}
54   	 */
55   	
56   	#ifndef _STL_MAP_H
57   	#define _STL_MAP_H 1
58   	
59   	#include <bits/functexcept.h>
60   	#include <bits/concept_check.h>
61   	#if __cplusplus >= 201103L
62   	#include <initializer_list>
63   	#include <tuple>
64   	#endif
65   	
66   	namespace std _GLIBCXX_VISIBILITY(default)
67   	{
68   	_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
69   	
70   	  /**
71   	   *  @brief A standard container made up of (key,value) pairs, which can be
72   	   *  retrieved based on a key, in logarithmic time.
73   	   *
74   	   *  @ingroup associative_containers
75   	   *
76   	   *  @tparam _Key  Type of key objects.
77   	   *  @tparam  _Tp  Type of mapped objects.
78   	   *  @tparam _Compare  Comparison function object type, defaults to less<_Key>.
79   	   *  @tparam _Alloc  Allocator type, defaults to 
80   	   *                  allocator<pair<const _Key, _Tp>.
81   	   *
82   	   *  Meets the requirements of a <a href="tables.html#65">container</a>, a
83   	   *  <a href="tables.html#66">reversible container</a>, and an
84   	   *  <a href="tables.html#69">associative container</a> (using unique keys).
85   	   *  For a @c map<Key,T> the key_type is Key, the mapped_type is T, and the
86   	   *  value_type is std::pair<const Key,T>.
87   	   *
88   	   *  Maps support bidirectional iterators.
89   	   *
90   	   *  The private tree data is declared exactly the same way for map and
91   	   *  multimap; the distinction is made entirely in how the tree functions are
92   	   *  called (*_unique versus *_equal, same as the standard).
93   	  */
94   	  template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
95   	            typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
96   	    class map
97   	    {
98   	    public:
99   	      typedef _Key                                          key_type;
100  	      typedef _Tp                                           mapped_type;
101  	      typedef std::pair<const _Key, _Tp>                    value_type;
102  	      typedef _Compare                                      key_compare;
103  	      typedef _Alloc                                        allocator_type;
104  	
105  	    private:
106  	      // concept requirements
107  	      typedef typename _Alloc::value_type                   _Alloc_value_type;
108  	      __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
109  	      __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
110  					_BinaryFunctionConcept)
111  	      __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
112  	
113  	    public:
114  	      class value_compare
115  	      : public std::binary_function<value_type, value_type, bool>
116  	      {
117  		friend class map<_Key, _Tp, _Compare, _Alloc>;
118  	      protected:
119  		_Compare comp;
120  	
121  		value_compare(_Compare __c)
122  		: comp(__c) { }
123  	
124  	      public:
125  		bool operator()(const value_type& __x, const value_type& __y) const
126  		{ return comp(__x.first, __y.first); }
127  	      };
128  	
129  	    private:
130  	      /// This turns a red-black tree into a [multi]map. 
131  	      typedef typename _Alloc::template rebind<value_type>::other 
132  	        _Pair_alloc_type;
133  	
134  	      typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
135  			       key_compare, _Pair_alloc_type> _Rep_type;
136  	
137  	      /// The actual tree structure.
138  	      _Rep_type _M_t;
139  	
140  	    public:
141  	      // many of these are specified differently in ISO, but the following are
142  	      // "functionally equivalent"
143  	      typedef typename _Pair_alloc_type::pointer         pointer;
144  	      typedef typename _Pair_alloc_type::const_pointer   const_pointer;
145  	      typedef typename _Pair_alloc_type::reference       reference;
146  	      typedef typename _Pair_alloc_type::const_reference const_reference;
147  	      typedef typename _Rep_type::iterator               iterator;
148  	      typedef typename _Rep_type::const_iterator         const_iterator;
149  	      typedef typename _Rep_type::size_type              size_type;
150  	      typedef typename _Rep_type::difference_type        difference_type;
151  	      typedef typename _Rep_type::reverse_iterator       reverse_iterator;
152  	      typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
153  	
154  	      // [23.3.1.1] construct/copy/destroy
155  	      // (get_allocator() is normally listed in this section, but seems to have
156  	      // been accidentally omitted in the printed standard)
157  	      /**
158  	       *  @brief  Default constructor creates no elements.
159  	       */
160  	      map()
161  	      : _M_t() { }
162  	
163  	      /**
164  	       *  @brief  Creates a %map with no elements.
165  	       *  @param  __comp  A comparison object.
166  	       *  @param  __a  An allocator object.
167  	       */
168  	      explicit
169  	      map(const _Compare& __comp,
170  		  const allocator_type& __a = allocator_type())
171  	      : _M_t(__comp, _Pair_alloc_type(__a)) { }
172  	
173  	      /**
174  	       *  @brief  %Map copy constructor.
175  	       *  @param  __x  A %map of identical element and allocator types.
176  	       *
177  	       *  The newly-created %map uses a copy of the allocation object
178  	       *  used by @a __x.
179  	       */
180  	      map(const map& __x)
181  	      : _M_t(__x._M_t) { }
182  	
183  	#if __cplusplus >= 201103L
184  	      /**
185  	       *  @brief  %Map move constructor.
186  	       *  @param  __x  A %map of identical element and allocator types.
187  	       *
188  	       *  The newly-created %map contains the exact contents of @a __x.
189  	       *  The contents of @a __x are a valid, but unspecified %map.
190  	       */
191  	      map(map&& __x)
192  	      noexcept(is_nothrow_copy_constructible<_Compare>::value)
193  	      : _M_t(std::move(__x._M_t)) { }
194  	
195  	      /**
196  	       *  @brief  Builds a %map from an initializer_list.
197  	       *  @param  __l  An initializer_list.
198  	       *  @param  __comp  A comparison object.
199  	       *  @param  __a  An allocator object.
200  	       *
201  	       *  Create a %map consisting of copies of the elements in the
202  	       *  initializer_list @a __l.
203  	       *  This is linear in N if the range is already sorted, and NlogN
204  	       *  otherwise (where N is @a __l.size()).
205  	       */
206  	      map(initializer_list<value_type> __l,
207  		  const _Compare& __comp = _Compare(),
208  		  const allocator_type& __a = allocator_type())
209  	      : _M_t(__comp, _Pair_alloc_type(__a))
210  	      { _M_t._M_insert_unique(__l.begin(), __l.end()); }
211  	#endif
212  	
213  	      /**
214  	       *  @brief  Builds a %map from a range.
215  	       *  @param  __first  An input iterator.
216  	       *  @param  __last  An input iterator.
217  	       *
218  	       *  Create a %map consisting of copies of the elements from
219  	       *  [__first,__last).  This is linear in N if the range is
220  	       *  already sorted, and NlogN otherwise (where N is
221  	       *  distance(__first,__last)).
222  	       */
223  	      template<typename _InputIterator>
224  	        map(_InputIterator __first, _InputIterator __last)
225  		: _M_t()
226  	        { _M_t._M_insert_unique(__first, __last); }
227  	
228  	      /**
229  	       *  @brief  Builds a %map from a range.
230  	       *  @param  __first  An input iterator.
231  	       *  @param  __last  An input iterator.
232  	       *  @param  __comp  A comparison functor.
233  	       *  @param  __a  An allocator object.
234  	       *
235  	       *  Create a %map consisting of copies of the elements from
236  	       *  [__first,__last).  This is linear in N if the range is
237  	       *  already sorted, and NlogN otherwise (where N is
238  	       *  distance(__first,__last)).
239  	       */
240  	      template<typename _InputIterator>
241  	        map(_InputIterator __first, _InputIterator __last,
242  		    const _Compare& __comp,
243  		    const allocator_type& __a = allocator_type())
244  		: _M_t(__comp, _Pair_alloc_type(__a))
245  	        { _M_t._M_insert_unique(__first, __last); }
246  	
247  	      // FIXME There is no dtor declared, but we should have something
248  	      // generated by Doxygen.  I don't know what tags to add to this
249  	      // paragraph to make that happen:
250  	      /**
251  	       *  The dtor only erases the elements, and note that if the elements
252  	       *  themselves are pointers, the pointed-to memory is not touched in any
253  	       *  way.  Managing the pointer is the user's responsibility.
254  	       */
255  	
256  	      /**
257  	       *  @brief  %Map assignment operator.
258  	       *  @param  __x  A %map of identical element and allocator types.
259  	       *
260  	       *  All the elements of @a __x are copied, but unlike the copy
261  	       *  constructor, the allocator object is not copied.
262  	       */
263  	      map&
264  	      operator=(const map& __x)
265  	      {
266  		_M_t = __x._M_t;
267  		return *this;
268  	      }
269  	
270  	#if __cplusplus >= 201103L
271  	      /**
272  	       *  @brief  %Map move assignment operator.
273  	       *  @param  __x  A %map of identical element and allocator types.
274  	       *
275  	       *  The contents of @a __x are moved into this map (without copying).
276  	       *  @a __x is a valid, but unspecified %map.
277  	       */
278  	      map&
279  	      operator=(map&& __x)
280  	      {
281  		// NB: DR 1204.
282  		// NB: DR 675.
283  		this->clear();
284  		this->swap(__x);
285  		return *this;
286  	      }
287  	
288  	      /**
289  	       *  @brief  %Map list assignment operator.
290  	       *  @param  __l  An initializer_list.
291  	       *
292  	       *  This function fills a %map with copies of the elements in the
293  	       *  initializer list @a __l.
294  	       *
295  	       *  Note that the assignment completely changes the %map and
296  	       *  that the resulting %map's size is the same as the number
297  	       *  of elements assigned.  Old data may be lost.
298  	       */
299  	      map&
300  	      operator=(initializer_list<value_type> __l)
301  	      {
302  		this->clear();
303  		this->insert(__l.begin(), __l.end());
304  		return *this;
305  	      }
306  	#endif
307  	
308  	      /// Get a copy of the memory allocation object.
309  	      allocator_type
310  	      get_allocator() const _GLIBCXX_NOEXCEPT
311  	      { return allocator_type(_M_t.get_allocator()); }
312  	
313  	      // iterators
314  	      /**
315  	       *  Returns a read/write iterator that points to the first pair in the
316  	       *  %map.
317  	       *  Iteration is done in ascending order according to the keys.
318  	       */
319  	      iterator
320  	      begin() _GLIBCXX_NOEXCEPT
321  	      { return _M_t.begin(); }
322  	
323  	      /**
324  	       *  Returns a read-only (constant) iterator that points to the first pair
325  	       *  in the %map.  Iteration is done in ascending order according to the
326  	       *  keys.
327  	       */
328  	      const_iterator
329  	      begin() const _GLIBCXX_NOEXCEPT
330  	      { return _M_t.begin(); }
331  	
332  	      /**
333  	       *  Returns a read/write iterator that points one past the last
334  	       *  pair in the %map.  Iteration is done in ascending order
335  	       *  according to the keys.
336  	       */
337  	      iterator
338  	      end() _GLIBCXX_NOEXCEPT
339  	      { return _M_t.end(); }
340  	
341  	      /**
342  	       *  Returns a read-only (constant) iterator that points one past the last
343  	       *  pair in the %map.  Iteration is done in ascending order according to
344  	       *  the keys.
345  	       */
346  	      const_iterator
347  	      end() const _GLIBCXX_NOEXCEPT
348  	      { return _M_t.end(); }
349  	
350  	      /**
351  	       *  Returns a read/write reverse iterator that points to the last pair in
352  	       *  the %map.  Iteration is done in descending order according to the
353  	       *  keys.
354  	       */
355  	      reverse_iterator
356  	      rbegin() _GLIBCXX_NOEXCEPT
357  	      { return _M_t.rbegin(); }
358  	
359  	      /**
360  	       *  Returns a read-only (constant) reverse iterator that points to the
361  	       *  last pair in the %map.  Iteration is done in descending order
362  	       *  according to the keys.
363  	       */
364  	      const_reverse_iterator
365  	      rbegin() const _GLIBCXX_NOEXCEPT
366  	      { return _M_t.rbegin(); }
367  	
368  	      /**
369  	       *  Returns a read/write reverse iterator that points to one before the
370  	       *  first pair in the %map.  Iteration is done in descending order
371  	       *  according to the keys.
372  	       */
373  	      reverse_iterator
374  	      rend() _GLIBCXX_NOEXCEPT
375  	      { return _M_t.rend(); }
376  	
377  	      /**
378  	       *  Returns a read-only (constant) reverse iterator that points to one
379  	       *  before the first pair in the %map.  Iteration is done in descending
380  	       *  order according to the keys.
381  	       */
382  	      const_reverse_iterator
383  	      rend() const _GLIBCXX_NOEXCEPT
384  	      { return _M_t.rend(); }
385  	
386  	#if __cplusplus >= 201103L
387  	      /**
388  	       *  Returns a read-only (constant) iterator that points to the first pair
389  	       *  in the %map.  Iteration is done in ascending order according to the
390  	       *  keys.
391  	       */
392  	      const_iterator
393  	      cbegin() const noexcept
394  	      { return _M_t.begin(); }
395  	
396  	      /**
397  	       *  Returns a read-only (constant) iterator that points one past the last
398  	       *  pair in the %map.  Iteration is done in ascending order according to
399  	       *  the keys.
400  	       */
401  	      const_iterator
402  	      cend() const noexcept
403  	      { return _M_t.end(); }
404  	
405  	      /**
406  	       *  Returns a read-only (constant) reverse iterator that points to the
407  	       *  last pair in the %map.  Iteration is done in descending order
408  	       *  according to the keys.
409  	       */
410  	      const_reverse_iterator
411  	      crbegin() const noexcept
412  	      { return _M_t.rbegin(); }
413  	
414  	      /**
415  	       *  Returns a read-only (constant) reverse iterator that points to one
416  	       *  before the first pair in the %map.  Iteration is done in descending
417  	       *  order according to the keys.
418  	       */
419  	      const_reverse_iterator
420  	      crend() const noexcept
421  	      { return _M_t.rend(); }
422  	#endif
423  	
424  	      // capacity
425  	      /** Returns true if the %map is empty.  (Thus begin() would equal
426  	       *  end().)
427  	      */
428  	      bool
429  	      empty() const _GLIBCXX_NOEXCEPT
430  	      { return _M_t.empty(); }
431  	
432  	      /** Returns the size of the %map.  */
433  	      size_type
434  	      size() const _GLIBCXX_NOEXCEPT
435  	      { return _M_t.size(); }
436  	
437  	      /** Returns the maximum size of the %map.  */
438  	      size_type
439  	      max_size() const _GLIBCXX_NOEXCEPT
440  	      { return _M_t.max_size(); }
441  	
442  	      // [23.3.1.2] element access
443  	      /**
444  	       *  @brief  Subscript ( @c [] ) access to %map data.
445  	       *  @param  __k  The key for which data should be retrieved.
446  	       *  @return  A reference to the data of the (key,data) %pair.
447  	       *
448  	       *  Allows for easy lookup with the subscript ( @c [] )
449  	       *  operator.  Returns data associated with the key specified in
450  	       *  subscript.  If the key does not exist, a pair with that key
451  	       *  is created using default values, which is then returned.
452  	       *
453  	       *  Lookup requires logarithmic time.
454  	       */
455  	      mapped_type&
456  	      operator[](const key_type& __k)
457  	      {
458  		// concept requirements
459  		__glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
460  	
461  		iterator __i = lower_bound(__k);
462  		// __i->first is greater than or equivalent to __k.
463  		if (__i == end() || key_comp()(__k, (*__i).first))
464  	#if __cplusplus >= 201103L
465  		  __i = _M_t._M_emplace_hint_unique(__i, std::piecewise_construct,
466  						    std::tuple<const key_type&>(__k),
467  						    std::tuple<>());
468  	#else
469  	          __i = insert(__i, value_type(__k, mapped_type()));
470  	#endif
471  		return (*__i).second;
472  	      }
473  	
474  	#if __cplusplus >= 201103L
475  	      mapped_type&
476  	      operator[](key_type&& __k)
477  	      {
478  		// concept requirements
479  		__glibcxx_function_requires(_DefaultConstructibleConcept<mapped_type>)
480  	
481  		iterator __i = lower_bound(__k);
482  		// __i->first is greater than or equivalent to __k.
483  		if (__i == end() || key_comp()(__k, (*__i).first))
484  		  __i = _M_t._M_emplace_hint_unique(__i, std::piecewise_construct,
485  						std::forward_as_tuple(std::move(__k)),
486  						std::tuple<>());
487  		return (*__i).second;
488  	      }
489  	#endif
490  	
491  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
492  	      // DR 464. Suggestion for new member functions in standard containers.
493  	      /**
494  	       *  @brief  Access to %map data.
495  	       *  @param  __k  The key for which data should be retrieved.
496  	       *  @return  A reference to the data whose key is equivalent to @a __k, if
497  	       *           such a data is present in the %map.
498  	       *  @throw  std::out_of_range  If no such data is present.
499  	       */
500  	      mapped_type&
501  	      at(const key_type& __k)
502  	      {
503  		iterator __i = lower_bound(__k);
504  		if (__i == end() || key_comp()(__k, (*__i).first))
505  		  __throw_out_of_range(__N("map::at"));
506  		return (*__i).second;
507  	      }
508  	
509  	      const mapped_type&
510  	      at(const key_type& __k) const
511  	      {
512  		const_iterator __i = lower_bound(__k);
513  		if (__i == end() || key_comp()(__k, (*__i).first))
514  		  __throw_out_of_range(__N("map::at"));
515  		return (*__i).second;
516  	      }
517  	
518  	      // modifiers
519  	#if __cplusplus >= 201103L
520  	      /**
521  	       *  @brief Attempts to build and insert a std::pair into the %map.
522  	       *
523  	       *  @param __args  Arguments used to generate a new pair instance (see
524  	       *	        std::piecewise_contruct for passing arguments to each
525  	       *	        part of the pair constructor).
526  	       *
527  	       *  @return  A pair, of which the first element is an iterator that points
528  	       *           to the possibly inserted pair, and the second is a bool that
529  	       *           is true if the pair was actually inserted.
530  	       *
531  	       *  This function attempts to build and insert a (key, value) %pair into
532  	       *  the %map.
533  	       *  A %map relies on unique keys and thus a %pair is only inserted if its
534  	       *  first element (the key) is not already present in the %map.
535  	       *
536  	       *  Insertion requires logarithmic time.
537  	       */
538  	      template<typename... _Args>
539  		std::pair<iterator, bool>
540  		emplace(_Args&&... __args)
541  		{ return _M_t._M_emplace_unique(std::forward<_Args>(__args)...); }
542  	
543  	      /**
544  	       *  @brief Attempts to build and insert a std::pair into the %map.
545  	       *
546  	       *  @param  __pos  An iterator that serves as a hint as to where the pair
547  	       *                should be inserted.
548  	       *  @param  __args  Arguments used to generate a new pair instance (see
549  	       *	         std::piecewise_contruct for passing arguments to each
550  	       *	         part of the pair constructor).
551  	       *  @return An iterator that points to the element with key of the
552  	       *          std::pair built from @a __args (may or may not be that
553  	       *          std::pair).
554  	       *
555  	       *  This function is not concerned about whether the insertion took place,
556  	       *  and thus does not return a boolean like the single-argument emplace()
557  	       *  does.
558  	       *  Note that the first parameter is only a hint and can potentially
559  	       *  improve the performance of the insertion process. A bad hint would
560  	       *  cause no gains in efficiency.
561  	       *
562  	       *  See
563  	       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html
564  	       *  for more on @a hinting.
565  	       *
566  	       *  Insertion requires logarithmic time (if the hint is not taken).
567  	       */
568  	      template<typename... _Args>
569  		iterator
570  		emplace_hint(const_iterator __pos, _Args&&... __args)
571  		{
572  		  return _M_t._M_emplace_hint_unique(__pos,
573  						     std::forward<_Args>(__args)...);
574  		}
575  	#endif
576  	
577  	      /**
578  	       *  @brief Attempts to insert a std::pair into the %map.
579  	
580  	       *  @param __x Pair to be inserted (see std::make_pair for easy
581  	       *	     creation of pairs).
582  	       *
583  	       *  @return  A pair, of which the first element is an iterator that 
584  	       *           points to the possibly inserted pair, and the second is 
585  	       *           a bool that is true if the pair was actually inserted.
586  	       *
587  	       *  This function attempts to insert a (key, value) %pair into the %map.
588  	       *  A %map relies on unique keys and thus a %pair is only inserted if its
589  	       *  first element (the key) is not already present in the %map.
590  	       *
591  	       *  Insertion requires logarithmic time.
592  	       */
593  	      std::pair<iterator, bool>
594  	      insert(const value_type& __x)
595  	      { return _M_t._M_insert_unique(__x); }
596  	
597  	#if __cplusplus >= 201103L
598  	      template<typename _Pair, typename = typename
599  		       std::enable_if<std::is_constructible<value_type,
600  							    _Pair&&>::value>::type>
601  	        std::pair<iterator, bool>
602  	        insert(_Pair&& __x)
603  	        { return _M_t._M_insert_unique(std::forward<_Pair>(__x)); }
604  	#endif
605  	
606  	#if __cplusplus >= 201103L
607  	      /**
608  	       *  @brief Attempts to insert a list of std::pairs into the %map.
609  	       *  @param  __list  A std::initializer_list<value_type> of pairs to be
610  	       *                  inserted.
611  	       *
612  	       *  Complexity similar to that of the range constructor.
613  	       */
614  	      void
615  	      insert(std::initializer_list<value_type> __list)
616  	      { insert(__list.begin(), __list.end()); }
617  	#endif
618  	
619  	      /**
620  	       *  @brief Attempts to insert a std::pair into the %map.
621  	       *  @param  __position  An iterator that serves as a hint as to where the
622  	       *                    pair should be inserted.
623  	       *  @param  __x  Pair to be inserted (see std::make_pair for easy creation
624  	       *               of pairs).
625  	       *  @return An iterator that points to the element with key of
626  	       *           @a __x (may or may not be the %pair passed in).
627  	       *
628  	
629  	       *  This function is not concerned about whether the insertion
630  	       *  took place, and thus does not return a boolean like the
631  	       *  single-argument insert() does.  Note that the first
632  	       *  parameter is only a hint and can potentially improve the
633  	       *  performance of the insertion process.  A bad hint would
634  	       *  cause no gains in efficiency.
635  	       *
636  	       *  See
637  	       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt07ch17.html
638  	       *  for more on @a hinting.
639  	       *
640  	       *  Insertion requires logarithmic time (if the hint is not taken).
641  	       */
642  	      iterator
643  	#if __cplusplus >= 201103L
644  	      insert(const_iterator __position, const value_type& __x)
645  	#else
646  	      insert(iterator __position, const value_type& __x)
647  	#endif
648  	      { return _M_t._M_insert_unique_(__position, __x); }
649  	
650  	#if __cplusplus >= 201103L
651  	      template<typename _Pair, typename = typename
652  		       std::enable_if<std::is_constructible<value_type,
653  							    _Pair&&>::value>::type>
654  	        iterator
655  	        insert(const_iterator __position, _Pair&& __x)
656  	        { return _M_t._M_insert_unique_(__position,
657  						std::forward<_Pair>(__x)); }
658  	#endif
659  	
660  	      /**
661  	       *  @brief Template function that attempts to insert a range of elements.
662  	       *  @param  __first  Iterator pointing to the start of the range to be
663  	       *                   inserted.
664  	       *  @param  __last  Iterator pointing to the end of the range.
665  	       *
666  	       *  Complexity similar to that of the range constructor.
667  	       */
668  	      template<typename _InputIterator>
669  	        void
670  	        insert(_InputIterator __first, _InputIterator __last)
671  	        { _M_t._M_insert_unique(__first, __last); }
672  	
673  	#if __cplusplus >= 201103L
674  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
675  	      // DR 130. Associative erase should return an iterator.
676  	      /**
677  	       *  @brief Erases an element from a %map.
678  	       *  @param  __position  An iterator pointing to the element to be erased.
679  	       *  @return An iterator pointing to the element immediately following
680  	       *          @a position prior to the element being erased. If no such 
681  	       *          element exists, end() is returned.
682  	       *
683  	       *  This function erases an element, pointed to by the given
684  	       *  iterator, from a %map.  Note that this function only erases
685  	       *  the element, and that if the element is itself a pointer,
686  	       *  the pointed-to memory is not touched in any way.  Managing
687  	       *  the pointer is the user's responsibility.
688  	       */
689  	      iterator
690  	      erase(const_iterator __position)
691  	      { return _M_t.erase(__position); }
692  	
693  	      // LWG 2059
694  	      _GLIBCXX_ABI_TAG_CXX11
695  	      iterator
696  	      erase(iterator __position)
697  	      { return _M_t.erase(__position); }
698  	#else
699  	      /**
700  	       *  @brief Erases an element from a %map.
701  	       *  @param  __position  An iterator pointing to the element to be erased.
702  	       *
703  	       *  This function erases an element, pointed to by the given
704  	       *  iterator, from a %map.  Note that this function only erases
705  	       *  the element, and that if the element is itself a pointer,
706  	       *  the pointed-to memory is not touched in any way.  Managing
707  	       *  the pointer is the user's responsibility.
708  	       */
709  	      void
710  	      erase(iterator __position)
711  	      { _M_t.erase(__position); }
712  	#endif
713  	
714  	      /**
715  	       *  @brief Erases elements according to the provided key.
716  	       *  @param  __x  Key of element to be erased.
717  	       *  @return  The number of elements erased.
718  	       *
719  	       *  This function erases all the elements located by the given key from
720  	       *  a %map.
721  	       *  Note that this function only erases the element, and that if
722  	       *  the element is itself a pointer, the pointed-to memory is not touched
723  	       *  in any way.  Managing the pointer is the user's responsibility.
724  	       */
725  	      size_type
726  	      erase(const key_type& __x)
727  	      { return _M_t.erase(__x); }
728  	
729  	#if __cplusplus >= 201103L
730  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
731  	      // DR 130. Associative erase should return an iterator.
732  	      /**
733  	       *  @brief Erases a [first,last) range of elements from a %map.
734  	       *  @param  __first  Iterator pointing to the start of the range to be
735  	       *                   erased.
736  	       *  @param __last Iterator pointing to the end of the range to
737  	       *                be erased.
738  	       *  @return The iterator @a __last.
739  	       *
740  	       *  This function erases a sequence of elements from a %map.
741  	       *  Note that this function only erases the element, and that if
742  	       *  the element is itself a pointer, the pointed-to memory is not touched
743  	       *  in any way.  Managing the pointer is the user's responsibility.
744  	       */
745  	      iterator
746  	      erase(const_iterator __first, const_iterator __last)
747  	      { return _M_t.erase(__first, __last); }
748  	#else
749  	      /**
750  	       *  @brief Erases a [__first,__last) range of elements from a %map.
751  	       *  @param  __first  Iterator pointing to the start of the range to be
752  	       *                   erased.
753  	       *  @param __last Iterator pointing to the end of the range to
754  	       *                be erased.
755  	       *
756  	       *  This function erases a sequence of elements from a %map.
757  	       *  Note that this function only erases the element, and that if
758  	       *  the element is itself a pointer, the pointed-to memory is not touched
759  	       *  in any way.  Managing the pointer is the user's responsibility.
760  	       */
761  	      void
762  	      erase(iterator __first, iterator __last)
763  	      { _M_t.erase(__first, __last); }
764  	#endif
765  	
766  	      /**
767  	       *  @brief  Swaps data with another %map.
768  	       *  @param  __x  A %map of the same element and allocator types.
769  	       *
770  	       *  This exchanges the elements between two maps in constant
771  	       *  time.  (It is only swapping a pointer, an integer, and an
772  	       *  instance of the @c Compare type (which itself is often
773  	       *  stateless and empty), so it should be quite fast.)  Note
774  	       *  that the global std::swap() function is specialized such
775  	       *  that std::swap(m1,m2) will feed to this function.
776  	       */
777  	      void
778  	      swap(map& __x)
779  	      { _M_t.swap(__x._M_t); }
780  	
781  	      /**
782  	       *  Erases all elements in a %map.  Note that this function only
783  	       *  erases the elements, and that if the elements themselves are
784  	       *  pointers, the pointed-to memory is not touched in any way.
785  	       *  Managing the pointer is the user's responsibility.
786  	       */
787  	      void
788  	      clear() _GLIBCXX_NOEXCEPT
789  	      { _M_t.clear(); }
790  	
791  	      // observers
792  	      /**
793  	       *  Returns the key comparison object out of which the %map was
794  	       *  constructed.
795  	       */
796  	      key_compare
797  	      key_comp() const
798  	      { return _M_t.key_comp(); }
799  	
800  	      /**
801  	       *  Returns a value comparison object, built from the key comparison
802  	       *  object out of which the %map was constructed.
803  	       */
804  	      value_compare
805  	      value_comp() const
806  	      { return value_compare(_M_t.key_comp()); }
807  	
808  	      // [23.3.1.3] map operations
809  	      /**
810  	       *  @brief Tries to locate an element in a %map.
811  	       *  @param  __x  Key of (key, value) %pair to be located.
812  	       *  @return  Iterator pointing to sought-after element, or end() if not
813  	       *           found.
814  	       *
815  	       *  This function takes a key and tries to locate the element with which
816  	       *  the key matches.  If successful the function returns an iterator
817  	       *  pointing to the sought after %pair.  If unsuccessful it returns the
818  	       *  past-the-end ( @c end() ) iterator.
819  	       */
820  	      iterator
821  	      find(const key_type& __x)
822  	      { return _M_t.find(__x); }
823  	
824  	      /**
825  	       *  @brief Tries to locate an element in a %map.
826  	       *  @param  __x  Key of (key, value) %pair to be located.
827  	       *  @return  Read-only (constant) iterator pointing to sought-after
828  	       *           element, or end() if not found.
829  	       *
830  	       *  This function takes a key and tries to locate the element with which
831  	       *  the key matches.  If successful the function returns a constant
832  	       *  iterator pointing to the sought after %pair. If unsuccessful it
833  	       *  returns the past-the-end ( @c end() ) iterator.
834  	       */
835  	      const_iterator
836  	      find(const key_type& __x) const
837  	      { return _M_t.find(__x); }
838  	
839  	      /**
840  	       *  @brief  Finds the number of elements with given key.
841  	       *  @param  __x  Key of (key, value) pairs to be located.
842  	       *  @return  Number of elements with specified key.
843  	       *
844  	       *  This function only makes sense for multimaps; for map the result will
845  	       *  either be 0 (not present) or 1 (present).
846  	       */
847  	      size_type
848  	      count(const key_type& __x) const
849  	      { return _M_t.find(__x) == _M_t.end() ? 0 : 1; }
850  	
851  	      /**
852  	       *  @brief Finds the beginning of a subsequence matching given key.
853  	       *  @param  __x  Key of (key, value) pair to be located.
854  	       *  @return  Iterator pointing to first element equal to or greater
855  	       *           than key, or end().
856  	       *
857  	       *  This function returns the first element of a subsequence of elements
858  	       *  that matches the given key.  If unsuccessful it returns an iterator
859  	       *  pointing to the first element that has a greater value than given key
860  	       *  or end() if no such element exists.
861  	       */
862  	      iterator
863  	      lower_bound(const key_type& __x)
864  	      { return _M_t.lower_bound(__x); }
865  	
866  	      /**
867  	       *  @brief Finds the beginning of a subsequence matching given key.
868  	       *  @param  __x  Key of (key, value) pair to be located.
869  	       *  @return  Read-only (constant) iterator pointing to first element
870  	       *           equal to or greater than key, or end().
871  	       *
872  	       *  This function returns the first element of a subsequence of elements
873  	       *  that matches the given key.  If unsuccessful it returns an iterator
874  	       *  pointing to the first element that has a greater value than given key
875  	       *  or end() if no such element exists.
876  	       */
877  	      const_iterator
878  	      lower_bound(const key_type& __x) const
879  	      { return _M_t.lower_bound(__x); }
880  	
881  	      /**
882  	       *  @brief Finds the end of a subsequence matching given key.
883  	       *  @param  __x  Key of (key, value) pair to be located.
884  	       *  @return Iterator pointing to the first element
885  	       *          greater than key, or end().
886  	       */
887  	      iterator
888  	      upper_bound(const key_type& __x)
889  	      { return _M_t.upper_bound(__x); }
890  	
891  	      /**
892  	       *  @brief Finds the end of a subsequence matching given key.
893  	       *  @param  __x  Key of (key, value) pair to be located.
894  	       *  @return  Read-only (constant) iterator pointing to first iterator
895  	       *           greater than key, or end().
896  	       */
897  	      const_iterator
898  	      upper_bound(const key_type& __x) const
899  	      { return _M_t.upper_bound(__x); }
900  	
901  	      /**
902  	       *  @brief Finds a subsequence matching given key.
903  	       *  @param  __x  Key of (key, value) pairs to be located.
904  	       *  @return  Pair of iterators that possibly points to the subsequence
905  	       *           matching given key.
906  	       *
907  	       *  This function is equivalent to
908  	       *  @code
909  	       *    std::make_pair(c.lower_bound(val),
910  	       *                   c.upper_bound(val))
911  	       *  @endcode
912  	       *  (but is faster than making the calls separately).
913  	       *
914  	       *  This function probably only makes sense for multimaps.
915  	       */
916  	      std::pair<iterator, iterator>
917  	      equal_range(const key_type& __x)
918  	      { return _M_t.equal_range(__x); }
919  	
920  	      /**
921  	       *  @brief Finds a subsequence matching given key.
922  	       *  @param  __x  Key of (key, value) pairs to be located.
923  	       *  @return  Pair of read-only (constant) iterators that possibly points
924  	       *           to the subsequence matching given key.
925  	       *
926  	       *  This function is equivalent to
927  	       *  @code
928  	       *    std::make_pair(c.lower_bound(val),
929  	       *                   c.upper_bound(val))
930  	       *  @endcode
931  	       *  (but is faster than making the calls separately).
932  	       *
933  	       *  This function probably only makes sense for multimaps.
934  	       */
935  	      std::pair<const_iterator, const_iterator>
936  	      equal_range(const key_type& __x) const
937  	      { return _M_t.equal_range(__x); }
938  	
939  	      template<typename _K1, typename _T1, typename _C1, typename _A1>
940  	        friend bool
941  	        operator==(const map<_K1, _T1, _C1, _A1>&,
942  			   const map<_K1, _T1, _C1, _A1>&);
943  	
944  	      template<typename _K1, typename _T1, typename _C1, typename _A1>
945  	        friend bool
946  	        operator<(const map<_K1, _T1, _C1, _A1>&,
947  			  const map<_K1, _T1, _C1, _A1>&);
948  	    };
949  	
950  	  /**
951  	   *  @brief  Map equality comparison.
952  	   *  @param  __x  A %map.
953  	   *  @param  __y  A %map of the same type as @a x.
954  	   *  @return  True iff the size and elements of the maps are equal.
955  	   *
956  	   *  This is an equivalence relation.  It is linear in the size of the
957  	   *  maps.  Maps are considered equivalent if their sizes are equal,
958  	   *  and if corresponding elements compare equal.
959  	  */
960  	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
961  	    inline bool
962  	    operator==(const map<_Key, _Tp, _Compare, _Alloc>& __x,
963  	               const map<_Key, _Tp, _Compare, _Alloc>& __y)
964  	    { return __x._M_t == __y._M_t; }
965  	
966  	  /**
967  	   *  @brief  Map ordering relation.
968  	   *  @param  __x  A %map.
969  	   *  @param  __y  A %map of the same type as @a x.
970  	   *  @return  True iff @a x is lexicographically less than @a y.
971  	   *
972  	   *  This is a total ordering relation.  It is linear in the size of the
973  	   *  maps.  The elements must be comparable with @c <.
974  	   *
975  	   *  See std::lexicographical_compare() for how the determination is made.
976  	  */
977  	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
978  	    inline bool
979  	    operator<(const map<_Key, _Tp, _Compare, _Alloc>& __x,
980  	              const map<_Key, _Tp, _Compare, _Alloc>& __y)
981  	    { return __x._M_t < __y._M_t; }
982  	
983  	  /// Based on operator==
984  	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
985  	    inline bool
986  	    operator!=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
987  	               const map<_Key, _Tp, _Compare, _Alloc>& __y)
988  	    { return !(__x == __y); }
989  	
990  	  /// Based on operator<
991  	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
992  	    inline bool
993  	    operator>(const map<_Key, _Tp, _Compare, _Alloc>& __x,
994  	              const map<_Key, _Tp, _Compare, _Alloc>& __y)
995  	    { return __y < __x; }
996  	
997  	  /// Based on operator<
998  	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
999  	    inline bool
1000 	    operator<=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
1001 	               const map<_Key, _Tp, _Compare, _Alloc>& __y)
1002 	    { return !(__y < __x); }
1003 	
1004 	  /// Based on operator<
1005 	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
1006 	    inline bool
1007 	    operator>=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
1008 	               const map<_Key, _Tp, _Compare, _Alloc>& __y)
1009 	    { return !(__x < __y); }
1010 	
1011 	  /// See std::map::swap().
1012 	  template<typename _Key, typename _Tp, typename _Compare, typename _Alloc>
1013 	    inline void
1014 	    swap(map<_Key, _Tp, _Compare, _Alloc>& __x,
1015 		 map<_Key, _Tp, _Compare, _Alloc>& __y)
1016 	    { __x.swap(__y); }
1017 	
1018 	_GLIBCXX_END_NAMESPACE_CONTAINER
1019 	} // namespace std
1020 	
1021 	#endif /* _STL_MAP_H */
1022