|
马上注册登录,享用更多网站功能!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Pro/Toolkit 中的ProArray是个基础的东西。
今天花了些时间,用C++模拟了它的实现。
验证一下对象的实现。
希望大家指点。
源码 test.cpp
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include <memory.h>
class ProArray{
public:
ProArray();
~ProArray();
public:
int Alloc(int n_objs,int obj_size,int rellocation_size);
int Free();
int MaxCountGet(int obj_size);
int ObjectAdd(int index,int n_objects,void *pobject);
int ObjectRemove(int index,int n_objects);
int SizeGet();
int SizeSet(int size);
void * operator [](int index);
private:
char *p;
int count;
int size;
int resize;
};
void * ProArray:perator [](int index)
{
if(index >count )
return NULL;
return (p+index*size);
}
ProArray:roArray()
{
p=NULL;
count=0;
size=0;
resize=0;
}
ProArray::~ProArray()
{
Free();
}
int ProArray::Alloc(int n_objs,int obj_size,int re_size)
{
p=(char*)realloc(p,obj_size*n_objs);
if(!p)
return -1;
count=n_objs;
size=obj_size;
resize=re_size;
return 0;
}
int ProArray::Free()
{
if(p)
free((void *)p);
p=NULL;
return 0;
}
int ProArray::MaxCountGet(int obj_size)
{
return (SizeGet()/obj_size);
}
int ProArray::ObjectAdd(int index,int n_objects,void *pobject)
{
char *start=NULL;
char *end=NULL;
start=p+index*size;
end=start+n_objects*size;
if(end > p+SizeGet())
return -1;
memcpy(start,pobject,n_objects*size);
return 0;
}
int ProArray::ObjectRemove(int index,int n_objects)
{
char *start=p+index*size;
char *end=start+n_objects*size;
if(end > p+SizeGet())
return -1;
while (start <= end)
{
*start='\0';
++start;
}
return 0;
}
int ProArray::SizeGet()
{
return (size*count);
}
int ProArray::SizeSet(int size)
{
p=(char *)realloc(p,size);
if(!p)
return -1;
return 0;
}
int main(int argc, char* argv[])
{
char test[6][5]={"abcd","efgh","ijkl","mnop","qr","stu"};
ProArray array;
int i;
array.Alloc(6,5,1);
array.ObjectAdd(0,6,test);
for(i=0;i<array.MaxCountGet(5);i++)
printf("array[%d] is %s.\n",i,array[i]);
array.ObjectRemove(3,3);
for(i=0;i<array.MaxCountGet(5);i++)
printf("array[%d] is %s.\n",i,array[i]);
return 0;
}
运行结果如下: |
|