QVarLengthArray: Extract Method QtPrivate::q_rotate()
It seems like we'll need this in lots of other places, too. Pick-to: 6.5 6.4 6.2 5.15 Change-Id: I767495c2eb02a2fc85b6f835ad9003fa89315c7f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
parent
bb2ff8a69f
commit
147dd6e82f
@ -86,6 +86,26 @@ void q_uninitialized_relocate_n(T* first, N n, T* out)
|
||||
|
||||
QT_WARNING_POP
|
||||
|
||||
/*!
|
||||
\internal
|
||||
|
||||
A wrapper around std::rotate(), with an optimization for
|
||||
Q_RELOCATABLE_TYPEs. We omit the return value, as it would be more work to
|
||||
compute in the Q_RELOCATABLE_TYPE case and, unlike std::rotate on
|
||||
ForwardIterators, callers can compute the result in constant time
|
||||
themselves.
|
||||
*/
|
||||
template <typename T>
|
||||
void q_rotate(T *first, T *mid, T *last)
|
||||
{
|
||||
if constexpr (QTypeInfo<T>::isRelocatable) {
|
||||
const auto cast = [](T *p) { return reinterpret_cast<uchar*>(p); };
|
||||
std::rotate(cast(first), cast(mid), cast(last));
|
||||
} else {
|
||||
std::rotate(first, mid, last);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
Copies all elements, except the ones for which \a pred returns \c true, from
|
||||
|
@ -916,12 +916,7 @@ Q_OUTOFLINE_TEMPLATE auto QVLABase<T>::emplace_impl(qsizetype prealloc, void *ar
|
||||
emplace_back_impl(prealloc, array, std::forward<Args>(args)...);
|
||||
const auto b = begin() + offset;
|
||||
const auto e = end();
|
||||
if constexpr (QTypeInfo<T>::isRelocatable) {
|
||||
auto cast = [](T *p) { return reinterpret_cast<uchar*>(p); };
|
||||
std::rotate(cast(b), cast(e - 1), cast(e));
|
||||
} else {
|
||||
std::rotate(b, e - 1, e);
|
||||
}
|
||||
QtPrivate::q_rotate(b, e - 1, e);
|
||||
return b;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user