@@ -946,11 +946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
++this->_M_impl._M_finish;
}
else
-#if __cplusplus >= 201103L
- _M_emplace_back_aux(__x);
-#else
- _M_insert_aux(end(), __x);
-#endif
+ _M_realloc_insert(end(), __x);
}
#if __cplusplus >= 201103L
@@ -1436,6 +1432,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
// Called by insert(p,x)
void
_M_insert_aux(iterator __position, const value_type& __x);
+
+ void
+ _M_realloc_insert(iterator __position, const value_type& __x);
#else
// A value_type object constructed with _Alloc_traits::construct()
// and destroyed with _Alloc_traits::destroy().
@@ -1469,16 +1468,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
void
_M_insert_aux(iterator __position, _Arg&& __arg);
+ template<typename... _Args>
+ void
+ _M_realloc_insert(iterator __position, _Args&&... __args);
+
// Either move-construct at the end, or forward to _M_insert_aux.
iterator
_M_insert_rval(const_iterator __position, value_type&& __v);
- // Called by push_back(x) and emplace_back(args) when they need to
- // reallocate.
- template<typename... _Args>
- void
- _M_emplace_back_aux(_Args&&... __args);
-
// Try to emplace at the end, otherwise forward to _M_insert_aux.
template<typename... _Args>
iterator
@@ -98,7 +98,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
++this->_M_impl._M_finish;
}
else
- _M_emplace_back_aux(std::forward<_Args>(__args)...);
+ _M_realloc_insert(end(), std::forward<_Args>(__args)...);
}
#endif
@@ -112,29 +112,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
#endif
{
const size_type __n = __position - begin();
- if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
- && __position == end())
+ if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
+ if (__position == end())
{
- _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish, __x);
+ _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
+ __x);
++this->_M_impl._M_finish;
}
else
{
#if __cplusplus >= 201103L
const auto __pos = begin() + (__position - cbegin());
- if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
- {
// __x could be an existing element of this vector, so make a
// copy of it before _M_insert_aux moves elements around.
_Temporary_value __x_copy(this, __x);
_M_insert_aux(__pos, std::move(__x_copy._M_val()));
- }
- else
- _M_insert_aux(__pos, __x);
#else
_M_insert_aux(__position, __x);
#endif
}
+ else
+#if __cplusplus >= 201103L
+ _M_realloc_insert(begin() + (__position - cbegin()), __x);
+#else
+ _M_realloc_insert(__position, __x);
+#endif
+
return iterator(this->_M_impl._M_start + __n);
}
@@ -304,8 +307,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_insert_rval(const_iterator __position, value_type&& __v) -> iterator
{
const auto __n = __position - cbegin();
- if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage
- && __position == cend())
+ if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
+ if (__position == cend())
{
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
std::move(__v));
@@ -313,6 +316,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
}
else
_M_insert_aux(begin() + __n, std::move(__v));
+ else
+ _M_realloc_insert(begin() + __n, std::move(__v));
+
return iterator(this->_M_impl._M_start + __n);
}
@@ -324,8 +330,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
-> iterator
{
const auto __n = __position - cbegin();
+ if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
if (__position == cend())
- emplace_back(std::forward<_Args>(__args)...);
+ {
+ _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
+ std::forward<_Args>(__args)...);
+ ++this->_M_impl._M_finish;
+ }
else
{
// We need to construct a temporary because something in __args...
@@ -334,6 +345,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Temporary_value __tmp(this, std::forward<_Args>(__args)...);
_M_insert_aux(begin() + __n, std::move(__tmp._M_val()));
}
+ else
+ _M_realloc_insert(begin() + __n, std::forward<_Args>(__args)...);
+
return iterator(this->_M_impl._M_start + __n);
}
@@ -349,8 +363,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_insert_aux(iterator __position, const _Tp& __x)
#endif
{
- if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
- {
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
_GLIBCXX_MOVE(*(this->_M_impl._M_finish
- 1)));
@@ -367,10 +379,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
*__position = std::forward<_Arg>(__arg);
#endif
}
- else
+
+#if __cplusplus >= 201103L
+ template<typename _Tp, typename _Alloc>
+ template<typename... _Args>
+ void
+ vector<_Tp, _Alloc>::
+ _M_realloc_insert(iterator __position, _Args&&... __args)
+#else
+ template<typename _Tp, typename _Alloc>
+ void
+ vector<_Tp, _Alloc>::
+ _M_realloc_insert(iterator __position, const _Tp& __x)
+#endif
{
const size_type __len =
- _M_check_len(size_type(1), "vector::_M_insert_aux");
+ _M_check_len(size_type(1), "vector::_M_realloc_insert");
const size_type __elems_before = __position - begin();
pointer __new_start(this->_M_allocate(__len));
pointer __new_finish(__new_start);
@@ -384,7 +408,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Alloc_traits::construct(this->_M_impl,
__new_start + __elems_before,
#if __cplusplus >= 201103L
- std::forward<_Arg>(__arg));
+ std::forward<_Args>(__args)...);
#else
__x);
#endif
@@ -421,51 +445,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
this->_M_impl._M_finish = __new_finish;
this->_M_impl._M_end_of_storage = __new_start + __len;
}
- }
-
-#if __cplusplus >= 201103L
- template<typename _Tp, typename _Alloc>
- template<typename... _Args>
- void
- vector<_Tp, _Alloc>::
- _M_emplace_back_aux(_Args&&... __args)
- {
- const size_type __len =
- _M_check_len(size_type(1), "vector::_M_emplace_back_aux");
- pointer __new_start(this->_M_allocate(__len));
- pointer __new_finish(__new_start);
- __try
- {
- _Alloc_traits::construct(this->_M_impl, __new_start + size(),
- std::forward<_Args>(__args)...);
- __new_finish = pointer();
-
- __new_finish
- = std::__uninitialized_move_if_noexcept_a
- (this->_M_impl._M_start, this->_M_impl._M_finish,
- __new_start, _M_get_Tp_allocator());
-
- ++__new_finish;
- }
- __catch(...)
- {
- if (!__new_finish)
- _Alloc_traits::destroy(this->_M_impl, __new_start + size());
- else
- std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
- _M_deallocate(__new_start, __len);
- __throw_exception_again;
- }
- std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- _M_get_Tp_allocator());
- _M_deallocate(this->_M_impl._M_start,
- this->_M_impl._M_end_of_storage
- - this->_M_impl._M_start);
- this->_M_impl._M_start = __new_start;
- this->_M_impl._M_finish = __new_finish;
- this->_M_impl._M_end_of_storage = __new_start + __len;
- }
-#endif
template<typename _Tp, typename _Alloc>
void
@@ -223,8 +223,7 @@ test03()
void
test04()
{
- const X::special expected_ins{ 0, 3, 1, 0, 3, 0 };
- const X::special expected_emp{ 0, 4, 1, 0, 4, 0 };
+ const X::special expected{ 0, 3, 1, 0, 3, 0 };
X::special ins, emp;
{
std::vector<X> v;
@@ -254,8 +253,8 @@ test04()
// std::cout << "----\n";
emp = X::sp;
}
- VERIFY( ins == expected_ins );
- VERIFY( emp == expected_emp );
+ VERIFY( ins == emp );
+ VERIFY( ins == expected );
}
// insert vs emplace xvalue reallocation