diff options
Diffstat (limited to 'src/SVector.h')
-rwxr-xr-x | src/SVector.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/SVector.h b/src/SVector.h new file mode 100755 index 0000000..c8edb51 --- /dev/null +++ b/src/SVector.h @@ -0,0 +1,127 @@ +// Scintilla source code edit control +/** @file SVector.h + ** A simple expandable vector. + **/ +// Copyright 1998-2001 by Neil Hodgson <neilh@hare.net.au> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef SVECTOR_H +#define SVECTOR_H + +/** + * A simple expandable integer vector. + * Storage not allocated for elements until an element is used. + * This makes it very lightweight unless used so is a good match for optional features. + */ +class SVector { + enum { allocSize = 4000 }; + + int *v; ///< The vector + unsigned int size; ///< Number of elements allocated + unsigned int len; ///< Number of elements used in vector + bool allocFailure; ///< A memory allocation call has failed + + /** Internally allocate more elements than the user wants + * to avoid thrashing the memory allocator. */ + void SizeTo(int newSize) { + if (newSize < allocSize) + newSize += allocSize; + else + newSize = (newSize * 3) / 2; + int* newv = new int[newSize]; + if (!newv) { + allocFailure = true; + return; + } + size = newSize; + unsigned int i=0; + for (; i<len; i++) { + newv[i] = v[i]; + } + for (; i<size; i++) { + newv[i] = 0; + } + delete []v; + v = newv; + } + +public: + SVector() { + allocFailure = false; + v = 0; + len = 0; + size = 0; + } + ~SVector() { + Free(); + } + /// Constructor from another vector. + SVector(const SVector &other) { + allocFailure = false; + v = 0; + len = 0; + size = 0; + if (other.Length() > 0) { + SizeTo(other.Length()); + if (!allocFailure) { + for (int i=0;i<other.Length();i++) + v[i] = other.v[i]; + len = other.Length(); + } + } + } + /// Copy constructor. + SVector &operator=(const SVector &other) { + if (this != &other) { + delete []v; + allocFailure = false; + v = 0; + len = 0; + size = 0; + if (other.Length() > 0) { + SizeTo(other.Length()); + if (!allocFailure) { + for (int i=0;i<other.Length();i++) + v[i] = other.v[i]; + } + len = other.Length(); + } + } + return *this; + } + /** @brief Accessor. + * Allows to access values from the list, and grows it if accessing + * outside the current bounds. The returned value in this case is 0. */ + int &operator[](unsigned int i) { + if (i >= len) { + if (i >= size) { + SizeTo(i); + } + len = i+1; + } + return v[i]; + } + /// Reset vector. + void Free() { + delete []v; + v = 0; + size = 0; + len = 0; + } + /** @brief Grow vector size. + * Doesn't allow a vector to be shrinked. */ + void SetLength(unsigned int newLength) { + if (newLength > len) { + if (newLength >= size) { + SizeTo(newLength); + } + } + len = newLength; + } + /// Get the current length (number of used elements) of the vector. + int Length() const { + return len; + } +}; + +#endif |