diff options
author | Paolo Carlini <pcarlini@suse.de> | 2007-11-07 00:36:33 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2007-11-07 00:36:33 +0000 |
commit | 812e8c79b4bf1d3b76ea17da56a6ad7ecb141aac (patch) | |
tree | 5bdb72b0746fff126fbec50c1fa31eb8b13f639e | |
parent | b6e2138fb7bb684c6c5658393011f5aeab1f7ffb (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/vector.tcc | 35 |
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; |