#include #include #include using namespace hgl; template class TestArray { TCB *life_cb; T *items; int count; int alloc_count; private: void Realloc(int new_count) { if(new_countCreate(p); return p; } void Add(T *data,const int num) { int off=count; count+=num; Realloc(count); life_cb->Copy(items+off,data,num); } void Add(T data) { Add(&data,1); } }; template class TestRawArray:public TestArray> { DataLifetimeCallback life_cb; public: TestRawArray():TestArray>(&life_cb){} ~TestRawArray()=default; }; template class TestObject { int value; public: TestObject() { value=0; std::cout<<"TestObject()"< class TestObjectArray:public TestArray> { DefaultObjectLifetimeCallback life_cb; public: TestObjectArray():TestArray>(&life_cb){} virtual ~TestObjectArray() { for(T *p:*this) life_cb.Clear(&p); } T *Create() { T *p; if(!life_cb.Create(&p)) return nullptr; TestArray>::Add(p); return p; } }; void main() { //原生类型测试 { TestRawArray ta_int; ta_int.Add(1); ta_int.Add(2); ta_int.Add(3); *(ta_int.Create())=4; int two[2]={9,0}; ta_int.Add(two,2); std::cout<<"TestArray: "; for(const int val:ta_int) std::cout< ta_ds; DataStruct ds{1,2}; ta_ds.Add(ds); DataStruct *p=ta_ds.Create(); *p={3,4}; DataStruct ds2[2]{{5,6},{7,8}}; ta_ds.Add(ds2,2); std::cout<<"TestArray>: "; for(const DataStruct &ds:ta_ds) std::cout<<"{"<> ta_obj; ta_obj.Add(new TestObject(1)); ta_obj.Add(new TestObject(2)); ta_obj.Add(new TestObject(3)); TestObject *p=ta_obj.Create(); p->Set(4); TestObject *two[2]={new TestObject(9),new TestObject(0)}; ta_obj.Add(two,2); std::cout<<"TestArray>: "; for(TestObject *obj:ta_obj) std::cout<<"{"<Get()<<"} "; std::cout<