From e1f6ee9b12e91b2184ab14f3cb1d7cc895886900 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Wed, 9 Aug 2023 17:13:39 +0800 Subject: [PATCH] improved Stack<>, use LifetimeCallback --- inc/hgl/type/Queue.h | 7 ++----- inc/hgl/type/Stack.h | 32 +++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/inc/hgl/type/Queue.h b/inc/hgl/type/Queue.h index 3711f66..855bc19 100644 --- a/inc/hgl/type/Queue.h +++ b/inc/hgl/type/Queue.h @@ -135,7 +135,7 @@ namespace hgl if(data_array[read_index].GetCount()>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(); @@ -158,10 +158,7 @@ namespace hgl public: using Queue::Queue; - virtual ~ObjectQueue() - { - Free(); - } + virtual ~ObjectQueue() override { Free(); } virtual bool Push(T *obj) { diff --git a/inc/hgl/type/Stack.h b/inc/hgl/type/Stack.h index a304bb4..cd65142 100644 --- a/inc/hgl/type/Stack.h +++ b/inc/hgl/type/Stack.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace hgl { /** @@ -75,8 +76,19 @@ namespace hgl public: - virtual void Clear (){data_array.Clear();} ///<清除所有数据 - virtual void Free (){data_array.Free();} ///<清除所有数据并释放内存 + virtual void Clear (DataLifetimeCallback *dlc=nullptr) ///<清除所有数据 + { + if(dlc) + dlc->Clear(data_array.GetData(),data_array.GetCount()); + + data_array.Clear(); + } + + virtual void Free (DataLifetimeCallback *dlc=nullptr) ///<清除所有数据并释放内存 + { + Clear(dlc); + data_array.Free(); + } virtual void operator =(const DataArray &da) ///<复制一个堆栈 { @@ -90,9 +102,7 @@ namespace hgl template class ObjectStack:public Stack ///堆栈对象 { - protected: - - virtual void DeleteObject(T *obj){if(obj)delete obj;} + DefaultObjectLifetimeCallback default_olc; public: @@ -116,17 +126,17 @@ namespace hgl return obj; } - void Clear() + void Clear(ObjectLifetimeCallback *olc=nullptr) { - for(T *obj:data_array) - DeleteObject(obj); + if(!olc) + olc=&default_olc; - data_array.Clear(); + Stack::Clear(olc); } - void Free() + void Free(ObjectLifetimeCallback *olc=nullptr) { - ObjectStack::Clear(); + ObjectStack::Clear(olc); data_array.Free(); }