- Moderatör
- #1
#Ri
Coder
C:
template<class T>
class Vector
{
public:
void InitVec(int _max = 255)
{
maxcount = _max;
count = 0;
items = (T**)malloc(sizeof(T*) * maxcount);
for (auto i = 0; i < 255; i++)
items[i] = 0;
}
void AddItem(T* item)
{
if (count >= maxcount)
return;
for (auto i = 0; i < maxcount; i++)
if (items[i] == 0)
{
items[i] = item;
count++;
break;
}
}
void UnlinkItem(T* item)
{
for (auto i = 0; i < count; i++)
if (items[i] == item)
{
items[i] = 0;
count--;
}
}
T* Get(int index)
{
if (index <= count && items[index] != 0)
return items[index];
return 0;
}
T* Get()
{
for (auto i = 0; i < maxcount; i++)
if (items[i] != 0)
return items[i];
return 0;
}
T* GetAndUnlink()
{
for (auto i = 0; i < count; i++)
if (items[i] != 0)
{
T* it = items[i];
items[i] = 0;
count--;
return it;
}
return 0;
}
int Size()
{
return count;
}
void Clear()
{
for (auto i = 0; i < count; i++)
if (items[i] != 0)
{
free(items[i]);
items[i] = 0;
}
count = 0;
}
private:
T** items = NULL;
int count = 0, maxcount = 0;
};
Usage
C:
struct my_struct
{
bool a;
int b;
};
Vector<my_struct> my_vec;
void sync_main_thread()
{
my_vec.InitVec(100);
auto i = 0;
for(;;)
{
if(i >= 100)
i=0;
my_struct* pStruct = (my_struct*)malloc(sizeof(my_struct));
pStruct->a = false;
pStruct->b = i;
my_vec.AddItem(pStruct);
i++;
}
}
void sync_proc()
{
for (auto it = my_vec.GetAndUnlink(); (it); it = my_vec.GetAndUnlink())
{
if(it->a)
it->b++;
free(it);
}
}
void normal()
{
my_vec.InitVec(10);
my_struct* pStruct = (my_struct*)malloc(sizeof(my_struct));
pStruct->a = false;
pStruct->b = i;
my_vec.AddItem(pStruct);
}
void normal_usage()
{
if(!my_vec.Get(0)->a)
return;
//...
}