# HG changeset patch # User skidd13 # Date 2008-06-19 10:19:02 # Node ID 95ac8b32acff353830de768c8dc14f63c53e4f0c # Parent d4700a1ff7c1f7ddf788e05ea2aa0a8553fe2a7b (svn r13575) -Codechange: Move small vector to core since it fits better in there -Codechange: convert smallvector from struct to class diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj --- a/projects/openttd_vs80.vcproj +++ b/projects/openttd_vs80.vcproj @@ -1452,6 +1452,10 @@ > + + @@ -2404,10 +2408,6 @@ > - - diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj --- a/projects/openttd_vs90.vcproj +++ b/projects/openttd_vs90.vcproj @@ -1449,6 +1449,10 @@ > + + @@ -2401,10 +2405,6 @@ > - - diff --git a/source.list b/source.list --- a/source.list +++ b/source.list @@ -288,6 +288,7 @@ signs_func.h signs_type.h slope_func.h slope_type.h +core/smallvec_type.hpp core/sort_func.hpp sortlist_type.h sound_func.h @@ -552,7 +553,6 @@ misc/dbg_helpers.cpp misc/dbg_helpers.h misc/fixedsizearray.hpp misc/hashtable.hpp -misc/smallvec.h misc/str.hpp misc/strapi.hpp diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp new file mode 100644 --- /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 +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 */ diff --git a/src/fios.h b/src/fios.h --- a/src/fios.h +++ b/src/fios.h @@ -6,7 +6,7 @@ #define FIOS_H #include "strings_type.h" -#include "misc/smallvec.h" +#include "core/smallvec_type.hpp" enum { /** diff --git a/src/misc/smallvec.h b/src/misc/smallvec.h deleted file mode 100644 --- a/src/misc/smallvec.h +++ /dev/null @@ -1,163 +0,0 @@ -/* $Id$ */ - -/** @file smallvec.h Simple vector class that allows allocating an item without the need to copy this->data needlessly. */ - -#ifndef SMALLVEC_H -#define SMALLVEC_H - -#include "../core/alloc_func.hpp" -#include "../core/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 -struct SmallVector { - T *data; ///< The pointer to the first item - uint items; ///< The number of items stored - uint capacity; ///< The avalible space for storing items - - 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_H */ diff --git a/src/sortlist_type.h b/src/sortlist_type.h --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -9,7 +9,7 @@ #include "core/bitmath_func.hpp" #include "core/mem_func.hpp" #include "core/sort_func.hpp" -#include "misc/smallvec.h" +#include "core/smallvec_type.hpp" #include "date_type.h" enum SortListFlags { diff --git a/src/vehiclelist.h b/src/vehiclelist.h --- a/src/vehiclelist.h +++ b/src/vehiclelist.h @@ -5,7 +5,7 @@ #ifndef VEHICLELIST_H #define VEHICLELIST_H -#include "misc/smallvec.h" +#include "core/smallvec_type.hpp" typedef SmallVector VehicleList; diff --git a/src/viewport.cpp b/src/viewport.cpp --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -44,7 +44,7 @@ #include "settings_type.h" #include "station_func.h" #include "core/alloc_type.hpp" -#include "misc/smallvec.h" +#include "core/smallvec_type.hpp" #include "window_func.h" #include "tilehighlight_func.h" #include "window_gui.h"