From b458c22e5421f4d0fd23cdf14c072d132a820937 Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Fri, 24 Sep 2010 15:25:26 +1000 Subject: Added GetRange method to SplitVector as fast way to retrieve elements. --- src/SplitVector.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'src/SplitVector.h') diff --git a/src/SplitVector.h b/src/SplitVector.h index 2c5c7a1d0..2e17ba3dc 100644 --- a/src/SplitVector.h +++ b/src/SplitVector.h @@ -238,6 +238,23 @@ public: DeleteRange(0, lengthBody); } + // Retrieve a range of elemetns into an array + void GetRange(T *buffer, int position, int retrieveLength) const { + // Split into up to 2 ranges, before and after the split then use memcpy on each. + int range1Length = 0; + if (position < part1Length) { + int part1AfterPosition = part1Length - position; + range1Length = retrieveLength; + if (range1Length > part1AfterPosition) + range1Length = part1AfterPosition; + } + memcpy(buffer, body + position, range1Length * sizeof(T)); + buffer += range1Length; + position = position + range1Length + gapLength; + int range2Length = retrieveLength - range1Length; + memcpy(buffer, body + position, range2Length * sizeof(T)); + } + T *BufferPointer() { RoomFor(1); GapTo(lengthBody); -- cgit v1.2.3