// Profiling multimap implementation -*- C++ -*-
-// Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2009-2014 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
#include <utility>
-namespace std
+namespace std _GLIBCXX_VISIBILITY(default)
{
namespace __profile
{
template<typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
typename _Allocator = std::allocator<std::pair<const _Key, _Tp> > >
class multimap
- : public _GLIBCXX_STD_D::multimap<_Key, _Tp, _Compare, _Allocator>
+ : public _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Allocator>
{
- typedef _GLIBCXX_STD_D::multimap<_Key, _Tp, _Compare, _Allocator> _Base;
+ typedef _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Allocator> _Base;
public:
// types:
typedef typename _Base::pointer pointer;
typedef typename _Base::const_pointer const_pointer;
- using _Base::value_compare;
-
// 23.3.1.1 construct/copy/destroy:
explicit multimap(const _Compare& __comp = _Compare(),
const _Allocator& __a = _Allocator())
: _Base(__comp, __a) { }
+#if __cplusplus >= 201103L
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<typename _InputIterator>
+#endif
multimap(_InputIterator __first, _InputIterator __last,
const _Compare& __comp = _Compare(),
const _Allocator& __a = _Allocator())
multimap(const _Base& __x)
: _Base(__x) { }
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
multimap(multimap&& __x)
+ noexcept(is_nothrow_copy_constructible<_Compare>::value)
: _Base(std::move(__x))
{ }
: _Base(__l, __c, __a) { }
#endif
- ~multimap() { }
+ ~multimap() _GLIBCXX_NOEXCEPT { }
multimap&
operator=(const multimap& __x)
return *this;
}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
multimap&
operator=(multimap&& __x)
{
// iterators:
iterator
- begin()
+ begin() _GLIBCXX_NOEXCEPT
{ return iterator(_Base::begin()); }
const_iterator
- begin() const
+ begin() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_Base::begin()); }
iterator
- end()
+ end() _GLIBCXX_NOEXCEPT
{ return iterator(_Base::end()); }
const_iterator
- end() const
+ end() const _GLIBCXX_NOEXCEPT
{ return const_iterator(_Base::end()); }
reverse_iterator
- rbegin()
+ rbegin() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(end()); }
const_reverse_iterator
- rbegin() const
+ rbegin() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(end()); }
reverse_iterator
- rend()
+ rend() _GLIBCXX_NOEXCEPT
{ return reverse_iterator(begin()); }
const_reverse_iterator
- rend() const
+ rend() const _GLIBCXX_NOEXCEPT
{ return const_reverse_iterator(begin()); }
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
const_iterator
- cbegin() const
+ cbegin() const noexcept
{ return const_iterator(_Base::begin()); }
const_iterator
- cend() const
+ cend() const noexcept
{ return const_iterator(_Base::end()); }
const_reverse_iterator
- crbegin() const
+ crbegin() const noexcept
{ return const_reverse_iterator(end()); }
const_reverse_iterator
- crend() const
+ crend() const noexcept
{ return const_reverse_iterator(begin()); }
#endif
using _Base::max_size;
// modifiers:
+#if __cplusplus >= 201103L
+ template<typename... _Args>
+ iterator
+ emplace(_Args&&... __args)
+ {
+ return iterator(_Base::emplace(std::forward<_Args>(__args)...));
+ }
+
+ template<typename... _Args>
+ iterator
+ emplace_hint(const_iterator __pos, _Args&&... __args)
+ {
+ return iterator(_Base::emplace_hint(__pos,
+ std::forward<_Args>(__args)...));
+ }
+#endif
+
iterator
insert(const value_type& __x)
{ return iterator(_Base::insert(__x)); }
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
+ template<typename _Pair, typename = typename
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
+ iterator
+ insert(_Pair&& __x)
+ { return iterator(_Base::insert(std::forward<_Pair>(__x))); }
+#endif
+
+#if __cplusplus >= 201103L
void
insert(std::initializer_list<value_type> __list)
{ _Base::insert(__list); }
#endif
iterator
+#if __cplusplus >= 201103L
+ insert(const_iterator __position, const value_type& __x)
+#else
insert(iterator __position, const value_type& __x)
- {
- return iterator(_Base::insert(__position, __x));
- }
+#endif
+ { return iterator(_Base::insert(__position, __x)); }
+
+#if __cplusplus >= 201103L
+ template<typename _Pair, typename = typename
+ std::enable_if<std::is_constructible<value_type,
+ _Pair&&>::value>::type>
+ iterator
+ insert(const_iterator __position, _Pair&& __x)
+ { return iterator(_Base::insert(__position,
+ std::forward<_Pair>(__x))); }
+#endif
+#if __cplusplus >= 201103L
+ template<typename _InputIterator,
+ typename = std::_RequireInputIter<_InputIterator>>
+#else
template<typename _InputIterator>
+#endif
void
insert(_InputIterator __first, _InputIterator __last)
- {
- _Base::insert(__first, __last);
- }
+ { _Base::insert(__first, __last); }
+
+#if __cplusplus >= 201103L
+ iterator
+ erase(const_iterator __position)
+ { return iterator(_Base::erase(__position)); }
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
iterator
erase(iterator __position)
- { return _Base::erase(__position); }
+ { return iterator(_Base::erase(__position)); }
#else
void
erase(iterator __position)
return __count;
}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
iterator
- erase(iterator __first, iterator __last)
- {
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 151. can't currently clear() empty container
- while (__first != __last)
- this->erase(__first++);
- return __last;
- }
+ erase(const_iterator __first, const_iterator __last)
+ { return iterator(_Base::erase(__first, __last)); }
#else
void
erase(iterator __first, iterator __last)
- {
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 151. can't currently clear() empty container
- while (__first != __last)
- this->erase(__first++);
- }
+ { _Base::erase(__first, __last); }
#endif
void
swap(multimap& __x)
- {
- _Base::swap(__x);
- }
+ { _Base::swap(__x); }
void
- clear()
+ clear() _GLIBCXX_NOEXCEPT
{ this->erase(begin(), end()); }
// observers:
}
_Base&
- _M_base() { return *this; }
+ _M_base() _GLIBCXX_NOEXCEPT { return *this; }
const _Base&
- _M_base() const { return *this; }
+ _M_base() const _GLIBCXX_NOEXCEPT { return *this; }
};
template<typename _Key, typename _Tp,