#pragma once #ifndef __INDEX_H__ #define __INDEX_H__ #include //#include #define foreach(variable,counter,index) for (size_t counter=0 ; counter < index.Size ; counter++) if (variable=index[counter]) #define foreachp(variable,counter,index) for (size_t counter=0 ; counter < index->Size ; counter++) if (variable=(*index)[counter]) template class CIndex { public: CIndex() { Size=0; List=0; } CIndex(size_t InitialSize) { Size=0; List=0; Resize(InitialSize); } ~CIndex() {// user is responsible for managing elements CLock(&CS,true); if (List) Free(List); List=0; Size=0; } void Clear() { CLock(&CS,true); for (size_t i = 0 ; i < Size ; i++) { if (List[i]) { List[i]=0; } } } void Cleanup() { CLock(&CS,true); for (size_t i = 0 ; i < Size ; i++) { if (List[i]) { delete List[i]; List[i]=0; } } } void Resize(size_t NewSize) { CLock(&CS,true); if (List) { if (NewSize>Size) { // because we want to zero out the unused portions, we wont use realloc Any *NewList=(Any*)Malloc(NewSize*sizeof(Any)); memset(NewList,0,NewSize*sizeof(Any)); memcpy(NewList,List,Size*sizeof(Any)); Free(List); List=NewList; Size=NewSize; } } else { List=(Any*)Malloc(NewSize*sizeof(Any)); memset(List,0,NewSize*sizeof(Any)); Size=NewSize; } } // gets the next unused index, resizing if necessary inline size_t GetUnused() { CLock(&CS,true); size_t i; for ( i = 0 ; i < Size ; i++) { if (!List[i]) return i; } Resize(Size+10); return i; } size_t Count() { CLock(&CS,true); size_t ret=0; for (size_t i = 0 ; i < Size ; i++) { if (List[i]) ret++; } return ret; } virtual void *Malloc(size_t _Size) { return malloc(_Size); } virtual void Free(const void *mem) { free((void*)mem); } size_t Size; Any *List; inline Any& operator+=(Any& Value){return List[GetUnused()]=Value;} inline Any& operator[](size_t Index){return List[Index];} CSemaphore CS; }; #endif