aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/SplitVector.h
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2018-04-21 11:22:39 +1000
committerNeil <nyamatongwe@gmail.com>2018-04-21 11:22:39 +1000
commitb9bf45fea55a56203f16a1eea4de7f46d8bbf964 (patch)
tree09cbc057fdb43e61ba703617e19c8b3b341670fb /src/SplitVector.h
parent8634c0958c532e7d219e649353e1f1a74d52da1b (diff)
downloadscintilla-mirror-b9bf45fea55a56203f16a1eea4de7f46d8bbf964.tar.gz
Use noexcept in basic data structures where reasonable.
Declare the standard member functions in more classes
Diffstat (limited to 'src/SplitVector.h')
-rw-r--r--src/SplitVector.h25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/SplitVector.h b/src/SplitVector.h
index 40061c955..39895a700 100644
--- a/src/SplitVector.h
+++ b/src/SplitVector.h
@@ -24,7 +24,7 @@ protected:
/// Move the gap to a particular position so that insertion and
/// deletion at that point will not require much copying and
/// hence be fast.
- void GapTo(ptrdiff_t position) {
+ void GapTo(ptrdiff_t position) noexcept {
if (position != part1Length) {
if (position < part1Length) {
// Moving the gap towards start so moving elements towards end
@@ -56,21 +56,22 @@ protected:
void Init() {
body.clear();
body.shrink_to_fit();
- growSize = 8;
lengthBody = 0;
part1Length = 0;
gapLength = 0;
+ growSize = 8;
}
public:
/// Construct a split buffer.
- SplitVector() : empty() {
- Init();
+ SplitVector() : empty(), lengthBody(0), part1Length(0), gapLength(0), growSize(8) {
}
// Deleted so SplitVector objects can not be copied.
SplitVector(const SplitVector &) = delete;
+ SplitVector(SplitVector &&) = delete;
void operator=(const SplitVector &) = delete;
+ void operator=(SplitVector &&) = delete;
~SplitVector() {
}
@@ -124,7 +125,7 @@ public:
/// Setting positions outside the range of the buffer performs no assignment
/// but asserts in debug builds.
template <typename ParamType>
- void SetValueAt(ptrdiff_t position, ParamType&& v) {
+ void SetValueAt(ptrdiff_t position, ParamType&& v) noexcept {
if (position < part1Length) {
PLATFORM_ASSERT(position >= 0);
if (position < 0) {
@@ -250,14 +251,12 @@ public:
/// Delete one element from the buffer.
void Delete(ptrdiff_t position) {
PLATFORM_ASSERT((position >= 0) && (position < lengthBody));
- if ((position < 0) || (position >= lengthBody)) {
- return;
- }
DeleteRange(position, 1);
}
/// Delete a range from the buffer.
/// Deleting positions outside the current range fails.
+ /// Cannot be noexcept as vector::shrink_to_fit may be called and it may throw.
void DeleteRange(ptrdiff_t position, ptrdiff_t deleteLength) {
PLATFORM_ASSERT((position >= 0) && (position + deleteLength <= lengthBody));
if ((position < 0) || ((position + deleteLength) > lengthBody)) {
@@ -265,8 +264,6 @@ public:
}
if ((position == 0) && (deleteLength == lengthBody)) {
// Full deallocation returns storage and is faster
- body.clear();
- body.shrink_to_fit();
Init();
} else if (deleteLength > 0) {
GapTo(position);
@@ -281,7 +278,7 @@ public:
}
/// Retrieve a range of elements into an array
- void GetRange(T *buffer, ptrdiff_t position, ptrdiff_t retrieveLength) const {
+ void GetRange(T *buffer, ptrdiff_t position, ptrdiff_t retrieveLength) const noexcept {
// Split into up to 2 ranges, before and after the split then use memcpy on each.
ptrdiff_t range1Length = 0;
if (position < part1Length) {
@@ -298,6 +295,8 @@ public:
}
/// Compact the buffer and return a pointer to the first element.
+ /// Also ensures there is an empty element beyond logical end in case its
+ /// passed to a function expecting a NUL terminated string.
T *BufferPointer() {
RoomFor(1);
GapTo(lengthBody);
@@ -308,7 +307,7 @@ public:
/// Return a pointer to a range of elements, first rearranging the buffer if
/// needed to make that range contiguous.
- T *RangePointer(ptrdiff_t position, ptrdiff_t rangeLength) {
+ T *RangePointer(ptrdiff_t position, ptrdiff_t rangeLength) noexcept {
if (position < part1Length) {
if ((position + rangeLength) > part1Length) {
// Range overlaps gap, so move gap to start of range.
@@ -323,7 +322,7 @@ public:
}
/// Return the position of the gap within the buffer.
- ptrdiff_t GapPosition() const {
+ ptrdiff_t GapPosition() const noexcept {
return part1Length;
}
};