aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-11-07 00:36:33 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-11-07 00:36:33 +0000
commit812e8c79b4bf1d3b76ea17da56a6ad7ecb141aac (patch)
tree5bdb72b0746fff126fbec50c1fa31eb8b13f639e
parentb6e2138fb7bb684c6c5658393011f5aeab1f7ffb (diff)
downloadgcc-812e8c79b4bf1d3b76ea17da56a6ad7ecb141aac.zip
gcc-812e8c79b4bf1d3b76ea17da56a6ad7ecb141aac.tar.gz
gcc-812e8c79b4bf1d3b76ea17da56a6ad7ecb141aac.tar.bz2
vector.tcc (vector<>::_M_insert_aux<>(iterator, _Args&&...)): In C++0x mode do not use temporary copies.
2007-11-06 Paolo Carlini <pcarlini@suse.de> * include/bits/vector.tcc (vector<>::_M_insert_aux<>(iterator, _Args&&...)): In C++0x mode do not use temporary copies. (insert(iterator, const value_type&)): Copy to a temporary when not reallocating. * include/bits/vector.tcc (insert(iterator, value_type&&)): Minor tweaks in C++0x mode. From-SVN: r129954
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/bits/vector.tcc35
2 files changed, 34 insertions, 11 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6dcaed0..53d97a7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,13 @@
+2007-11-06 Paolo Carlini <pcarlini@suse.de>
+
+ * include/bits/vector.tcc (vector<>::_M_insert_aux<>(iterator,
+ _Args&&...)): In C++0x mode do not use temporary copies.
+ (insert(iterator, const value_type&)): Copy to a temporary
+ when not reallocating.
+
+ * include/bits/vector.tcc (insert(iterator, value_type&&)):
+ Minor tweaks in C++0x mode.
+
2007-11-06 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/tr1_impl/boost_shared_ptr.h: Avoid unnecessary memory
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index b097f44..2b5c4b7 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -101,7 +101,17 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
++this->_M_impl._M_finish;
}
else
- _M_insert_aux(__position, __x);
+ {
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
+ {
+ _Tp __x_copy = __x;
+ _M_insert_aux(__position, std::move(__x_copy));
+ }
+ else
+#endif
+ _M_insert_aux(__position, __x);
+ }
return iterator(this->_M_impl._M_start + __n);
}
@@ -115,12 +125,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
&& __position == end())
{
- this->_M_impl.construct(this->_M_impl._M_finish,
- std::forward<value_type>(__x));
+ this->_M_impl.construct(this->_M_impl._M_finish, std::move(__x));
++this->_M_impl._M_finish;
}
else
- _M_insert_aux(__position, std::forward<value_type>(__x));
+ _M_insert_aux(__position, std::move(__x));
return iterator(this->_M_impl._M_start + __n);
}
#endif
@@ -286,15 +295,13 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
void
vector<_Tp, _Alloc>::
_M_insert_aux(iterator __position, _Args&&... __args)
- {
- _Tp __x_copy(std::forward<_Args>(__args)...);
#else
template<typename _Tp, typename _Alloc>
void
vector<_Tp, _Alloc>::
_M_insert_aux(iterator __position, const _Tp& __x)
- {
#endif
+ {
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
this->_M_impl.construct(this->_M_impl._M_finish,
@@ -307,7 +314,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
_GLIBCXX_MOVE_BACKWARD3(__position.base(),
this->_M_impl._M_finish - 2,
this->_M_impl._M_finish - 1);
- *__position = _GLIBCXX_MOVE(__x_copy);
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+ *__position = __x_copy;
+#else
+ *__position = _Tp(std::forward<_Args>(__args)...);
+#endif
}
else
{
@@ -317,13 +328,15 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
pointer __new_finish(__new_start);
try
{
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+ this->_M_impl.construct(__new_start + (__position - begin()),
+ std::forward<_Args>(__args)...);
+#endif
__new_finish =
std::__uninitialized_move_a(this->_M_impl._M_start,
__position.base(), __new_start,
_M_get_Tp_allocator());
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
- this->_M_impl.construct(__new_finish, std::move(__x_copy));
-#else
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
this->_M_impl.construct(__new_finish, __x);
#endif
++__new_finish;