summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorskidd13 <skidd13@openttd.org>2008-06-19 10:19:02 +0000
committerskidd13 <skidd13@openttd.org>2008-06-19 10:19:02 +0000
commit2f65d35ead535a16e418f9dbf64468c7141519d8 (patch)
tree60ef81ba2a70923661577658f6b89c7e0df8ef16 /src/core
parentc4cc5cdf3b2f8f349c723de98538adec45db9c55 (diff)
downloadopenttd-2f65d35ead535a16e418f9dbf64468c7141519d8.tar.xz
(svn r13575) -Codechange: Move small vector to core since it fits better in there
-Codechange: convert smallvector from struct to class
Diffstat (limited to 'src/core')
-rw-r--r--src/core/smallvec_type.hpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp
new file mode 100644
index 000000000..ce41af9fd
--- /dev/null
+++ b/src/core/smallvec_type.hpp
@@ -0,0 +1,165 @@
+/* $Id$ */
+
+/** @file smallvec_type.hpp Simple vector class that allows allocating an item without the need to copy this->data needlessly. */
+
+#ifndef SMALLVEC_TYPE_HPP
+#define SMALLVEC_TYPE_HPP
+
+#include "alloc_func.hpp"
+#include "math_func.hpp"
+
+/**
+ * Simple vector template class.
+ *
+ * @note There are no asserts in the class so you have
+ * to care about that you grab an item which is
+ * inside the list.
+ *
+ * @param T The type of the items stored
+ * @param S The steps of allocation
+ */
+template <typename T, uint S>
+class SmallVector {
+protected:
+ T *data; ///< The pointer to the first item
+ uint items; ///< The number of items stored
+ uint capacity; ///< The avalible space for storing items
+
+public:
+ SmallVector() : data(NULL), items(0), capacity(0) { }
+
+ ~SmallVector()
+ {
+ free(this->data);
+ }
+
+ /**
+ * Remove all items from the list.
+ */
+ void Clear()
+ {
+ /* In fact we just reset the item counter avoiding the need to
+ * probably reallocate the same amount of memory the list was
+ * previously using. */
+ this->items = 0;
+ }
+
+ /**
+ * Compact the list down to the smallest block size boundary.
+ */
+ void Compact()
+ {
+ uint capacity = Align(this->items, S);
+ if (capacity >= this->capacity) return;
+
+ this->capacity = capacity;
+ this->data = ReallocT(this->data, this->capacity);
+ }
+
+ /**
+ * Append an item and return it.
+ */
+ T *Append()
+ {
+ if (this->items == this->capacity) {
+ this->capacity += S;
+ this->data = ReallocT(this->data, this->capacity);
+ }
+
+ return &this->data[this->items++];
+ }
+
+ /**
+ * Get the number of items in the list.
+ */
+ uint Length() const
+ {
+ return this->items;
+ }
+
+ /**
+ * Get the pointer to the first item (const)
+ *
+ * @return the pointer to the first item
+ */
+ const T *Begin() const
+ {
+ return this->data;
+ }
+
+ /**
+ * Get the pointer to the first item
+ *
+ * @return the pointer to the first item
+ */
+ T *Begin()
+ {
+ return this->data;
+ }
+
+ /**
+ * Get the pointer behind the last valid item (const)
+ *
+ * @return the pointer behind the last valid item
+ */
+ const T *End() const
+ {
+ return &this->data[this->items];
+ }
+
+ /**
+ * Get the pointer behind the last valid item
+ *
+ * @return the pointer behind the last valid item
+ */
+ T *End()
+ {
+ return &this->data[this->items];
+ }
+
+ /**
+ * Get the pointer to item "number" (const)
+ *
+ * @param index the position of the item
+ * @return the pointer to the item
+ */
+ const T *Get(uint index) const
+ {
+ return &this->data[index];
+ }
+
+ /**
+ * Get the pointer to item "number"
+ *
+ * @param index the position of the item
+ * @return the pointer to the item
+ */
+ T *Get(uint index)
+ {
+ return &this->data[index];
+ }
+
+ /**
+ * Get item "number" (const)
+ *
+ * @param index the positon of the item
+ * @return the item
+ */
+ const T &operator[](uint index) const
+ {
+ return this->data[index];
+ }
+
+ /**
+ * Get item "number"
+ *
+ * @param index the positon of the item
+ * @return the item
+ */
+ T &operator[](uint index)
+ {
+ return this->data[index];
+ }
+};
+
+#endif /* SMALLVEC_TYPE_HPP */