diff options
author | skidd13 <skidd13@openttd.org> | 2008-06-19 10:19:02 +0000 |
---|---|---|
committer | skidd13 <skidd13@openttd.org> | 2008-06-19 10:19:02 +0000 |
commit | 2f65d35ead535a16e418f9dbf64468c7141519d8 (patch) | |
tree | 60ef81ba2a70923661577658f6b89c7e0df8ef16 /src/core | |
parent | c4cc5cdf3b2f8f349c723de98538adec45db9c55 (diff) | |
download | openttd-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.hpp | 165 |
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 */ |