diff options
Diffstat (limited to 'crawl-ref/source/FixVec.h')
-rw-r--r-- | crawl-ref/source/FixVec.h | 96 |
1 files changed, 47 insertions, 49 deletions
diff --git a/crawl-ref/source/FixVec.h b/crawl-ref/source/FixVec.h index b0afb34e82..176ced5cf4 100644 --- a/crawl-ref/source/FixVec.h +++ b/crawl-ref/source/FixVec.h @@ -12,7 +12,8 @@ #ifndef FIXVEC_H #define FIXVEC_H -#include <stdarg.h> +#include <cstdarg> +#include <cstring> #include "debug.h" @@ -39,16 +40,6 @@ public: typedef TYPE* iterator; typedef const TYPE* const_iterator; -#if 0 -#if MSVC >= 1100 - typedef std::reverse_iterator<const_iterator, const TYPE> const_reverse_iterator; - typedef std::reverse_iterator<iterator, TYPE> reverse_iterator; -#else - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - typedef std::reverse_iterator<iterator> reverse_iterator; -#endif -#endif - //----------------------------------- // Initialization/Destruction // @@ -57,6 +48,10 @@ public: FixedVector() {} + FixedVector(TYPE def) : mData() { + init(def); + } + FixedVector(TYPE value0, TYPE value1, ...); // Allows for something resembling C array initialization, eg // instead of "int a[3] = {0, 1, 2}" you'd use "FixedVector<int, 3> @@ -71,35 +66,31 @@ public: // API // public: - // ----- Size ----- - bool empty() const {return SIZE == 0;} - int size() const {return SIZE;} - - // ----- Access ----- - TYPE& operator[](unsigned long index) {ASSERT(index < SIZE); return mData[index];} - const TYPE& operator[](unsigned long index) const {ASSERT(index < SIZE); return mData[index];} - - TYPE& front() {ASSERT(SIZE > 0); return mData[0];} - const TYPE& front() const {ASSERT(SIZE > 0); return mData[0];} - - TYPE& back() {ASSERT(SIZE > 0); return mData[SIZE - 1];} - const TYPE& back() const {ASSERT(SIZE > 0); return mData[SIZE - 1];} - - TYPE* buffer() {return mData;} - const TYPE* buffer() const {return mData;} - - // ----- Iterating ----- - iterator begin() {return mData;} - const_iterator begin() const {return mData;} - - iterator end() {return this->begin() + this->size();} - const_iterator end() const {return this->begin() + this->size();} - -// reverse_iterator rbegin() {return reverse_iterator(this->end());} -// const_reverse_iterator rbegin() const {return const_reverse_iterator(this->end());} - -// reverse_iterator rend() {return reverse_iterator(this->begin());} -// const_reverse_iterator rend() const {return const_reverse_iterator(this->begin());} +// ----- Size ----- + bool empty() const {return SIZE == 0;} + size_t size() const {return SIZE;} + +// ----- Access ----- + TYPE& operator[](unsigned long index) {ASSERT(index < SIZE); return mData[index];} + const TYPE& operator[](unsigned long index) const {ASSERT(index < SIZE); return mData[index];} + + TYPE& front() {ASSERT(SIZE > 0); return mData[0];} + const TYPE& front() const {ASSERT(SIZE > 0); return mData[0];} + + TYPE& back() {ASSERT(SIZE > 0); return mData[SIZE - 1];} + const TYPE& back() const {ASSERT(SIZE > 0); return mData[SIZE - 1];} + + TYPE* buffer() {return mData;} + const TYPE* buffer() const {return mData;} + +// ----- Iterating ----- + iterator begin() {return mData;} + const_iterator begin() const {return mData;} + + iterator end() {return this->begin() + this->size();} + const_iterator end() const {return this->begin() + this->size();} + + void init(TYPE def); //----------------------------------- // Member Data @@ -115,19 +106,26 @@ protected: template <class TYPE, int SIZE> FixedVector<TYPE, SIZE>::FixedVector(TYPE value0, TYPE value1, ...) { - mData[0] = value0; - mData[1] = value1; + mData[0] = value0; + mData[1] = value1; + + va_list ap; + va_start(ap, value1); // second argument is last fixed parameter - va_list ap; - va_start(ap, value1); // second argument is last fixed parameter + for (int index = 2; index < SIZE; index++) { + TYPE value = va_arg(ap, TYPE); - for (int index = 2; index < SIZE; index++) { - TYPE value = va_arg(ap, TYPE); + mData[index] = value; + } - mData[index] = value; - } + va_end(ap); +} - va_end(ap); +template <class TYPE, int SIZE> +void FixedVector<TYPE, SIZE>::init(TYPE def) +{ + for (int i = 0; i < SIZE; ++i) + mData[i] = def; } #endif // FIXVEC_H |