Changeset - r22806:526c0a92e6b9
[Not reviewed]
master
0 1 0
Michael Lutz - 6 years ago 2018-04-14 23:12:07
michi@icosahedron.de
Codechange: Add functions to insert and extract an element at a specific position in a SmallVec.
1 file changed with 32 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/core/smallvec_type.hpp
Show inline comments
 
@@ -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);
 
	}
 

	
 
	/**
0 comments (0 inline, 0 general)