132 lines
2.0 KiB
C++
132 lines
2.0 KiB
C++
#pragma once
|
|
#ifndef __INDEX_H__
|
|
#define __INDEX_H__
|
|
#include <malloc.h>
|
|
//#include <afxmt.h>
|
|
#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 Any>
|
|
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
|
|
|