From 4851feb10270f893b09cc03f7297022c942e0d1f Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Sun, 15 Apr 2018 01:12:07 +0200 Subject: Codechange: Add functions to insert and extract an element at a specific position in a SmallVec. --- src/core/smallvec_type.hpp | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp index 8676265d2..588dd599d 100644 --- a/src/core/smallvec_type.hpp +++ b/src/core/smallvec_type.hpp @@ -158,6 +158,23 @@ public: } } + /** + * Insert a new item at a specific position into the vector, moving all following items. + * @param item Position at which the new item should be inserted + * @return pointer to the new item + */ + inline T *Insert(T *item) + { + assert(item >= this->Begin() && item <= this->End()); + + size_t to_move = this->End() - item; + size_t start = item - this->Begin(); + + this->Append(); + if (to_move > 0) MemMoveT(this->Begin() + start + 1, this->Begin() + start, to_move); + return this->Begin() + start; + } + /** * Search for the first occurrence of an item. * The '!=' operator of T is used for comparison. @@ -232,13 +249,24 @@ public: * @param count Number of consecutive items to remove. */ void ErasePreservingOrder(uint pos, uint count = 1) + { + ErasePreservingOrder(this->data + pos, count); + } + + /** + * Remove items from the vector while preserving the order of other items. + * @param item First item to remove. + * @param count Number of consecutive items to remove. + */ + inline void ErasePreservingOrder(T *item, uint count = 1) { if (count == 0) return; - assert(pos < this->items); - assert(pos + count <= this->items); + assert(item >= this->Begin()); + assert(item + count <= this->End()); + this->items -= count; - uint to_move = this->items - pos; - if (to_move > 0) MemMoveT(this->data + pos, this->data + pos + count, to_move); + ptrdiff_t to_move = this->End() - item; + if (to_move > 0) MemMoveT(item, item + count, to_move); } /** -- cgit v1.2.3-54-g00ecf