diff --git a/src/misc/array.hpp b/src/misc/array.hpp index 414d3efe00..e4cf194083 100644 --- a/src/misc/array.hpp +++ b/src/misc/array.hpp @@ -19,16 +19,26 @@ * array of fixed size arrays */ template class SmallArray { -public: +protected: typedef FixedSizeArray SubArray; ///< inner array typedef FixedSizeArray SuperArray; ///< outer array -protected: + static const uint Tcapacity = B * N; ///< total max number of items + SuperArray data; ///< array of arrays of items -public: - static const uint Tcapacity = B * N; ///< total max number of items + /** return first sub-array with free space for new item */ + FORCEINLINE SubArray& FirstFreeSubArray() + { + uint super_size = data.Length(); + if (super_size > 0) { + SubArray& s = data[super_size - 1]; + if (!s.IsFull()) return s; + } + return data.AppendC(); + } +public: /** implicit constructor */ FORCEINLINE SmallArray() { } /** Clear (destroy) all items */ @@ -45,16 +55,6 @@ public: FORCEINLINE bool IsEmpty() { return data.IsEmpty(); } /** return true if array is full */ FORCEINLINE bool IsFull() { return data.IsFull() && data[N - 1].IsFull(); } - /** return first sub-array with free space for new item */ - FORCEINLINE SubArray& FirstFreeSubArray() - { - uint super_size = data.Length(); - if (super_size > 0) { - SubArray& s = data[super_size - 1]; - if (!s.IsFull()) return s; - } - return data.AppendC(); - } /** allocate but not construct new item */ FORCEINLINE T& Append() { return FirstFreeSubArray().Append(); } /** allocate and construct new item */ diff --git a/src/misc/fixedsizearray.hpp b/src/misc/fixedsizearray.hpp index bb0316e1de..fc57c79344 100644 --- a/src/misc/fixedsizearray.hpp +++ b/src/misc/fixedsizearray.hpp @@ -20,10 +20,7 @@ * is delayed. */ template struct FixedSizeArray { - /** the only member of fixed size array is pointer to the block - * of C array of items. Header can be found on the offset -sizeof(ArrayHeader). */ - T *data; - +protected: /** header for fixed size array */ struct ArrayHeader { @@ -35,6 +32,20 @@ struct FixedSizeArray { static const uint Tsize = sizeof(T); // size of item static const uint HeaderSize = sizeof(ArrayHeader); // size of header + /** the only member of fixed size array is pointer to the block + * of C array of items. Header can be found on the offset -sizeof(ArrayHeader). */ + T *data; + + /** return reference to the array header (non-const) */ + FORCEINLINE ArrayHeader& Hdr() { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } + /** return reference to the array header (const) */ + FORCEINLINE const ArrayHeader& Hdr() const { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } + /** return reference to the block reference counter */ + FORCEINLINE uint& RefCnt() { return Hdr().reference_count; } + /** return reference to number of used items */ + FORCEINLINE uint& SizeRef() { return Hdr().items; } + +public: /** Default constructor. Preallocate space for items and header, then initialize header. */ FixedSizeArray() { @@ -75,16 +86,6 @@ struct FixedSizeArray { SizeRef() = 0; } -protected: - /** return reference to the array header (non-const) */ - FORCEINLINE ArrayHeader& Hdr() { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } - /** return reference to the array header (const) */ - FORCEINLINE const ArrayHeader& Hdr() const { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } - /** return reference to the block reference counter */ - FORCEINLINE uint& RefCnt() { return Hdr().reference_count; } - /** return reference to number of used items */ - FORCEINLINE uint& SizeRef() { return Hdr().items; } -public: /** return number of used items */ FORCEINLINE uint Length() const { return Hdr().items; } /** return true if array is full */