summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/fixedvector.h
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-15 19:33:08 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-15 19:33:39 +0100
commit842b2c91c85eadf3e9a62d35f359bd7bc50f679e (patch)
tree163fb7ebf93aace86a1a7769b45eebf8ea1513b1 /crawl-ref/source/fixedvector.h
parent222de20491cc2c23765c3b3a7a3b9cfa8b68acd7 (diff)
downloadcrawl-ref-842b2c91c85eadf3e9a62d35f359bd7bc50f679e.tar.gz
crawl-ref-842b2c91c85eadf3e9a62d35f359bd7bc50f679e.zip
Rename fixary.h and fixvec.h.
Diffstat (limited to 'crawl-ref/source/fixedvector.h')
-rw-r--r--crawl-ref/source/fixedvector.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/crawl-ref/source/fixedvector.h b/crawl-ref/source/fixedvector.h
new file mode 100644
index 0000000000..3afacd0898
--- /dev/null
+++ b/crawl-ref/source/fixedvector.h
@@ -0,0 +1,121 @@
+/*
+ * File: fixedvector.h
+ * Summary: Fixed size vector class that asserts if you do something bad.
+ * Written by: Jesse Jones
+ */
+
+#ifndef FIXVEC_H
+#define FIXVEC_H
+
+#include <cstdarg>
+#include <cstring>
+
+#include "debug.h"
+// ==========================================================================
+// class FixedVector
+// ==========================================================================
+
+template <class TYPE, int SIZE> class FixedVector
+{
+
+//-----------------------------------
+// Types
+//
+public:
+ typedef TYPE value_type;
+ typedef TYPE& reference;
+ typedef const TYPE& const_reference;
+ typedef TYPE* pointer;
+ typedef const TYPE* const_pointer;
+
+ typedef unsigned long size_type;
+ typedef long difference_type;
+
+ typedef TYPE* iterator;
+ typedef const TYPE* const_iterator;
+
+//-----------------------------------
+// Initialization/Destruction
+//
+public:
+ ~FixedVector() {}
+
+ 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>
+ // a(0, 1, 2)". Note that there must be SIZE arguments.
+
+//-----------------------------------
+// API
+//
+public:
+ // ----- 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];
+ }
+
+ const TYPE* buffer() const { return mData; }
+ TYPE* buffer() { 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(const TYPE& def);
+
+//-----------------------------------
+// Member Data
+//
+protected:
+ TYPE mData[SIZE];
+};
+
+
+// ==========================================================================
+// Outlined Methods
+// ==========================================================================
+template <class TYPE, int SIZE>
+FixedVector<TYPE, SIZE>::FixedVector(TYPE value0, TYPE value1, ...)
+{
+ mData[0] = value0;
+ mData[1] = value1;
+
+ 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);
+ mData[index] = value;
+ }
+
+ va_end(ap);
+}
+
+template <class TYPE, int SIZE>
+void FixedVector<TYPE, SIZE>::init(const TYPE& def)
+{
+ for (int i = 0; i < SIZE; ++i)
+ mData[i] = def;
+}
+
+#endif // FIXVEC_H