array.hpp

Go to the documentation of this file.
00001 /* $Id: array.hpp 17248 2009-08-21 20:21:05Z rubidium $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #ifndef  ARRAY_HPP
00013 #define  ARRAY_HPP
00014 
00015 #include "fixedsizearray.hpp"
00016 
00019 template <class Titem_, int Tblock_size_ = 1024, int Tnum_blocks_ = Tblock_size_>
00020 class CArrayT {
00021 public:
00022   typedef Titem_ Titem; 
00023   typedef CFixedSizeArrayT<Titem_, Tblock_size_> CSubArray; 
00024   typedef CFixedSizeArrayT<CSubArray, Tnum_blocks_> CSuperArray; 
00025 
00026 protected:
00027   CSuperArray     m_a; 
00028 
00029 public:
00030   static const int Tblock_size = Tblock_size_; 
00031   static const int Tnum_blocks = Tnum_blocks_; 
00032   static const int Tcapacity   = Tblock_size * Tnum_blocks; 
00033 
00035   FORCEINLINE CArrayT() { }
00037   FORCEINLINE void Clear() {m_a.Clear();}
00039   FORCEINLINE int Size() const
00040   {
00041     int super_size = m_a.Size();
00042     if (super_size == 0) return 0;
00043     int sub_size = m_a[super_size - 1].Size();
00044     return (super_size - 1) * Tblock_size + sub_size;
00045   }
00047   FORCEINLINE bool IsEmpty() { return m_a.IsEmpty(); }
00049   FORCEINLINE bool IsFull() { return m_a.IsFull() && m_a[Tnum_blocks - 1].IsFull(); }
00051   FORCEINLINE CSubArray& FirstFreeSubArray()
00052   {
00053     int super_size = m_a.Size();
00054     if (super_size > 0) {
00055       CSubArray& sa = m_a[super_size - 1];
00056       if (!sa.IsFull()) return sa;
00057     }
00058     return m_a.Add();
00059   }
00061   FORCEINLINE Titem_& AddNC() { return FirstFreeSubArray().AddNC(); }
00063   FORCEINLINE Titem_& Add()   { return FirstFreeSubArray().Add(); }
00065   FORCEINLINE Titem& operator [] (int idx)
00066   {
00067     CSubArray& sa = m_a[idx / Tblock_size];
00068     Titem& item   = sa [idx % Tblock_size];
00069     return item;
00070   }
00072   FORCEINLINE const Titem& operator [] (int idx) const
00073   {
00074     const CSubArray& sa = m_a[idx / Tblock_size];
00075     const Titem& item   = sa [idx % Tblock_size];
00076     return item;
00077   }
00078 
00079   template <typename D> void Dump(D &dmp) const
00080   {
00081     dmp.WriteLine("capacity = %d", Tcapacity);
00082     int num_items = Size();
00083     dmp.WriteLine("num_items = %d", num_items);
00084     CStrA name;
00085     for (int i = 0; i < num_items; i++) {
00086       const Titem& item = (*this)[i];
00087       name.Format("item[%d]", i);
00088       dmp.WriteStructT(name.Data(), &item);
00089     }
00090   }
00091 };
00092 
00093 #endif /* ARRAY_HPP */

Generated on Tue Jan 5 21:02:54 2010 for OpenTTD by  doxygen 1.5.6