commit 2025-09-13 23:44 complete ZtCFreeHeapSngl< ZNsConst::CI_ListKind_Single > in ZCppMain/ZtCSimList.H

This commit is contained in:
2025-09-13 23:44:19 +09:00
parent 602f35faba
commit ca20ff4850
3 changed files with 556 additions and 932 deletions

View File

@ -3799,11 +3799,11 @@ namespace ZNsMain
public:
template<typename TDblList> class ZtCBody
template<typename TLinkList> class ZtCBody
{
public:
typedef typename TDblList::ZCLink ZCLink ;
typedef typename TDblList::TypeSize TypeSize;
typedef typename TLinkList::ZCLink ZCLink ;
typedef typename TLinkList::TypeSize TypeSize;
public:
void RecvFreeIn(ZCLink* AP_CutLink){}
@ -3863,7 +3863,7 @@ namespace ZNsMain
TypeSize GetHeapSize() const*/
};/*
template<typename TDblList> class ZtCBody*/
template<typename TLinkList> class ZtCBody*/
public:
@ -3875,6 +3875,322 @@ namespace ZNsMain
namespace ZNsIFace*/
namespace ZNsIFaceEx
{
/*################################################################
■ 자료 구조에서 자유 기억 공간을 구현하는 interface
만약 다르게 구헌한 자유 기억 공간 class 가 필요하다면,
단방향 연결 리스트는 ZtCFreeHeapSngl<> 를 통해 중첩 정의하고,
양방향 연결 리스트는 ZtCFreeHeapCDL <> 를 통해 중첩 정의하자.
이렇게 하면,
ZtCFreeHeapSngl<>::ZCLink 와 ZtCFreeHeapCDL<>::ZCLink
에서 friend 선언을 아래처럼 고정시켜 놓을 수 있다.
template<int>
friend class ZNsIFaceEx::ZtCFreeHeapSngl ;
################################################################*/
template<int TTypIListKind=0> class ZtCFreeHeapSngl // Single List
{
public:
template<typename TSnglList> class ZtCBody
{
public:
typedef typename TSnglList::ZCLink ZCLink ;
typedef typename TSnglList::TypeSize TypeSize;
public:
void RecvFreeIn(ZCLink* AP_CutLink){delete AP_CutLink;}
void RecvFreeIn ///////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr();
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
///////////////////////////////////////////////////////
ZCLink* SendFreeOut(){return new ZCLink;}
void SendFreeOut ///////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
///////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}
///////////////////////////////////////////////////////
void SendFreeOutCopy /*////////////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊.
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink( **AP_LinkOrgin );
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
void SendFreeOutCopy //////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
void DeleteHeap(){}
TypeSize GetUseHeapSize() const
{
return 0;
}/*
TypeSize GetUseHeapSize() const*/
TypeSize GetAllHeapSize() const
{
return 0;
}/*
TypeSize GetAllHeapSize() const*/
TypeSize size() const
{
return GetUseHeapSize();
}/*
TypeSize GetHeapSize() const*/
TypeSize capacity() const
{
return GetAllHeapSize();
}/*
TypeSize GetHeapSize() const*/
};/*
template<typename TSnglList> class ZtCBody*/
public:
};/*
template<int TTypIListKind=0> class ZtCFreeHeapSngl*/
template<int TTypIListKind=0> class ZtCFreeHeapCDL // Circular Double List
{
public:
template<typename TLinkList> class ZtCBody
{
public:
typedef typename TLinkList::ZCLink ZCLink ;
typedef typename TLinkList::TypeSize TypeSize;
public:
void RecvFreeIn(ZCLink* AP_CutLink){delete AP_CutLink;}
void RecvFreeIn ///////////////////////////////////////
(
TypeSize AL_CutCnt ,
ZCLink* AP_CutHead,
ZCLink* AP_CutTail
)
///////////////////////////////////////////////////////
{
ZCLink* VP_DelLink = AP_CutHead;
__for0(TypeSize, i, AL_CutCnt)
{
AP_CutHead = AP_CutHead->GetNextPtr() ;
delete VP_DelLink; VP_DelLink=AP_CutHead;
}/*
__for0(TypeSize, i, AL_CutCnt)*/
}
///////////////////////////////////////////////////////
ZCLink* SendFreeOut(){return new ZCLink;}
void SendFreeOut ///////////////////////////////////
(
TypeSize AL_NeedCnt ,
ZCLink*& APR_HeadLink ,
ZCLink*& APR_TailLink
)
///////////////////////////////////////////////////////
{
APR_HeadLink = new ZCLink;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = APR_HeadLink;
while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환
{
// AL_NeedCnt - 1 번 순환
VP_MakeLink = new ZCLink;
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink ;
}/*
while(--AL_NeedCnt>0)*/
APR_TailLink = VP_TailLink;
}
///////////////////////////////////////////////////////
void SendFreeOutCopy /*////////////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
/////////////////////////////////////////////////////
{
// 총 AL_FarNum+1 개의 링크가 만들어짊
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TailLink = 0 ;
VP_TailLink = VP_MakeLink =
new ZCLink(**AP_LinkOrgin) ;
APR_HeadCopy = VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->GetNextPtr();
VP_MakeLink = new ZCLink(**AP_LinkOrgin);
ZCLink::JoinLink
(VP_TailLink, VP_MakeLink);
VP_TailLink = VP_MakeLink;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TailLink;
}/*
void SendFreeOutCopy //////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
void DeleteHeap(){}
TypeSize GetUseHeapSize() const
{
return 0;
}/*
TypeSize GetUseHeapSize() const*/
TypeSize GetAllHeapSize() const
{
return 0;
}/*
TypeSize GetAllHeapSize() const*/
TypeSize size() const
{
return GetUseHeapSize();
}/*
TypeSize GetHeapSize() const*/
TypeSize capacity() const
{
return GetAllHeapSize();
}/*
TypeSize GetHeapSize() const*/
};/*
template<typename TLinkList> class ZtCBody*/
public:
};/*
template<int TTypIListKind=0> class ZtCFreeHeapCDL*/
}/*
namespace ZNsIFaceEx*/
namespace ZNsConst
{
// cf) ZtCSimList, ZtObjList
const int CI_ListKind_Single = 10 ;
const int CI_ListKind_Double = 20 ;
}/*
namespace ZNsConst*/
// 자유 기억 공간을 총괄하는 단방향 연결 리스트
class ZCHeapAllocList

View File

@ -35,7 +35,7 @@ namespace ZNsMain
, typename TTypeInit = ZtCInit<TType>
, typename TTypSize = ZTypLong
, typename TMoveObj = ZtCMoveObj<TType, TTypArgu, true>
, typename TFeeeHeap = ZNsIFace::ZIFreeHeap
, typename TFeeeHeap = ZNsIFaceEx::ZtCFreeHeapCDL<>
>
class ZtCObjList //////////////////////////////////////////////////////////////
{
@ -615,22 +615,26 @@ namespace ZNsMain
ZtCObjList& CopyThis(ZtCObjList& ARR_StoreList) const*/
ZtCObjList& MakeDefault(TypeSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const
ZtCObjList& MakeDefault
(TypeSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const
{
// must AL_DefaultSize > 0
ZCLink* VP_HeadLink=0;
ZCLink* VP_TailLink=0;
GetManyLink(AL_DefaultSize, VP_HeadLink, VP_TailLink);
ZCLink::MakeCircle(VP_HeadLink, VP_TailLink);
GetManyLink
(AL_DefaultSize, VP_HeadLink, VP_TailLink);
ZCLink::MakeCircle
(VP_HeadLink , VP_TailLink );
ARR_StoreList.mp_HeadLink=VP_HeadLink ;
ARR_StoreList.ml_Size =AL_DefaultSize;
return ARR_StoreList;
}/*
ZtCObjList& MakeDefault(TypeSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const*/
ZtCObjList& MakeDefault
(TypeSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const*/
void GetManyLink(
@ -671,12 +675,12 @@ namespace ZNsMain
if(AL_FarNum>0)
{
APR_HeadLink =
new ZCLink(AP_CopyLink->GetData());
APR_HeadLink = new
ZCLink(AP_CopyLink->GetData());
ZCLink* VP_TempLink=APR_HeadLink;
for(TypeSize i=1; i<=AL_FarNum; ++i)
for(TypeSize i=1; i<=AL_FarNum; ++i) /*<<<<<<<<<<<<<<<<<*/
{
AP_CopyLink=AP_CopyLink->mp_NextLink;
@ -684,8 +688,8 @@ namespace ZNsMain
VP_TempLink, new ZCLink(AP_CopyLink->GetData()));
VP_TempLink=VP_TempLink->mp_NextLink;
}/*
for(TypeSize i=1; i<=AL_FarNum; ++i)*/
}
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
APR_TailLink=VP_TempLink;
}
@ -696,7 +700,7 @@ namespace ZNsMain
ZCLink* VP_TempLink=APR_TailLink;
for(TypeSize i=AL_FarNum; i<0; ++i)
for(TypeSize i=AL_FarNum; i<0; ++i) /*<<<<<<<<<<<<<<<<<<*/
{
AP_CopyLink=AP_CopyLink->mp_PrevLink;
@ -704,8 +708,8 @@ namespace ZNsMain
VP_TempLink, new ZCLink(AP_CopyLink->GetData()));
VP_TempLink=VP_TempLink->mp_PrevLink;
}/*
for(TypeSize i=AL_FarNum; i<0; ++i)*/
}
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
APR_HeadLink=VP_TempLink;
}/*
@ -1148,7 +1152,7 @@ namespace ZNsMain
{
__for1(TypeSize, i, AI_DeleteCnt)
{
if(ml_Size<1) return *this;
if(this->size()<1) return *this;
delete this->CutLink(mp_HeadLink);
}/*

File diff suppressed because it is too large Load Diff