summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Lutz <michi@icosahedron.de>2018-04-15 01:12:07 +0200
committerMichael Lutz <michi@icosahedron.de>2018-04-15 20:49:29 +0200
commit4851feb10270f893b09cc03f7297022c942e0d1f (patch)
tree1e22454e96a72402cfa23fdc6248538030241be9
parentf240274b7e1d00b9cdfbfa3d91481a3b450137b4 (diff)
downloadopenttd-4851feb10270f893b09cc03f7297022c942e0d1f.tar.xz
Codechange: Add functions to insert and extract an element at a specific position in a SmallVec.
-rw-r--r--src/core/smallvec_type.hpp36
1 files 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
@@ -159,6 +159,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.
* @param item Item to search for
@@ -233,12 +250,23 @@ public:
*/
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);
}
/**