diff -r b7aee952682d -r e1905dacc378 src/misc/array.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/misc/array.hpp Sat Jan 13 13:33:36 2007 +0000 @@ -0,0 +1,71 @@ +/* $Id$ */ + +#ifndef ARRAY_HPP +#define ARRAY_HPP + +#include "fixedsizearray.hpp" + +/** Flexible array with size limit. Implemented as fixed size + * array of fixed size arrays */ +template +class CArrayT { +public: + typedef Titem_ Titem; ///< Titem is now visible from outside + typedef CFixedSizeArrayT CSubArray; ///< inner array + typedef CFixedSizeArrayT CSuperArray; ///< outer array + +protected: + CSuperArray m_a; ///< array of arrays of items + +public: + static const int Tblock_size = Tblock_size_; ///< block size is now visible from outside + static const int Tnum_blocks = Tnum_blocks_; ///< number of blocks is now visible from outside + static const int Tcapacity = Tblock_size * Tnum_blocks; ///< total max number of items + + /** implicit constructor */ + FORCEINLINE CArrayT() { } + /** Clear (destroy) all items */ + FORCEINLINE void Clear() {m_a.Clear();} + /** Return actual number of items */ + FORCEINLINE int Size() const + { + int super_size = m_a.Size(); + if (super_size == 0) return 0; + int sub_size = m_a[super_size - 1].Size(); + return (super_size - 1) * Tblock_size + sub_size; + } + /** return true if array is empty */ + FORCEINLINE bool IsEmpty() { return m_a.IsEmpty(); } + /** return true if array is full */ + FORCEINLINE bool IsFull() { return m_a.IsFull() && m_a[Tnum_blocks - 1].IsFull(); } + /** return first sub-array with free space for new item */ + FORCEINLINE CSubArray& FirstFreeSubArray() + { + int super_size = m_a.Size(); + if (super_size > 0) { + CSubArray& sa = m_a[super_size - 1]; + if (!sa.IsFull()) return sa; + } + return m_a.Add(); + } + /** allocate but not construct new item */ + FORCEINLINE Titem_& AddNC() { return FirstFreeSubArray().AddNC(); } + /** allocate and construct new item */ + FORCEINLINE Titem_& Add() { return FirstFreeSubArray().Add(); } + /** indexed access (non-const) */ + FORCEINLINE Titem& operator [] (int idx) + { + CSubArray& sa = m_a[idx / Tblock_size]; + Titem& item = sa [idx % Tblock_size]; + return item; + } + /** indexed access (const) */ + FORCEINLINE const Titem& operator [] (int idx) const + { + CSubArray& sa = m_a[idx / Tblock_size]; + Titem& item = sa [idx % Tblock_size]; + return item; + } +}; + +#endif /* ARRAY_HPP */