improved Stack<>, use LifetimeCallback

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-08-09 17:13:39 +08:00
parent fda1a60df7
commit e1f6ee9b12
2 changed files with 23 additions and 16 deletions

View File

@ -135,7 +135,7 @@ namespace hgl
if(data_array[read_index].GetCount()>read_offset) //还有没读完的,需要清掉 if(data_array[read_index].GetCount()>read_offset) //还有没读完的,需要清掉
dlc->Clear(data_array[read_index].GetData()+read_offset, dlc->Clear(data_array[read_index].GetData()+read_offset,
data_array[read_index].GetCount()-read_offset); data_array[read_index].GetCount()-read_offset);
} }
data_array[0].Clear(); data_array[0].Clear();
@ -158,10 +158,7 @@ namespace hgl
public: public:
using Queue<T *>::Queue; using Queue<T *>::Queue;
virtual ~ObjectQueue() virtual ~ObjectQueue() override { Free(); }
{
Free();
}
virtual bool Push(T *obj) virtual bool Push(T *obj)
{ {

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include<hgl/type/DataArray.h> #include<hgl/type/DataArray.h>
#include<hgl/type/LifetimeCallback.h>
namespace hgl namespace hgl
{ {
/** /**
@ -75,8 +76,19 @@ namespace hgl
public: public:
virtual void Clear (){data_array.Clear();} ///<清除所有数据 virtual void Clear (DataLifetimeCallback<T> *dlc=nullptr) ///<清除所有数据
virtual void Free (){data_array.Free();} ///<清除所有数据并释放内存 {
if(dlc)
dlc->Clear(data_array.GetData(),data_array.GetCount());
data_array.Clear();
}
virtual void Free (DataLifetimeCallback<T> *dlc=nullptr) ///<清除所有数据并释放内存
{
Clear(dlc);
data_array.Free();
}
virtual void operator =(const DataArray<T> &da) ///<复制一个堆栈 virtual void operator =(const DataArray<T> &da) ///<复制一个堆栈
{ {
@ -90,9 +102,7 @@ namespace hgl
template<typename T> class ObjectStack:public Stack<T *> ///堆栈对象 template<typename T> class ObjectStack:public Stack<T *> ///堆栈对象
{ {
protected: DefaultObjectLifetimeCallback<T> default_olc;
virtual void DeleteObject(T *obj){if(obj)delete obj;}
public: public:
@ -116,17 +126,17 @@ namespace hgl
return obj; return obj;
} }
void Clear() void Clear(ObjectLifetimeCallback<T> *olc=nullptr)
{ {
for(T *obj:data_array) if(!olc)
DeleteObject(obj); olc=&default_olc;
data_array.Clear(); Stack<T *>::Clear(olc);
} }
void Free() void Free(ObjectLifetimeCallback<T> *olc=nullptr)
{ {
ObjectStack<T>::Clear(); ObjectStack<T>::Clear(olc);
data_array.Free(); data_array.Free();
} }