diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2020-11-04 16:56:53 +0100 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2020-11-10 18:03:23 +0100 |
commit | bd6784b57909a87134c8bb5ddec73b27b8f1260b (patch) | |
tree | 1b6993c0cc1afcc696cc356cf1528612e88f1027 /src/corelib/tools | |
parent | ae7c3985f1fe9a6f73bb5cf7591ef38823804f91 (diff) |
Simplify Q*ArrayOps emplace() signature
Template type never would've worked, really. We relied everywhere
that 'iterator' is comparable to our iterators (in generic version
it should be even the same type - see std::rotate API) and the
iterator type is castable to T* in POD and Movable cases, so
simplify that, no need for extra template boilerplate
Change-Id: I263ae2ba90ca27abceca01fcc21d80a350bbd743
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qarraydataops.h | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 1fd7e99c42..2162512883 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -356,7 +356,6 @@ public: *where++ = t; } - template <typename ...Args> void emplace(T *where, Args&&... args) { emplace(GrowsForwardTag{}, where, std::forward<Args>(args)...); } @@ -760,13 +759,12 @@ public: } } - - template <typename iterator, typename ...Args> - void emplace(iterator where, Args&&... args) + template<typename... Args> + void emplace(T *where, Args &&... args) { emplace(GrowsForwardTag{}, where, std::forward<Args>(args)...); } - template <typename iterator, typename ...Args> - void emplace(GrowsForwardTag, iterator where, Args&&... args) + template<typename... Args> + void emplace(GrowsForwardTag, T *where, Args &&... args) { Q_ASSERT(!this->isShared()); Q_ASSERT(where >= this->begin() && where <= this->end()); @@ -799,8 +797,8 @@ public: } } - template <typename iterator, typename ...Args> - void emplace(GrowsBackwardsTag, iterator where, Args&&... args) + template<typename... Args> + void emplace(GrowsBackwardsTag, T *where, Args &&... args) { Q_ASSERT(!this->isShared()); Q_ASSERT(where >= this->begin() && where <= this->end()); @@ -1043,14 +1041,14 @@ public: // use moving insert using QGenericArrayOps<T>::insert; - template<typename iterator, typename... Args> - void emplace(iterator where, Args &&... args) + template<typename... Args> + void emplace(T *where, Args &&... args) { emplace(GrowsForwardTag {}, where, std::forward<Args>(args)...); } - template<typename iterator, typename... Args> - void emplace(GrowsForwardTag, iterator where, Args &&... args) + template<typename... Args> + void emplace(GrowsForwardTag, T *where, Args &&... args) { Q_ASSERT(!this->isShared()); Q_ASSERT(where >= this->begin() && where <= this->end()); @@ -1068,8 +1066,8 @@ public: ++this->size; } - template<typename iterator, typename... Args> - void emplace(GrowsBackwardsTag, iterator where, Args &&... args) + template<typename... Args> + void emplace(GrowsBackwardsTag, T *where, Args &&... args) { Q_ASSERT(!this->isShared()); Q_ASSERT(where >= this->begin() && where <= this->end()); @@ -1367,18 +1365,19 @@ public: } - - template <typename iterator, typename ...Args> - void emplace(iterator where, Args&&... args) + template<typename... Args> + void emplace(T *where, Args &&... args) { Q_ASSERT(!this->isShared()); Q_ASSERT(where >= this->begin() && where <= this->end()); Q_ASSERT(this->allocatedCapacity() - this->size >= 1); + const T *begin = this->begin(); + const T *end = this->end(); // Qt5 QList in insert(1): try to move less data around // Now: - const bool shouldInsertAtBegin = (where - this->begin()) < (this->end() - where) - || this->freeSpaceAtEnd() <= 0; + const bool shouldInsertAtBegin = + (where - begin) < (end - where) || this->freeSpaceAtEnd() <= 0; if (this->freeSpaceAtBegin() > 0 && shouldInsertAtBegin) { Base::emplace(GrowsBackwardsTag{}, where, std::forward<Args>(args)...); } else { |