Commit 7b61c5a9 by Paolo Carlini Committed by Paolo Carlini

stl_deque.h (deque<>::insert(iterator, const value_type&), [...]): Adjust C++11…

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

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

	* include/bits/stl_deque.h (deque<>::insert(iterator,
	const value_type&), deque<>::insert(iterator, value_type&&),
	deque<>::emplace(iterator, _Args&&...)): Adjust C++11 signatures to
	take a const_iterator.
	(deque<>::erase): Simplify.
	* include/bits/stl_list.h: Likewise.
	(_List_iterator<>::_M_const_cast): Add.
	* include/bits/stl_vector.h: Likewise.
	* include/bits/stl_bvector.h: Likewise.
	(_Bit_iterator::_M_const_cast): Add.
	* include/bits/deque.tcc: Adjust definitions.
	* include/bits/list.tcc: Likewise.
	* include/bits/vector.tcc: Likewise.
	* include/bits/stl_iterator.h (__normal_iterator<>::_M_const_cast):
	Define trivial version in C++98 mode.
	* include/ext/vstring.h (__versa_string<>::insert(iterator, _CharT),
	__versa_string<>::replace(iterator, iterator, const __versa_string&),
	__versa_string<>::replace(iterator, iterator, const _CharT*,
	size_type), __versa_string<>::replace(iterator, iterator,
	const _CharT*), __versa_string<>::replace(iterator, iterator,
	size_type, _CharT)): Adjust C++11 signatures to take a pair of
	const_iterators.
	* include/debug/deque: Adjust.
	* include/debug/list: Likewise.
	* include/debug/vector: Likewise.
	* include/profile/deque: Likewise.
	* include/profile/list: Likewise.
	* include/profile/vector: Likewise.
	(vector<>::emplace): Add.
	* testsuite/util/exception/safety.h: Update.
	* testsuite/23_containers/deque/modifiers/emplace/const_iterator.cc:
	New.
	* testsuite/23_containers/deque/modifiers/insert/const_iterator.cc:
	Likewise.
	* testsuite/23_containers/list/modifiers/emplace/const_iterator.cc:
	Likewise.
	* testsuite/23_containers/list/modifiers/insert/const_iterator.cc:
	Likewise.
	* testsuite/23_containers/vector/bool/modifiers/insert/
	const_iterator.cc: Likewise.
	* testsuite/23_containers/vector/modifiers/emplace/const_iterator.cc:
	Likewise.
	* testsuite/23_containers/vector/modifiers/insert/const_iterator.cc:
	Likewise.
	* testsuite/ext/vstring/modifiers/insert/char/const_iterator.cc:
	Likewise.
	* testsuite/ext/vstring/modifiers/insert/wchar_t/const_iterator.cc:
	Likewise.
	* testsuite/ext/vstring/modifiers/replace/char/const_iterator.cc:
	Likewise.
	* testsuite/ext/vstring/modifiers/replace/wchar_t/const_iterator.cc:
	Likewise.

	* testsuite/ext/vstring/modifiers/char/54577.cc: Move to testsuite/
	ext/vstring/modifiers/erase/char/.
	* testsuite/ext/vstring/modifiers/wchar_t/54577.cc: Move to testsuite/
	ext/vstring/modifiers/wchar_t/.
	* testsuite/ext/vstring/modifiers/char/pop_back.cc: Move to testsuite/
	ext/vstring/modifiers/pop_back/char/.
	* testsuite/ext/vstring/modifiers/wchar_t/pop_back.cc: Move to
	testsuite/ext/vstring/modifiers/pop_back/wchar_t/.

	* 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/list/requirements/dr438/assign_neg.cc:
	Likewise.
	* testsuite/23_containers/list/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/list/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/list/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: r200458
parent 5a3fe9b6
2013-06-27 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/stl_deque.h (deque<>::insert(iterator,
const value_type&), deque<>::insert(iterator, value_type&&),
deque<>::emplace(iterator, _Args&&...)): Adjust C++11 signatures to
take a const_iterator.
(deque<>::erase): Simplify.
* include/bits/stl_list.h: Likewise.
(_List_iterator<>::_M_const_cast): Add.
* include/bits/stl_vector.h: Likewise.
* include/bits/stl_bvector.h: Likewise.
(_Bit_iterator::_M_const_cast): Add.
* include/bits/deque.tcc: Adjust definitions.
* include/bits/list.tcc: Likewise.
* include/bits/vector.tcc: Likewise.
* include/bits/stl_iterator.h (__normal_iterator<>::_M_const_cast):
Define trivial version in C++98 mode.
* include/ext/vstring.h (__versa_string<>::insert(iterator, _CharT),
__versa_string<>::replace(iterator, iterator, const __versa_string&),
__versa_string<>::replace(iterator, iterator, const _CharT*,
size_type), __versa_string<>::replace(iterator, iterator,
const _CharT*), __versa_string<>::replace(iterator, iterator,
size_type, _CharT)): Adjust C++11 signatures to take a pair of
const_iterators.
* include/debug/deque: Adjust.
* include/debug/list: Likewise.
* include/debug/vector: Likewise.
* include/profile/deque: Likewise.
* include/profile/list: Likewise.
* include/profile/vector: Likewise.
(vector<>::emplace): Add.
* testsuite/util/exception/safety.h: Update.
* testsuite/23_containers/deque/modifiers/emplace/const_iterator.cc:
New.
* testsuite/23_containers/deque/modifiers/insert/const_iterator.cc:
Likewise.
* testsuite/23_containers/list/modifiers/emplace/const_iterator.cc:
Likewise.
* testsuite/23_containers/list/modifiers/insert/const_iterator.cc:
Likewise.
* testsuite/23_containers/vector/bool/modifiers/insert/
const_iterator.cc: Likewise.
* testsuite/23_containers/vector/modifiers/emplace/const_iterator.cc:
Likewise.
* testsuite/23_containers/vector/modifiers/insert/const_iterator.cc:
Likewise.
* testsuite/ext/vstring/modifiers/insert/char/const_iterator.cc:
Likewise.
* testsuite/ext/vstring/modifiers/insert/wchar_t/const_iterator.cc:
Likewise.
* testsuite/ext/vstring/modifiers/replace/char/const_iterator.cc:
Likewise.
* testsuite/ext/vstring/modifiers/replace/wchar_t/const_iterator.cc:
Likewise.
* testsuite/ext/vstring/modifiers/char/54577.cc: Move to testsuite/
ext/vstring/modifiers/erase/char/.
* testsuite/ext/vstring/modifiers/wchar_t/54577.cc: Move to testsuite/
ext/vstring/modifiers/wchar_t/.
* testsuite/ext/vstring/modifiers/char/pop_back.cc: Move to testsuite/
ext/vstring/modifiers/pop_back/char/.
* testsuite/ext/vstring/modifiers/wchar_t/pop_back.cc: Move to
testsuite/ext/vstring/modifiers/pop_back/wchar_t/.
* 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/list/requirements/dr438/assign_neg.cc:
Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_1_neg.cc: Likewise.
* testsuite/23_containers/list/requirements/dr438/
constructor_2_neg.cc: Likewise.
* testsuite/23_containers/list/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-25 Ed Smith-Rowland <3dw4rd@verizon.net> 2013-06-25 Ed Smith-Rowland <3dw4rd@verizon.net>
Status page for C++2014 library features Status page for C++2014 library features
......
...@@ -143,33 +143,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -143,33 +143,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
} }
#endif #endif
template <typename _Tp, typename _Alloc>
typename deque<_Tp, _Alloc>::iterator
deque<_Tp, _Alloc>::
insert(iterator __position, const value_type& __x)
{
if (__position._M_cur == this->_M_impl._M_start._M_cur)
{
push_front(__x);
return this->_M_impl._M_start;
}
else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
{
push_back(__x);
iterator __tmp = this->_M_impl._M_finish;
--__tmp;
return __tmp;
}
else
return _M_insert_aux(__position, __x);
}
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename _Tp, typename _Alloc> template<typename _Tp, typename _Alloc>
template<typename... _Args> template<typename... _Args>
typename deque<_Tp, _Alloc>::iterator typename deque<_Tp, _Alloc>::iterator
deque<_Tp, _Alloc>:: deque<_Tp, _Alloc>::
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
if (__position._M_cur == this->_M_impl._M_start._M_cur) if (__position._M_cur == this->_M_impl._M_start._M_cur)
{ {
...@@ -184,13 +163,39 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -184,13 +163,39 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
return __tmp; return __tmp;
} }
else else
return _M_insert_aux(__position, std::forward<_Args>(__args)...); return _M_insert_aux(__position._M_const_cast(),
std::forward<_Args>(__args)...);
} }
#endif #endif
template <typename _Tp, typename _Alloc> template <typename _Tp, typename _Alloc>
typename deque<_Tp, _Alloc>::iterator typename deque<_Tp, _Alloc>::iterator
deque<_Tp, _Alloc>:: deque<_Tp, _Alloc>::
#if __cplusplus >= 201103L
insert(const_iterator __position, const value_type& __x)
#else
insert(iterator __position, const value_type& __x)
#endif
{
if (__position._M_cur == this->_M_impl._M_start._M_cur)
{
push_front(__x);
return this->_M_impl._M_start;
}
else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
{
push_back(__x);
iterator __tmp = this->_M_impl._M_finish;
--__tmp;
return __tmp;
}
else
return _M_insert_aux(__position._M_const_cast(), __x);
}
template <typename _Tp, typename _Alloc>
typename deque<_Tp, _Alloc>::iterator
deque<_Tp, _Alloc>::
_M_erase(iterator __position) _M_erase(iterator __position)
{ {
iterator __next = __position; iterator __next = __position;
......
...@@ -85,10 +85,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -85,10 +85,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename... _Args> template<typename... _Args>
typename list<_Tp, _Alloc>::iterator typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>:: list<_Tp, _Alloc>::
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
_Node* __tmp = _M_create_node(std::forward<_Args>(__args)...); _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
__tmp->_M_hook(__position._M_node); __tmp->_M_hook(__position._M_const_cast()._M_node);
return iterator(__tmp); return iterator(__tmp);
} }
#endif #endif
...@@ -96,10 +96,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -96,10 +96,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc> template<typename _Tp, typename _Alloc>
typename list<_Tp, _Alloc>::iterator typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>:: list<_Tp, _Alloc>::
#if __cplusplus >= 201103L
insert(const_iterator __position, const value_type& __x)
#else
insert(iterator __position, const value_type& __x) insert(iterator __position, const value_type& __x)
#endif
{ {
_Node* __tmp = _M_create_node(__x); _Node* __tmp = _M_create_node(__x);
__tmp->_M_hook(__position._M_node); __tmp->_M_hook(__position._M_const_cast()._M_node);
return iterator(__tmp); return iterator(__tmp);
} }
...@@ -113,11 +117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -113,11 +117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#endif #endif
{ {
iterator __ret = iterator(__position._M_node->_M_next); iterator __ret = iterator(__position._M_node->_M_next);
#if __cplusplus >= 201103L
_M_erase(__position._M_const_cast()); _M_erase(__position._M_const_cast());
#else
_M_erase(__position);
#endif
return __ret; return __ret;
} }
......
...@@ -222,6 +222,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -222,6 +222,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Bit_iterator(_Bit_type * __x, unsigned int __y) _Bit_iterator(_Bit_type * __x, unsigned int __y)
: _Bit_iterator_base(__x, __y) { } : _Bit_iterator_base(__x, __y) { }
iterator
_M_const_cast() const
{ return *this; }
reference reference
operator*() const operator*() const
{ return reference(_M_p, 1UL << _M_offset); } { return reference(_M_p, 1UL << _M_offset); }
...@@ -859,14 +863,18 @@ template<typename _Alloc> ...@@ -859,14 +863,18 @@ template<typename _Alloc>
} }
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const bool& __x = bool())
#else
insert(iterator __position, const bool& __x = bool()) insert(iterator __position, const bool& __x = bool())
#endif
{ {
const difference_type __n = __position - begin(); const difference_type __n = __position - begin();
if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_of_storage
&& __position == end()) && __position == end())
*this->_M_impl._M_finish++ = __x; *this->_M_impl._M_finish++ = __x;
else else
_M_insert_aux(__position, __x); _M_insert_aux(__position._M_const_cast(), __x);
return begin() + __n; return begin() + __n;
} }
...@@ -904,20 +912,18 @@ template<typename _Alloc> ...@@ -904,20 +912,18 @@ template<typename _Alloc>
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __position) erase(const_iterator __position)
{ return _M_erase(__position._M_const_cast()); }
#else #else
erase(iterator __position) erase(iterator __position)
{ return _M_erase(__position); }
#endif #endif
{ return _M_erase(__position._M_const_cast()); }
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __first, const_iterator __last) erase(const_iterator __first, const_iterator __last)
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
#else #else
erase(iterator __first, iterator __last) erase(iterator __first, iterator __last)
{ return _M_erase(__first, __last); }
#endif #endif
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
void void
resize(size_type __new_size, bool __x = bool()) resize(size_type __new_size, bool __x = bool())
......
...@@ -1458,7 +1458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1458,7 +1458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief Inserts an object in %deque before specified iterator. * @brief Inserts an object in %deque before specified iterator.
* @param __position An iterator into the %deque. * @param __position A const_iterator into the %deque.
* @param __args Arguments. * @param __args Arguments.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
* *
...@@ -1467,11 +1467,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1467,11 +1467,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args); emplace(const_iterator __position, _Args&&... __args);
#endif
/** /**
* @brief Inserts given value into %deque before specified iterator. * @brief Inserts given value into %deque before specified iterator.
* @param __position A const_iterator into the %deque.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given value before the
* specified location.
*/
iterator
insert(const_iterator __position, const value_type& __x);
#else
/**
* @brief Inserts given value into %deque before specified iterator.
* @param __position An iterator into the %deque. * @param __position An iterator into the %deque.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
...@@ -1481,11 +1492,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1481,11 +1492,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
iterator iterator
insert(iterator __position, const value_type& __x); insert(iterator __position, const value_type& __x);
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief Inserts given rvalue into %deque before specified iterator. * @brief Inserts given rvalue into %deque before specified iterator.
* @param __position An iterator into the %deque. * @param __position A const_iterator into the %deque.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
* *
...@@ -1493,7 +1505,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1493,7 +1505,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* specified location. * specified location.
*/ */
iterator iterator
insert(iterator __position, value_type&& __x) insert(const_iterator __position, value_type&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
/** /**
...@@ -1568,11 +1580,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1568,11 +1580,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __position) erase(const_iterator __position)
{ return _M_erase(__position._M_const_cast()); }
#else #else
erase(iterator __position) erase(iterator __position)
{ return _M_erase(__position); }
#endif #endif
{ return _M_erase(__position._M_const_cast()); }
/** /**
* @brief Remove a range of elements. * @brief Remove a range of elements.
...@@ -1593,11 +1604,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1593,11 +1604,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __first, const_iterator __last) erase(const_iterator __first, const_iterator __last)
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
#else #else
erase(iterator __first, iterator __last) erase(iterator __first, iterator __last)
{ return _M_erase(__first, __last); }
#endif #endif
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
/** /**
* @brief Swaps data with another %deque. * @brief Swaps data with another %deque.
......
...@@ -734,19 +734,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -734,19 +734,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Container>::__type>& __i) _Container>::__type>& __i)
: _M_current(__i.base()) { } : _M_current(__i.base()) { }
#if __cplusplus >= 201103L
__normal_iterator<typename _Container::pointer, _Container> __normal_iterator<typename _Container::pointer, _Container>
_M_const_cast() const _M_const_cast() const
{ {
#if __cplusplus >= 201103L
using _PTraits = std::pointer_traits<typename _Container::pointer>; using _PTraits = std::pointer_traits<typename _Container::pointer>;
return __normal_iterator<typename _Container::pointer, _Container> return __normal_iterator<typename _Container::pointer, _Container>
(_PTraits::pointer_to(const_cast<typename _PTraits::element_type&> (_PTraits::pointer_to(const_cast<typename _PTraits::element_type&>
(*_M_current))); (*_M_current)));
}
#else #else
return __normal_iterator<typename _Container::pointer, _Container> __normal_iterator
(const_cast<typename _Container::pointer>(_M_current)); _M_const_cast() const
{ return *this; }
#endif #endif
}
// Forward iterator requirements // Forward iterator requirements
reference reference
......
...@@ -140,6 +140,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -140,6 +140,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_List_iterator(__detail::_List_node_base* __x) _List_iterator(__detail::_List_node_base* __x)
: _M_node(__x) { } : _M_node(__x) { }
_Self
_M_const_cast() const
{ return *this; }
// Must downcast from _List_node_base to _List_node to get to _M_data. // Must downcast from _List_node_base to _List_node to get to _M_data.
reference reference
operator*() const operator*() const
...@@ -1060,11 +1064,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1060,11 +1064,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args); emplace(const_iterator __position, _Args&&... __args);
#endif
/** /**
* @brief Inserts given value into %list before specified iterator. * @brief Inserts given value into %list before specified iterator.
* @param __position A const_iterator into the %list.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given value before
* the specified location. Due to the nature of a %list this
* operation can be done in constant time, and does not
* invalidate iterators and references.
*/
iterator
insert(const_iterator __position, const value_type& __x);
#else
/**
* @brief Inserts given value into %list before specified iterator.
* @param __position An iterator into the %list. * @param __position An iterator into the %list.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
...@@ -1076,11 +1093,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1076,11 +1093,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
iterator iterator
insert(iterator __position, const value_type& __x); insert(iterator __position, const value_type& __x);
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief Inserts given rvalue into %list before specified iterator. * @brief Inserts given rvalue into %list before specified iterator.
* @param __position An iterator into the %list. * @param __position A const_iterator into the %list.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
* *
...@@ -1090,7 +1108,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1090,7 +1108,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* invalidate iterators and references. * invalidate iterators and references.
*/ */
iterator iterator
insert(iterator __position, value_type&& __x) insert(const_iterator __position, value_type&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
/** /**
...@@ -1206,11 +1224,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1206,11 +1224,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{ {
while (__first != __last) while (__first != __last)
__first = erase(__first); __first = erase(__first);
#if __cplusplus >= 201103L
return __last._M_const_cast(); return __last._M_const_cast();
#else
return __last;
#endif
} }
/** /**
......
...@@ -943,7 +943,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -943,7 +943,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief Inserts an object in %vector before specified iterator. * @brief Inserts an object in %vector before specified iterator.
* @param __position An iterator into the %vector. * @param __position A const_iterator into the %vector.
* @param __args Arguments. * @param __args Arguments.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
* *
...@@ -955,11 +955,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -955,11 +955,24 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args); emplace(const_iterator __position, _Args&&... __args);
#endif
/** /**
* @brief Inserts given value into %vector before specified iterator. * @brief Inserts given value into %vector before specified iterator.
* @param __position A const_iterator into the %vector.
* @param __x Data to be inserted.
* @return An iterator that points to the inserted data.
*
* This function will insert a copy of the given value before
* the specified location. 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, const value_type& __x);
#else
/**
* @brief Inserts given value into %vector before specified iterator.
* @param __position An iterator into the %vector. * @param __position An iterator into the %vector.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
...@@ -971,11 +984,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -971,11 +984,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*/ */
iterator iterator
insert(iterator __position, const value_type& __x); insert(iterator __position, const value_type& __x);
#endif
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
/** /**
* @brief Inserts given rvalue into %vector before specified iterator. * @brief Inserts given rvalue into %vector before specified iterator.
* @param __position An iterator into the %vector. * @param __position A const_iterator into the %vector.
* @param __x Data to be inserted. * @param __x Data to be inserted.
* @return An iterator that points to the inserted data. * @return An iterator that points to the inserted data.
* *
...@@ -985,7 +999,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -985,7 +999,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
* used the user should consider using std::list. * used the user should consider using std::list.
*/ */
iterator iterator
insert(iterator __position, value_type&& __x) insert(const_iterator __position, value_type&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
/** /**
...@@ -1074,11 +1088,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1074,11 +1088,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __position) erase(const_iterator __position)
{ return _M_erase(__position._M_const_cast()); }
#else #else
erase(iterator __position) erase(iterator __position)
{ return _M_erase(__position); }
#endif #endif
{ return _M_erase(__position._M_const_cast()); }
/** /**
* @brief Remove a range of elements. * @brief Remove a range of elements.
...@@ -1101,11 +1114,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1101,11 +1114,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __first, const_iterator __last) erase(const_iterator __first, const_iterator __last)
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
#else #else
erase(iterator __first, iterator __last) erase(iterator __first, iterator __last)
{ return _M_erase(__first, __last); }
#endif #endif
{ return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
/** /**
* @brief Swaps data with another %vector. * @brief Swaps data with another %vector.
...@@ -1119,7 +1131,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -1119,7 +1131,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
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
{ {
this->_M_impl._M_swap_data(__x._M_impl); this->_M_impl._M_swap_data(__x._M_impl);
......
...@@ -105,7 +105,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -105,7 +105,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename _Tp, typename _Alloc> template<typename _Tp, typename _Alloc>
typename vector<_Tp, _Alloc>::iterator typename vector<_Tp, _Alloc>::iterator
vector<_Tp, _Alloc>:: vector<_Tp, _Alloc>::
#if __cplusplus >= 201103L
insert(const_iterator __position, const value_type& __x)
#else
insert(iterator __position, const value_type& __x) insert(iterator __position, const value_type& __x)
#endif
{ {
const size_type __n = __position - begin(); const size_type __n = __position - begin();
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
...@@ -120,11 +124,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -120,11 +124,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{ {
_Tp __x_copy = __x; _Tp __x_copy = __x;
_M_insert_aux(__position, std::move(__x_copy)); _M_insert_aux(__position._M_const_cast(), std::move(__x_copy));
} }
else else
#endif #endif
_M_insert_aux(__position, __x); _M_insert_aux(__position._M_const_cast(), __x);
} }
return iterator(this->_M_impl._M_start + __n); return iterator(this->_M_impl._M_start + __n);
} }
...@@ -292,7 +296,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -292,7 +296,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
template<typename... _Args> template<typename... _Args>
typename vector<_Tp, _Alloc>::iterator typename vector<_Tp, _Alloc>::iterator
vector<_Tp, _Alloc>:: vector<_Tp, _Alloc>::
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
const size_type __n = __position - begin(); const size_type __n = __position - begin();
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
...@@ -303,7 +307,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER ...@@ -303,7 +307,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
++this->_M_impl._M_finish; ++this->_M_impl._M_finish;
} }
else else
_M_insert_aux(__position, std::forward<_Args>(__args)...); _M_insert_aux(__position._M_const_cast(),
std::forward<_Args>(__args)...);
return iterator(this->_M_impl._M_start + __n); return iterator(this->_M_impl._M_start + __n);
} }
......
...@@ -383,7 +383,7 @@ namespace __debug ...@@ -383,7 +383,7 @@ namespace __debug
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
__glibcxx_check_insert(__position); __glibcxx_check_insert(__position);
_Base_iterator __res = _Base::emplace(__position.base(), _Base_iterator __res = _Base::emplace(__position.base(),
...@@ -394,7 +394,11 @@ namespace __debug ...@@ -394,7 +394,11 @@ namespace __debug
#endif #endif
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const _Tp& __x)
#else
insert(iterator __position, const _Tp& __x) insert(iterator __position, const _Tp& __x)
#endif
{ {
__glibcxx_check_insert(__position); __glibcxx_check_insert(__position);
_Base_iterator __res = _Base::insert(__position.base(), __x); _Base_iterator __res = _Base::insert(__position.base(), __x);
...@@ -404,7 +408,7 @@ namespace __debug ...@@ -404,7 +408,7 @@ namespace __debug
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
insert(iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void void
......
...@@ -379,7 +379,7 @@ namespace __debug ...@@ -379,7 +379,7 @@ namespace __debug
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
__glibcxx_check_insert(__position); __glibcxx_check_insert(__position);
return iterator(_Base::emplace(__position.base(), return iterator(_Base::emplace(__position.base(),
...@@ -387,16 +387,20 @@ namespace __debug ...@@ -387,16 +387,20 @@ namespace __debug
} }
#endif #endif
iterator iterator
insert(iterator __position, const _Tp& __x) #if __cplusplus >= 201103L
{ insert(const_iterator __position, const _Tp& __x)
__glibcxx_check_insert(__position); #else
return iterator(_Base::insert(__position.base(), __x), this); insert(iterator __position, const _Tp& __x)
} #endif
{
__glibcxx_check_insert(__position);
return iterator(_Base::insert(__position.base(), __x), this);
}
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
insert(iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void void
......
...@@ -429,7 +429,7 @@ namespace __debug ...@@ -429,7 +429,7 @@ namespace __debug
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
__glibcxx_check_insert(__position); __glibcxx_check_insert(__position);
bool __realloc = _M_requires_reallocation(this->size() + 1); bool __realloc = _M_requires_reallocation(this->size() + 1);
...@@ -446,7 +446,11 @@ namespace __debug ...@@ -446,7 +446,11 @@ namespace __debug
#endif #endif
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const _Tp& __x)
#else
insert(iterator __position, const _Tp& __x) insert(iterator __position, const _Tp& __x)
#endif
{ {
__glibcxx_check_insert(__position); __glibcxx_check_insert(__position);
bool __realloc = _M_requires_reallocation(this->size() + 1); bool __realloc = _M_requires_reallocation(this->size() + 1);
...@@ -464,7 +468,7 @@ namespace __debug ...@@ -464,7 +468,7 @@ namespace __debug
template<typename _Up = _Tp> template<typename _Up = _Tp>
typename __gnu_cxx::__enable_if<!std::__are_same<_Up, bool>::__value, typename __gnu_cxx::__enable_if<!std::__are_same<_Up, bool>::__value,
iterator>::__type iterator>::__type
insert(iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void void
......
...@@ -1087,7 +1087,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1087,7 +1087,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* change if an error is thrown. * change if an error is thrown.
*/ */
iterator iterator
insert(iterator __p, _CharT __c) #if __cplusplus >= 201103L
insert(const_iterator __p, _CharT __c)
#else
insert(iterator __p, _CharT __c)
#endif
{ {
_GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend()); _GLIBCXX_DEBUG_PEDASSERT(__p >= _M_ibegin() && __p <= _M_iend());
const size_type __pos = __p - _M_ibegin(); const size_type __pos = __p - _M_ibegin();
...@@ -1313,7 +1317,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1313,7 +1317,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the string doesn't change if an error is thrown. * the string doesn't change if an error is thrown.
*/ */
__versa_string& __versa_string&
#if __cplusplus >= 201103L
replace(const_iterator __i1, const_iterator __i2,
const __versa_string& __str)
#else
replace(iterator __i1, iterator __i2, const __versa_string& __str) replace(iterator __i1, iterator __i2, const __versa_string& __str)
#endif
{ return this->replace(__i1, __i2, __str._M_data(), __str.size()); } { return this->replace(__i1, __i2, __str._M_data(), __str.size()); }
/** /**
...@@ -1331,7 +1340,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1331,7 +1340,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* value of the string doesn't change if an error is thrown. * value of the string doesn't change if an error is thrown.
*/ */
__versa_string& __versa_string&
#if __cplusplus >= 201103L
replace(const_iterator __i1, const_iterator __i2,
const _CharT* __s, size_type __n)
#else
replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n)
#endif
{ {
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend()); && __i2 <= _M_iend());
...@@ -1352,7 +1366,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1352,7 +1366,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the string doesn't change if an error is thrown. * the string doesn't change if an error is thrown.
*/ */
__versa_string& __versa_string&
replace(iterator __i1, iterator __i2, const _CharT* __s) #if __cplusplus >= 201103L
replace(const_iterator __i1, const_iterator __i2, const _CharT* __s)
#else
replace(iterator __i1, iterator __i2, const _CharT* __s)
#endif
{ {
__glibcxx_requires_string(__s); __glibcxx_requires_string(__s);
return this->replace(__i1, __i2, __s, traits_type::length(__s)); return this->replace(__i1, __i2, __s, traits_type::length(__s));
...@@ -1373,7 +1391,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1373,7 +1391,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* the string doesn't change if an error is thrown. * the string doesn't change if an error is thrown.
*/ */
__versa_string& __versa_string&
#if __cplusplus >= 201103L
replace(const_iterator __i1, const_iterator __i2, size_type __n,
_CharT __c)
#else
replace(iterator __i1, iterator __i2, size_type __n, _CharT __c) replace(iterator __i1, iterator __i2, size_type __n, _CharT __c)
#endif
{ {
_GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2 _GLIBCXX_DEBUG_PEDASSERT(_M_ibegin() <= __i1 && __i1 <= __i2
&& __i2 <= _M_iend()); && __i2 <= _M_iend());
......
...@@ -320,7 +320,7 @@ namespace __profile ...@@ -320,7 +320,7 @@ namespace __profile
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
typename _Base::iterator __res = _Base::emplace(__position, typename _Base::iterator __res = _Base::emplace(__position,
std::forward<_Args>(__args)...); std::forward<_Args>(__args)...);
...@@ -329,7 +329,11 @@ namespace __profile ...@@ -329,7 +329,11 @@ namespace __profile
#endif #endif
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const _Tp& __x)
#else
insert(iterator __position, const _Tp& __x) insert(iterator __position, const _Tp& __x)
#endif
{ {
typename _Base::iterator __res = _Base::insert(__position, __x); typename _Base::iterator __res = _Base::insert(__position, __x);
return iterator(__res); return iterator(__res);
...@@ -337,7 +341,7 @@ namespace __profile ...@@ -337,7 +341,7 @@ namespace __profile
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
insert(iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ return emplace(__position, std::move(__x)); } { return emplace(__position, std::move(__x)); }
void void
......
...@@ -335,7 +335,7 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > ...@@ -335,7 +335,7 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
template<typename... _Args> template<typename... _Args>
iterator iterator
emplace(iterator __position, _Args&&... __args) emplace(const_iterator __position, _Args&&... __args)
{ {
return iterator(_Base::emplace(__position.base(), return iterator(_Base::emplace(__position.base(),
std::forward<_Args>(__args)...), std::forward<_Args>(__args)...),
...@@ -344,7 +344,11 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > ...@@ -344,7 +344,11 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
#endif #endif
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const _Tp& __x)
#else
insert(iterator __position, const _Tp& __x) insert(iterator __position, const _Tp& __x)
#endif
{ {
_M_profile_insert(this, __position, size()); _M_profile_insert(this, __position, size());
return iterator(_Base::insert(__position.base(), __x), this); return iterator(_Base::insert(__position.base(), __x), this);
...@@ -352,8 +356,8 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > ...@@ -352,8 +356,8 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
insert(iterator __position, _Tp&& __x) insert(const_iterator __position, _Tp&& __x)
{ {
_M_profile_insert(this, __position, size()); _M_profile_insert(this, __position, size());
return iterator(_Base::emplace(__position.base(), std::move(__x)), return iterator(_Base::emplace(__position.base(), std::move(__x)),
this); this);
...@@ -606,11 +610,12 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> > ...@@ -606,11 +610,12 @@ template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
} }
private: private:
size_type _M_profile_insert(void* obj, iterator __pos, size_type __size) size_type
_M_profile_insert(void* obj, const_iterator __pos, size_type __size)
{ {
size_type __shift = 0; size_type __shift = 0;
typename _Base::iterator __it = __pos.base(); typename _Base::const_iterator __it = __pos.base();
for ( ; __it!=_Base::end(); __it++) for (; __it != _Base::end(); ++__it)
__shift++; __shift++;
__profcxx_list_rewind(this); __profcxx_list_rewind(this);
__profcxx_list_operation(this); __profcxx_list_operation(this);
......
...@@ -352,7 +352,11 @@ namespace __profile ...@@ -352,7 +352,11 @@ namespace __profile
#endif #endif
iterator iterator
#if __cplusplus >= 201103L
insert(const_iterator __position, const _Tp& __x)
#else
insert(iterator __position, const _Tp& __x) insert(iterator __position, const _Tp& __x)
#endif
{ {
__profcxx_vector_insert(this, __position.base() - _Base::begin(), __profcxx_vector_insert(this, __position.base() - _Base::begin(),
this->size()); this->size());
...@@ -364,7 +368,7 @@ namespace __profile ...@@ -364,7 +368,7 @@ namespace __profile
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
iterator iterator
insert(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::begin(),
this->size()); this->size());
...@@ -374,6 +378,16 @@ namespace __profile ...@@ -374,6 +378,16 @@ namespace __profile
return iterator(__res, this); return iterator(__res, this);
} }
template<typename... _Args>
iterator
emplace(const_iterator __position, _Args&&... __args)
{
typename _Base::iterator __res
= _Base::emplace(__position.base(),
std::forward<_Args>(__args)...);
return iterator(__res, this);
}
void void
insert(iterator __position, initializer_list<value_type> __l) insert(iterator __position, initializer_list<value_type> __l)
{ this->insert(__position, __l.begin(), __l.end()); } { this->insert(__position, __l.begin(), __l.end()); }
...@@ -423,7 +437,6 @@ namespace __profile ...@@ -423,7 +437,6 @@ namespace __profile
_M_profile_resize(this, __old_size, this->capacity()); _M_profile_resize(this, __old_size, this->capacity());
} }
iterator iterator
#if __cplusplus >= 201103L #if __cplusplus >= 201103L
erase(const_iterator __position) erase(const_iterator __position)
......
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <deque>
void test01()
{
std::deque<int> d1;
d1.emplace(d1.cbegin(), 1);
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <deque>
void test01()
{
std::deque<int> d1;
int n = 0;
d1.insert(d1.cbegin(), n);
d1.insert(d1.cbegin(), 1);
}
...@@ -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 *-*-* } 1714 } // { dg-error "no matching" "" { target *-*-* } 1724 }
#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 *-*-* } 1647 } // { dg-error "no matching" "" { target *-*-* } 1657 }
#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 *-*-* } 1647 } // { dg-error "no matching" "" { target *-*-* } 1657 }
#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 *-*-* } 1798 } // { dg-error "no matching" "" { target *-*-* } 1808 }
#include <deque> #include <deque>
......
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <list>
void test01()
{
std::list<int> l1;
l1.emplace(l1.cbegin(), 1);
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <list>
void test01()
{
std::list<int> l1;
int n = 0;
l1.insert(l1.cbegin(), n);
l1.insert(l1.cbegin(), 1);
}
...@@ -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 *-*-* } 1545 } // { dg-error "no matching" "" { target *-*-* } 1559 }
#include <list> #include <list>
......
...@@ -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 *-*-* } 1497 } // { dg-error "no matching" "" { target *-*-* } 1511 }
#include <list> #include <list>
......
...@@ -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 *-*-* } 1497 } // { dg-error "no matching" "" { target *-*-* } 1511 }
#include <list> #include <list>
#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 *-*-* } 1497 } // { dg-error "no matching" "" { target *-*-* } 1511 }
#include <list> #include <list>
......
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <vector>
void test01()
{
std::vector<bool> vb1;
vb1.insert(vb1.cbegin(), true);
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <vector>
void test01()
{
std::vector<int> v1;
v1.emplace(v1.cbegin(), 1);
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <vector>
void test01()
{
std::vector<int> v1;
int n = 0;
v1.insert(v1.cbegin(), n);
v1.insert(v1.cbegin(), 1);
}
...@@ -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 *-*-* } 1252 } // { dg-error "no matching" "" { target *-*-* } 1264 }
#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 *-*-* } 1178 } // { dg-error "no matching" "" { target *-*-* } 1190 }
#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 *-*-* } 1178 } // { dg-error "no matching" "" { target *-*-* } 1190 }
#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 *-*-* } 1293 } // { dg-error "no matching" "" { target *-*-* } 1305 }
#include <vector> #include <vector>
......
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <ext/vstring.h>
void test01()
{
__gnu_cxx::__vstring vs1;
vs1.insert(vs1.cbegin(), '1');
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <ext/vstring.h>
void test01()
{
__gnu_cxx::__wvstring wvs1;
wvs1.insert(wvs1.cbegin(), L'1');
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <ext/vstring.h>
void test01()
{
__gnu_cxx::__vstring vs1;
vs1.replace(vs1.cbegin(), vs1.cend(), vs1);
vs1.replace(vs1.cbegin(), vs1.cend(), "1", 1);
vs1.replace(vs1.cbegin(), vs1.cend(), "2");
vs1.replace(vs1.cbegin(), vs1.cend(), 1, '3');
}
// { dg-options "-std=gnu++11" }
// { dg-do compile }
// Copyright (C) 2013 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
#include <ext/vstring.h>
void test01()
{
__gnu_cxx::__wvstring wvs1;
wvs1.replace(wvs1.cbegin(), wvs1.cend(), wvs1);
wvs1.replace(wvs1.cbegin(), wvs1.cend(), L"1", 1);
wvs1.replace(wvs1.cbegin(), wvs1.cend(), L"2");
wvs1.replace(wvs1.cbegin(), wvs1.cend(), 1, L'3');
}
...@@ -265,7 +265,7 @@ namespace __gnu_test ...@@ -265,7 +265,7 @@ namespace __gnu_test
: _F_erase_point(&_Tp::erase), _F_erase_range(&_Tp::erase) { } : _F_erase_point(&_Tp::erase), _F_erase_range(&_Tp::erase) { }
}; };
// Specializations, old C++03 signatures. // Specialization, old C++03 signature.
template<typename _Tp1, typename _Tp2, typename _Tp3> template<typename _Tp1, typename _Tp2, typename _Tp3>
struct erase_base<std::basic_string<_Tp1, _Tp2, _Tp3>> struct erase_base<std::basic_string<_Tp1, _Tp2, _Tp3>>
{ {
...@@ -280,24 +280,6 @@ namespace __gnu_test ...@@ -280,24 +280,6 @@ namespace __gnu_test
_F_erase_range(&container_type::erase) { } _F_erase_range(&container_type::erase) { }
}; };
template<typename _Tp1, typename _Tp2, typename _Tp3,
template <typename, typename, typename> class _Tp4>
struct erase_base<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>>
{
typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>
container_type;
typedef typename container_type::iterator iterator;
typedef typename container_type::const_iterator const_iterator;
iterator (container_type::* _F_erase_point)(const_iterator);
iterator (container_type::* _F_erase_range)(const_iterator,
const_iterator);
erase_base()
: _F_erase_point(&container_type::erase),
_F_erase_range(&container_type::erase) { }
};
// Specialization, as forward_list has erase_after. // Specialization, as forward_list has erase_after.
template<typename _Tp1, typename _Tp2> template<typename _Tp1, typename _Tp2>
struct erase_base<std::forward_list<_Tp1, _Tp2>> struct erase_base<std::forward_list<_Tp1, _Tp2>>
...@@ -698,47 +680,7 @@ namespace __gnu_test ...@@ -698,47 +680,7 @@ namespace __gnu_test
insert_base() : _F_insert_point(&_Tp::insert) { } insert_base() : _F_insert_point(&_Tp::insert) { }
}; };
// Specializations, old C++03 signatures. // Specialization, old C++03 signature.
template<typename _Tp1, typename _Tp2>
struct insert_base<std::deque<_Tp1, _Tp2>>
{
typedef std::deque<_Tp1, _Tp2> container_type;
typedef typename container_type::iterator iterator;
typedef typename container_type::value_type value_type;
iterator (container_type::* _F_insert_point)(iterator,
const value_type&);
insert_base() : _F_insert_point(&container_type::insert) { }
};
template<typename _Tp1, typename _Tp2>
struct insert_base<std::list<_Tp1, _Tp2>>
{
typedef std::list<_Tp1, _Tp2> container_type;
typedef typename container_type::iterator iterator;
typedef typename container_type::value_type value_type;
iterator (container_type::* _F_insert_point)(iterator,
const value_type&);
insert_base() : _F_insert_point(&container_type::insert) { }
};
template<typename _Tp1, typename _Tp2>
struct insert_base<std::vector<_Tp1, _Tp2>>
{
typedef std::vector<_Tp1, _Tp2> container_type;
typedef typename container_type::iterator iterator;
typedef typename container_type::value_type value_type;
iterator (container_type::* _F_insert_point)(iterator,
const value_type&);
insert_base() : _F_insert_point(&container_type::insert) { }
};
// Specialization, as string insertion has a different signature.
template<typename _Tp1, typename _Tp2, typename _Tp3> template<typename _Tp1, typename _Tp2, typename _Tp3>
struct insert_base<std::basic_string<_Tp1, _Tp2, _Tp3>> struct insert_base<std::basic_string<_Tp1, _Tp2, _Tp3>>
{ {
...@@ -751,17 +693,19 @@ namespace __gnu_test ...@@ -751,17 +693,19 @@ namespace __gnu_test
insert_base() : _F_insert_point(&container_type::insert) { } insert_base() : _F_insert_point(&container_type::insert) { }
}; };
// Likewise for __versa_string. // Specialization, by value.
template<typename _Tp1, typename _Tp2, typename _Tp3, template<typename _Tp1, typename _Tp2, typename _Tp3,
template <typename, typename, typename> class _Tp4> template <typename, typename, typename> class _Tp4>
struct insert_base<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>> struct insert_base<__gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>>
{ {
typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4> typedef __gnu_cxx::__versa_string<_Tp1, _Tp2, _Tp3, _Tp4>
container_type; container_type;
typedef typename container_type::iterator iterator; typedef typename container_type::iterator iterator;
typedef typename container_type::value_type value_type; typedef typename container_type::const_iterator const_iterator;
typedef typename container_type::value_type value_type;
iterator (container_type::* _F_insert_point)(iterator, value_type); iterator (container_type::* _F_insert_point)(const_iterator,
value_type);
insert_base() : _F_insert_point(&container_type::insert) { } insert_base() : _F_insert_point(&container_type::insert) { }
}; };
......
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