# array.hpp

Go to the documentation of this file.

    00001 /* $Id: array.hpp 12971 2008-05-06 15:11:33Z rubidium $ */
    00002
    00005 #ifndef  ARRAY_HPP
    00006 #define  ARRAY_HPP
    00007
    00008 #include "fixedsizearray.hpp"
    00009
    00012 template <class Titem_, int Tblock_size_ = 1024, int Tnum_blocks_ = Tblock_size_>
    00013 class CArrayT {
    00014 public:
    00015   typedef Titem_ Titem;
    00016   typedef CFixedSizeArrayT<Titem_, Tblock_size_> CSubArray;
    00017   typedef CFixedSizeArrayT<CSubArray, Tnum_blocks_> CSuperArray;
    00018
    00019 protected:
    00020   CSuperArray     m_a;
    00021
    00022 public:
    00023   static const int Tblock_size = Tblock_size_;
    00024   static const int Tnum_blocks = Tnum_blocks_;
    00025   static const int Tcapacity   = Tblock_size * Tnum_blocks;
    00026
    00028   FORCEINLINE CArrayT() { }
    00030   FORCEINLINE void Clear() {m_a.Clear();}
    00032   FORCEINLINE int Size() const
    00033   {
    00034     int super_size = m_a.Size();
    00035     if (super_size == 0) return 0;
    00036     int sub_size = m_a[super_size - 1].Size();
    00037     return (super_size - 1) * Tblock_size + sub_size;
    00038   }
    00040   FORCEINLINE bool IsEmpty() { return m_a.IsEmpty(); }
    00042   FORCEINLINE bool IsFull() { return m_a.IsFull() && m_a[Tnum_blocks - 1].IsFull(); }
    00044   FORCEINLINE CSubArray& FirstFreeSubArray()
    00045   {
    00046     int super_size = m_a.Size();
    00047     if (super_size > 0) {
    00048       CSubArray& sa = m_a[super_size - 1];
    00049       if (!sa.IsFull()) return sa;
    00050     }
    00051     return m_a.Add();
    00052   }
    00054   FORCEINLINE Titem_& AddNC() { return FirstFreeSubArray().AddNC(); }
    00056   FORCEINLINE Titem_& Add()   { return FirstFreeSubArray().Add(); }
    00058   FORCEINLINE Titem& operator [] (int idx)
    00059   {
    00060     CSubArray& sa = m_a[idx / Tblock_size];
    00061     Titem& item   = sa [idx % Tblock_size];
    00062     return item;
    00063   }
    00065   FORCEINLINE const Titem& operator [] (int idx) const
    00066   {
    00067     const CSubArray& sa = m_a[idx / Tblock_size];
    00068     const Titem& item   = sa [idx % Tblock_size];
    00069     return item;
    00070   }
    00071
    00072   template <typename D> void Dump(D &dmp) const
    00073   {
    00074     dmp.WriteLine("capacity = %d", Tcapacity);
    00075     int num_items = Size();
    00076     dmp.WriteLine("num_items = %d", num_items);
    00077     CStrA name;
    00078     for (int i = 0; i < num_items; i++) {
    00079       const Titem& item = (*this)[i];
    00080       name.Format("item[%d]", i);
    00081       dmp.WriteStructT(name.Data(), &item);
    00082     }
    00083   }
    00084 };
    00085
    00086 #endif /* ARRAY_HPP */