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