Commit 06eed9f5 by Paolo Carlini Committed by Paolo Carlini

stl_deque.h (deque<>::insert(iterator, size_type, const value_type&), [...]):…

stl_deque.h (deque<>::insert(iterator, size_type, const value_type&), [...]): Adjust C++11 signatures to take a const_iterator.

2013-06-30  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/stl_deque.h (deque<>::insert(iterator,
	size_type, const value_type&), deque<>::insert(iterator,
	initializer_list<>), deque<>::insert(iterator, _InputIterator,
	_InputIterator)): Adjust C++11 signatures to take a const_iterator.
	* include/bits/stl_vector.h: Likewise.
	* include/bits/stl_bvector.h: Likewise.
	* include/debug/deque: Adjust.
	* include/debug/vector: Likewise.
	* include/profile/deque: Likewise.
	* include/profile/vector: Likewise.
	* testsuite/23_containers/deque/modifiers/insert/const_iterator.cc:
	Extend.
	* testsuite/23_containers/vector/bool/modifiers/insert/
	const_iterator.cc: Likewise.
	* testsuite/23_containers/vector/modifiers/insert/const_iterator.cc:
	Likewise.

	* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc:
	Adjust dg-error line number.
	* testsuite/23_containers/deque/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc:
	Likewise.
	* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
	Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
	Likewise.

From-SVN: r200571
parent e8f24c86
2013-06-30 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/stl_deque.h (deque<>::insert(iterator,
size_type, const value_type&), deque<>::insert(iterator,
initializer_list<>), deque<>::insert(iterator, _InputIterator,
_InputIterator)): Adjust C++11 signatures to take a const_iterator.
* include/bits/stl_vector.h: Likewise.
* include/bits/stl_bvector.h: Likewise.
* include/debug/deque: Adjust.
* include/debug/vector: Likewise.
* include/profile/deque: Likewise.
* include/profile/vector: Likewise.
* testsuite/23_containers/deque/modifiers/insert/const_iterator.cc:
Extend.
* testsuite/23_containers/vector/bool/modifiers/insert/
const_iterator.cc: Likewise.
* testsuite/23_containers/vector/modifiers/insert/const_iterator.cc:
Likewise.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc:
Adjust dg-error line number.
* testsuite/23_containers/deque/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc:
Likewise.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc:
Likewise.
* testsuite/23_containers/vector/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc:
Likewise.
2013-06-27 Paolo Carlini <paolo.carlini@oracle.com> 2013-06-27 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/21_strings/basic_string/operations/*: Move inside * testsuite/21_strings/basic_string/operations/*: Move inside
......
...@@ -881,10 +881,15 @@ template<typename _Alloc> ...@@ -881,10 +881,15 @@ template<typename _Alloc>
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename _InputIterator, template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
void iterator
insert(iterator __position, insert(const_iterator __position,
_InputIterator __first, _InputIterator __last) _InputIterator __first, _InputIterator __last)
{ _M_insert_dispatch(__position, __first, __last, __false_type()); } {
difference_type __offset = __position - cbegin();
_M_insert_dispatch(__position._M_const_cast(),
__first, __last, __false_type());
return begin() + __offset;
}
#else #else
template<typename _InputIterator> template<typename _InputIterator>
void void
...@@ -896,13 +901,24 @@ template<typename _Alloc> ...@@ -896,13 +901,24 @@ template<typename _Alloc>
} }
#endif #endif
#if __cplusplus >= 201103L
iterator
insert(const_iterator __position, size_type __n, const bool& __x)
{
difference_type __offset = __position - cbegin();
_M_fill_insert(__position._M_const_cast(), __n, __x);
return begin() + __offset;
}
#else
void void
insert(iterator __position, size_type __n, const bool& __x) insert(iterator __position, size_type __n, const bool& __x)
{ _M_fill_insert(__position, __n, __x); } { _M_fill_insert(__position, __n, __x); }
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
void insert(iterator __p, initializer_list<bool> __l) iterator
{ this->insert(__p, __l.begin(), __l.end()); } insert(const_iterator __p, initializer_list<bool> __l)
{ return this->insert(__p, __l.begin(), __l.end()); }
#endif #endif
void void
......
...@@ -1517,11 +1517,30 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1517,11 +1517,30 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* initializer_list @a __l into the %deque before the location * initializer_list @a __l into the %deque before the location
* specified by @a __p. This is known as <em>list insert</em>. * specified by @a __p. This is known as <em>list insert</em>.
*/ */
void iterator
insert(iterator __p, initializer_list<value_type> __l) insert(const_iterator __p, initializer_list<value_type> __l)
{ this->insert(__p, __l.begin(), __l.end()); } { return this->insert(__p, __l.begin(), __l.end()); }
#endif #endif
#if __cplusplus >= 201103L
/**
* @brief Inserts a number of copies of given data into the %deque.
* @param __position A const_iterator into the %deque.
* @param __n Number of elements to be inserted.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a specified number of copies of the given
* data before the location specified by @a __position.
*/
iterator
insert(const_iterator __position, size_type __n, const value_type& __x)
{
difference_type __offset = __position - cbegin();
_M_fill_insert(__position._M_const_cast(), __n, __x);
return begin() + __offset;
}
#else
/** /**
* @brief Inserts a number of copies of given data into the %deque. * @brief Inserts a number of copies of given data into the %deque.
* @param __position An iterator into the %deque. * @param __position An iterator into the %deque.
...@@ -1534,25 +1553,42 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1534,25 +1553,42 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
void void
insert(iterator __position, size_type __n, const value_type& __x) insert(iterator __position, size_type __n, const value_type& __x)
{ _M_fill_insert(__position, __n, __x); } { _M_fill_insert(__position, __n, __x); }
#endif
#if __cplusplus >= 201103L
/** /**
* @brief Inserts a range into the %deque. * @brief Inserts a range into the %deque.
* @param __position An iterator into the %deque. * @param __position A const_iterator into the %deque.
* @param __first An input iterator. * @param __first An input iterator.
* @param __last An input iterator. * @param __last An input iterator.
* @return An iterator that points to the inserted data.
* *
* This function will insert copies of the data in the range * This function will insert copies of the data in the range
* [__first,__last) into the %deque before the location specified * [__first,__last) into the %deque before the location specified
* by @a __position. This is known as <em>range insert</em>. * by @a __position. This is known as <em>range insert</em>.
*/ */
#if __cplusplus >= 201103L
template<typename _InputIterator, template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
void iterator
insert(iterator __position, _InputIterator __first, insert(const_iterator __position, _InputIterator __first,
_InputIterator __last) _InputIterator __last)
{ _M_insert_dispatch(__position, __first, __last, __false_type()); } {
difference_type __offset = __position - cbegin();
_M_insert_dispatch(__position._M_const_cast(),
__first, __last, __false_type());
return begin() + __offset;
}
#else #else
/**
* @brief Inserts a range into the %deque.
* @param __position An iterator into the %deque.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function will insert copies of the data in the range
* [__first,__last) into the %deque before the location specified
* by @a __position. This is known as <em>range insert</em>.
*/
template<typename _InputIterator> template<typename _InputIterator>
void void
insert(iterator __position, _InputIterator __first, insert(iterator __position, _InputIterator __first,
......
...@@ -1015,11 +1015,34 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1015,11 +1015,34 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* %vector and if it is frequently used the user should * %vector and if it is frequently used the user should
* consider using std::list. * consider using std::list.
*/ */
void iterator
insert(iterator __position, initializer_list<value_type> __l) insert(const_iterator __position, initializer_list<value_type> __l)
{ this->insert(__position, __l.begin(), __l.end()); } { return this->insert(__position, __l.begin(), __l.end()); }
#endif #endif
#if __cplusplus >= 201103L
/**
* @brief Inserts a number of copies of given data into the %vector.
* @param __position A const_iterator into the %vector.
* @param __n Number of elements to be inserted.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a specified number of copies of
* the given data before the location specified by @a position.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
iterator
insert(const_iterator __position, size_type __n, const value_type& __x)
{
difference_type __offset = __position - cbegin();
_M_fill_insert(__position._M_const_cast(), __n, __x);
return begin() + __offset;
}
#else
/** /**
* @brief Inserts a number of copies of given data into the %vector. * @brief Inserts a number of copies of given data into the %vector.
* @param __position An iterator into the %vector. * @param __position An iterator into the %vector.
...@@ -1036,12 +1059,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1036,12 +1059,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
void void
insert(iterator __position, size_type __n, const value_type& __x) insert(iterator __position, size_type __n, const value_type& __x)
{ _M_fill_insert(__position, __n, __x); } { _M_fill_insert(__position, __n, __x); }
#endif
#if __cplusplus >= 201103L
/** /**
* @brief Inserts a range into the %vector. * @brief Inserts a range into the %vector.
* @param __position An iterator into the %vector. * @param __position A const_iterator into the %vector.
* @param __first An input iterator. * @param __first An input iterator.
* @param __last An input iterator. * @param __last An input iterator.
* @return An iterator that points to the inserted data.
* *
* This function will insert copies of the data in the range * This function will insert copies of the data in the range
* [__first,__last) into the %vector before the location specified * [__first,__last) into the %vector before the location specified
...@@ -1051,14 +1077,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1051,14 +1077,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* %vector and if it is frequently used the user should * %vector and if it is frequently used the user should
* consider using std::list. * consider using std::list.
*/ */
#if __cplusplus >= 201103L
template<typename _InputIterator, template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
void iterator
insert(iterator __position, _InputIterator __first, insert(const_iterator __position, _InputIterator __first,
_InputIterator __last) _InputIterator __last)
{ _M_insert_dispatch(__position, __first, __last, __false_type()); } {
difference_type __offset = __position - cbegin();
_M_insert_dispatch(__position._M_const_cast(),
__first, __last, __false_type());
return begin() + __offset;
}
#else #else
/**
* @brief Inserts a range into the %vector.
* @param __position An iterator into the %vector.
* @param __first An input iterator.
* @param __last An input iterator.
*
* This function will insert copies of the data in the range
* [__first,__last) into the %vector before the location specified
* by @a pos.
*
* Note that this kind of operation could be expensive for a
* %vector and if it is frequently used the user should
* consider using std::list.
*/
template<typename _InputIterator> template<typename _InputIterator>
void void
insert(iterator __position, _InputIterator __first, insert(iterator __position, _InputIterator __first,
......
...@@ -411,14 +411,26 @@ namespace __debug ...@@ -411,14 +411,26 @@ namespace __debug
insert(const_iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void iterator
insert(iterator __p, initializer_list<value_type> __l) insert(const_iterator __position, initializer_list<value_type> __l)
{ {
_Base::insert(__p, __l); __glibcxx_check_insert(__position);
_Base_iterator __res = _Base::insert(__position.base(), __l);
this->_M_invalidate_all(); this->_M_invalidate_all();
return iterator(__res, this);
} }
#endif #endif
#if __cplusplus >= 201103L
iterator
insert(const_iterator __position, size_type __n, const _Tp& __x)
{
__glibcxx_check_insert(__position);
_Base_iterator __res = _Base::insert(__position.base(), __n, __x);
this->_M_invalidate_all();
return iterator(__res, this);
}
#else
void void
insert(iterator __position, size_type __n, const _Tp& __x) insert(iterator __position, size_type __n, const _Tp& __x)
{ {
...@@ -426,13 +438,24 @@ namespace __debug ...@@ -426,13 +438,24 @@ namespace __debug
_Base::insert(__position.base(), __n, __x); _Base::insert(__position.base(), __n, __x);
this->_M_invalidate_all(); this->_M_invalidate_all();
} }
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<class _InputIterator, template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __position,
_InputIterator __first, _InputIterator __last)
{
__glibcxx_check_insert_range(__position, __first, __last);
_Base_iterator __res = _Base::insert(__position.base(),
__gnu_debug::__base(__first),
__gnu_debug::__base(__last));
this->_M_invalidate_all();
return iterator(__res, this);
}
#else #else
template<class _InputIterator> template<class _InputIterator>
#endif
void void
insert(iterator __position, insert(iterator __position,
_InputIterator __first, _InputIterator __last) _InputIterator __first, _InputIterator __last)
...@@ -442,6 +465,7 @@ namespace __debug ...@@ -442,6 +465,7 @@ namespace __debug
__gnu_debug::__base(__last)); __gnu_debug::__base(__last));
this->_M_invalidate_all(); this->_M_invalidate_all();
} }
#endif
void void
pop_front() pop_front()
......
...@@ -471,11 +471,27 @@ namespace __debug ...@@ -471,11 +471,27 @@ namespace __debug
insert(const_iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void iterator
insert(iterator __position, initializer_list<value_type> __l) insert(const_iterator __position, initializer_list<value_type> __l)
{ this->insert(__position, __l.begin(), __l.end()); } { return this->insert(__position, __l.begin(), __l.end()); }
#endif #endif
#if __cplusplus >= 201103L
iterator
insert(const_iterator __position, size_type __n, const _Tp& __x)
{
__glibcxx_check_insert(__position);
bool __realloc = _M_requires_reallocation(this->size() + __n);
difference_type __offset = __position.base() - _Base::cbegin();
_Base_iterator __res = _Base::insert(__position.base(), __n, __x);
if (__realloc)
this->_M_invalidate_all();
else
this->_M_invalidate_after_nth(__offset);
_M_update_guaranteed_capacity();
return iterator(__res, this);
}
#else
void void
insert(iterator __position, size_type __n, const _Tp& __x) insert(iterator __position, size_type __n, const _Tp& __x)
{ {
...@@ -489,13 +505,35 @@ namespace __debug ...@@ -489,13 +505,35 @@ namespace __debug
this->_M_invalidate_after_nth(__offset); this->_M_invalidate_after_nth(__offset);
_M_update_guaranteed_capacity(); _M_update_guaranteed_capacity();
} }
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<class _InputIterator, template<class _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __position,
_InputIterator __first, _InputIterator __last)
{
__glibcxx_check_insert_range(__position, __first, __last);
/* Hard to guess if invalidation will occur, because __last
- __first can't be calculated in all cases, so we just
punt here by checking if it did occur. */
_Base_iterator __old_begin = _M_base().begin();
difference_type __offset = __position.base() - _Base::cbegin();
_Base_iterator __res = _Base::insert(__position.base(),
__gnu_debug::__base(__first),
__gnu_debug::__base(__last));
if (_M_base().begin() != __old_begin)
this->_M_invalidate_all();
else
this->_M_invalidate_after_nth(__offset);
_M_update_guaranteed_capacity();
return iterator(__res, this);
}
#else #else
template<class _InputIterator> template<class _InputIterator>
#endif
void void
insert(iterator __position, insert(iterator __position,
_InputIterator __first, _InputIterator __last) _InputIterator __first, _InputIterator __last)
...@@ -516,6 +554,7 @@ namespace __debug ...@@ -516,6 +554,7 @@ namespace __debug
this->_M_invalidate_after_nth(__offset); this->_M_invalidate_after_nth(__offset);
_M_update_guaranteed_capacity(); _M_update_guaranteed_capacity();
} }
#endif
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
......
...@@ -344,31 +344,35 @@ namespace __profile ...@@ -344,31 +344,35 @@ namespace __profile
insert(const_iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void iterator
insert(iterator __p, initializer_list<value_type> __l) insert(const_iterator __p, initializer_list<value_type> __l)
{ { return _Base::insert(__p, __l); }
_Base::insert(__p, __l);
}
#endif #endif
#if __cplusplus >= 201103L
iterator
insert(const_iterator __position, size_type __n, const _Tp& __x)
{ return _Base::insert(__position, __n, __x); }
#else
void void
insert(iterator __position, size_type __n, const _Tp& __x) insert(iterator __position, size_type __n, const _Tp& __x)
{ { _Base::insert(__position, __n, __x); }
_Base::insert(__position, __n, __x); #endif
}
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename _InputIterator, template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __position,
_InputIterator __first, _InputIterator __last)
{ return _Base::insert(__position, __first, __last); }
#else #else
template<typename _InputIterator> template<typename _InputIterator>
#endif
void void
insert(iterator __position, insert(iterator __position,
_InputIterator __first, _InputIterator __last) _InputIterator __first, _InputIterator __last)
{ { _Base::insert(__position, __first, __last); }
_Base::insert(__position, __first, __last); #endif
}
void void
pop_front() pop_front()
......
...@@ -44,6 +44,9 @@ namespace __profile ...@@ -44,6 +44,9 @@ namespace __profile
{ {
typedef _GLIBCXX_STD_C::vector<_Tp, _Allocator> _Base; typedef _GLIBCXX_STD_C::vector<_Tp, _Allocator> _Base;
typedef typename _Base::iterator _Base_iterator;
typedef typename _Base::const_iterator _Base_const_iterator;
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits; typedef __gnu_cxx::__alloc_traits<_Allocator> _Alloc_traits;
#endif #endif
...@@ -52,9 +55,9 @@ namespace __profile ...@@ -52,9 +55,9 @@ namespace __profile
typedef typename _Base::reference reference; typedef typename _Base::reference reference;
typedef typename _Base::const_reference const_reference; typedef typename _Base::const_reference const_reference;
typedef __iterator_tracker<typename _Base::iterator, vector> typedef __iterator_tracker<_Base_iterator, vector>
iterator; iterator;
typedef __iterator_tracker<typename _Base::const_iterator, vector> typedef __iterator_tracker<_Base_const_iterator, vector>
const_iterator; const_iterator;
typedef typename _Base::size_type size_type; typedef typename _Base::size_type size_type;
...@@ -361,7 +364,7 @@ namespace __profile ...@@ -361,7 +364,7 @@ namespace __profile
__profcxx_vector_insert(this, __position.base() - _Base::begin(), __profcxx_vector_insert(this, __position.base() - _Base::begin(),
this->size()); this->size());
size_type __old_size = this->capacity(); size_type __old_size = this->capacity();
typename _Base::iterator __res = _Base::insert(__position.base(), __x); _Base_iterator __res = _Base::insert(__position.base(), __x);
_M_profile_resize(this, __old_size, this->capacity()); _M_profile_resize(this, __old_size, this->capacity());
return iterator(__res, this); return iterator(__res, this);
} }
...@@ -370,10 +373,10 @@ namespace __profile ...@@ -370,10 +373,10 @@ namespace __profile
iterator iterator
insert(const_iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ {
__profcxx_vector_insert(this, __position.base() - _Base::begin(), __profcxx_vector_insert(this, __position.base() - _Base::cbegin(),
this->size()); this->size());
size_type __old_size = this->capacity(); size_type __old_size = this->capacity();
typename _Base::iterator __res = _Base::insert(__position.base(), __x); _Base_iterator __res = _Base::insert(__position.base(), __x);
_M_profile_resize(this, __old_size, this->capacity()); _M_profile_resize(this, __old_size, this->capacity());
return iterator(__res, this); return iterator(__res, this);
} }
...@@ -382,15 +385,14 @@ namespace __profile ...@@ -382,15 +385,14 @@ namespace __profile
iterator iterator
emplace(const_iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
typename _Base::iterator __res _Base_iterator __res = _Base::emplace(__position.base(),
= _Base::emplace(__position.base(), std::forward<_Args>(__args)...);
std::forward<_Args>(__args)...);
return iterator(__res, this); return iterator(__res, this);
} }
void iterator
insert(iterator __position, initializer_list<value_type> __l) insert(const_iterator __position, initializer_list<value_type> __l)
{ this->insert(__position, __l.begin(), __l.end()); } { return this->insert(__position, __l.begin(), __l.end()); }
#endif #endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
...@@ -404,12 +406,24 @@ namespace __profile ...@@ -404,12 +406,24 @@ namespace __profile
void void
swap(vector& __x) swap(vector& __x)
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
noexcept(_Alloc_traits::_S_nothrow_swap()) noexcept(_Alloc_traits::_S_nothrow_swap())
#endif #endif
{ {
_Base::swap(__x); _Base::swap(__x);
} }
#if __cplusplus >= 201103L
iterator
insert(const_iterator __position, size_type __n, const _Tp& __x)
{
__profcxx_vector_insert(this, __position.base() - _Base::cbegin(),
this->size());
size_type __old_size = this->capacity();
_Base_iterator __res = _Base::insert(__position, __n, __x);
_M_profile_resize(this, __old_size, this->capacity());
return iterator(__res, this);
}
#else
void void
insert(iterator __position, size_type __n, const _Tp& __x) insert(iterator __position, size_type __n, const _Tp& __x)
{ {
...@@ -419,23 +433,35 @@ namespace __profile ...@@ -419,23 +433,35 @@ namespace __profile
_Base::insert(__position, __n, __x); _Base::insert(__position, __n, __x);
_M_profile_resize(this, __old_size, this->capacity()); _M_profile_resize(this, __old_size, this->capacity());
} }
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename _InputIterator, template<typename _InputIterator,
typename = std::_RequireInputIter<_InputIterator>> typename = std::_RequireInputIter<_InputIterator>>
iterator
insert(const_iterator __position,
_InputIterator __first, _InputIterator __last)
{
__profcxx_vector_insert(this, __position.base() - _Base::cbegin(),
this->size());
size_type __old_size = this->capacity();
_Base_iterator __res = _Base::insert(__position, __first, __last);
_M_profile_resize(this, __old_size, this->capacity());
return iterator(__res, this);
}
#else #else
template<typename _InputIterator> template<typename _InputIterator>
void
insert(iterator __position,
_InputIterator __first, _InputIterator __last)
{
__profcxx_vector_insert(this, __position.base() - _Base::begin(),
this->size());
size_type __old_size = this->capacity();
_Base::insert(__position, __first, __last);
_M_profile_resize(this, __old_size, this->capacity());
}
#endif #endif
void
insert(iterator __position,
_InputIterator __first, _InputIterator __last)
{
__profcxx_vector_insert(this, __position.base()-_Base::begin(),
this->size());
size_type __old_size = this->capacity();
_Base::insert(__position, __first, __last);
_M_profile_resize(this, __old_size, this->capacity());
}
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
...@@ -444,7 +470,7 @@ namespace __profile ...@@ -444,7 +470,7 @@ namespace __profile
erase(iterator __position) erase(iterator __position)
#endif #endif
{ {
typename _Base::iterator __res = _Base::erase(__position.base()); _Base_iterator __res = _Base::erase(__position.base());
return iterator(__res, this); return iterator(__res, this);
} }
...@@ -457,8 +483,7 @@ namespace __profile ...@@ -457,8 +483,7 @@ namespace __profile
{ {
// _GLIBCXX_RESOLVE_LIB_DEFECTS // _GLIBCXX_RESOLVE_LIB_DEFECTS
// 151. can't currently clear() empty container // 151. can't currently clear() empty container
typename _Base::iterator __res = _Base::erase(__first.base(), _Base_iterator __res = _Base::erase(__first.base(), __last.base());
__last.base());
return iterator(__res, this); return iterator(__res, this);
} }
......
...@@ -24,6 +24,9 @@ void test01() ...@@ -24,6 +24,9 @@ void test01()
{ {
std::deque<int> d1; std::deque<int> d1;
int n = 0; int n = 0;
d1.insert(d1.cbegin(), n); std::deque<int>::iterator it = d1.insert(d1.cbegin(), n);
d1.insert(d1.cbegin(), 1); it = d1.insert(d1.cbegin(), 1);
it = d1.insert(d1.cbegin(), {2, 3});
it = d1.insert(d1.cbegin(), 1, 4);
it = d1.insert(d1.cbegin(), d1.begin(), d1.end());
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1724 } // { dg-error "no matching" "" { target *-*-* } 1760 }
#include <deque> #include <deque>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1657 } // { dg-error "no matching" "" { target *-*-* } 1693 }
#include <deque> #include <deque>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1657 } // { dg-error "no matching" "" { target *-*-* } 1693 }
#include <deque> #include <deque>
#include <utility> #include <utility>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1808 } // { dg-error "no matching" "" { target *-*-* } 1844 }
#include <deque> #include <deque>
......
...@@ -23,5 +23,8 @@ ...@@ -23,5 +23,8 @@
void test01() void test01()
{ {
std::vector<bool> vb1; std::vector<bool> vb1;
vb1.insert(vb1.cbegin(), true); std::vector<bool>::iterator it = vb1.insert(vb1.cbegin(), true);
it = vb1.insert(vb1.cbegin(), {false, true});
it = vb1.insert(vb1.cbegin(), 1, false);
it = vb1.insert(vb1.cbegin(), vb1.begin(), vb1.end());
} }
...@@ -24,6 +24,9 @@ void test01() ...@@ -24,6 +24,9 @@ void test01()
{ {
std::vector<int> v1; std::vector<int> v1;
int n = 0; int n = 0;
v1.insert(v1.cbegin(), n); std::vector<int>::iterator it = v1.insert(v1.cbegin(), n);
v1.insert(v1.cbegin(), 1); it = v1.insert(v1.cbegin(), 1);
it = v1.insert(v1.cbegin(), {2, 3});
it = v1.insert(v1.cbegin(), 1, 4);
it = v1.insert(v1.cbegin(), v1.begin(), v1.end());
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1264 } // { dg-error "no matching" "" { target *-*-* } 1308 }
#include <vector> #include <vector>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1190 } // { dg-error "no matching" "" { target *-*-* } 1234 }
#include <vector> #include <vector>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1190 } // { dg-error "no matching" "" { target *-*-* } 1234 }
#include <vector> #include <vector>
#include <utility> #include <utility>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>. // <http://www.gnu.org/licenses/>.
// { dg-do compile } // { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1305 } // { dg-error "no matching" "" { target *-*-* } 1349 }
#include <vector> #include <vector>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment