//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #include <windows.h> #include <stdio.h> template <class T, int nBlockSize, int nMaxBlocks> class BlockArray { public: BlockArray() { nCount = nBlocks = 0; } ~BlockArray() { GetBlocks(0); } T& operator[] (int iIndex); void SetCount(int nObjects); int GetCount() { return nCount; } private: T * Blocks[nMaxBlocks+1]; short nCount; short nBlocks; void GetBlocks(int nNewBlocks); }; /* template <class T, int nBlockSize, int nMaxBlocks> BlockArray<T,BlockSize,nMaxBlocks>::BlockArray() { nCount = nBlocks = 0; } template <class T, int nBlockSize, int nMaxBlocks> BlockArray<T,BlockSize,nMaxBlocks>::~BlockArray() { GetBlocks(0); // free blocks } */ template <class T, int nBlockSize, int nMaxBlocks> void BlockArray<T,nBlockSize,nMaxBlocks>:: GetBlocks(int nNewBlocks) { for(int i = nBlocks; i < nNewBlocks; i++) { Blocks[i] = new T[nBlockSize]; } for(i = nNewBlocks; i < nBlocks; i++) { delete[] Blocks[i]; } nBlocks = nNewBlocks; } template <class T, int nBlockSize, int nMaxBlocks> void BlockArray<T,nBlockSize,nMaxBlocks>:: SetCount(int nObjects) { if(nObjects == nCount) return; // find the number of blocks required by nObjects int nNewBlocks = (nObjects / nBlockSize) + 1; if(nNewBlocks != nBlocks) GetBlocks(nNewBlocks); nCount = nObjects; } template <class T, int nBlockSize, int nMaxBlocks> T& BlockArray<T,nBlockSize,nMaxBlocks>::operator[] (int iIndex) { if(iIndex >= nCount) SetCount(iIndex+1); return Blocks[iIndex / nBlockSize][iIndex % nBlockSize]; } typedef struct { char Name[128]; int iValue; } Buffy; void main(void) { BlockArray<Buffy, 16, 16> Buffies; for(int i = 0; i < 256; i++) { Buffies[i].iValue = i; strcpy(Buffies[i].Name, "Buk bUk buK"); } for(i = 0; i < 256; i++) { printf("%d: %s\n", Buffies[i].iValue, Buffies[i].Name); } Buffies.SetCount(10); }