commit 2025-09-13 10:46 is coding ZCFreeHeapSngl::ZtCBody in ZCppMain/ZtCSimList.H

This commit is contained in:
2025-09-13 10:47:04 +09:00
parent 1ae5806738
commit 602f35faba
3 changed files with 754 additions and 44 deletions

View File

@ -748,6 +748,18 @@ namespace ZNsMain
namespace ZNsIFace*/
namespace ZNsIFaceEx
{
// ZNsIFace 에는 주로 interface 가 있다면,
// ZNsIFaceEx 에는 실제로 동작하는 코드가 온다.
// 따라서 여기에 오는 클래스는 주로 ZNsIFace 에 이미 있는 것이다.
// 다만, ZNsIFace 의 클래스는 주로 ZI 로 시작한다면
// ZNsIFaceEx 의 클래스는 주로 ZC 로 시작한다.
// -- 2025-09-13 01:06
}/*
namespace ZNsIFaceEx*/
namespace ZNsEnum
{
@ -2631,6 +2643,18 @@ namespace ZNsMain
}/*
namespace ZNsCRTP*/
namespace ZNsHelp
{
/*//////////////////////////////////////////////////
■ 주로 특정 클래스에 도움이 되는 클래스는 여기에 둔다.
-- 2025-09-13 00:59:00
//////////////////////////////////////////////////*/
}/*
namespace ZNsHelp*/
namespace ZNsFunc
{
@ -3775,7 +3799,7 @@ namespace ZNsMain
public:
template<typename TDblList> class ZtCDblList
template<typename TDblList> class ZtCBody
{
public:
typedef typename TDblList::ZCLink ZCLink ;
@ -3812,8 +3836,34 @@ namespace ZNsMain
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 TDblList> class ZtCDblList*/
template<typename TDblList> class ZtCBody*/
public:

View File

@ -58,7 +58,7 @@ namespace ZNsMain
typedef const ZCIterator const_iterator;
public:
typedef typename TFeeeHeap::
template ZtCDblList<ZtCObjList> ZCFreeHeap;
template ZtCBody<ZtCObjList> ZCFreeHeap;
public:

View File

@ -10,6 +10,666 @@
namespace ZNsMain
{
namespace ZNsIFaceEx
{
class ZCFreeHeapSngl
{
template<typename TSimList> class ZtCBody
{
public:
typedef typename ZtCBody::TypeData TypeData;
typedef typename ZtCBody::TypeSize TypeSize;
typedef typename ZtCBody::TypeInit TypeInit;
typedef typename ZtCBody::ZCLink ZCLink ;
public:
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallInit mo_Mutex ;
#endif //_REENTRANT_MUTEX
private:
TypeSize ml_AllSize ;
TypeSize ml_UseSize ;
ZCLink* mp_NoUseHead ;
ZCLink* mp_NoUseTail ;
private:
ZCLink* SendFreeOut()
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
#ifdef _DEBUG
ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj;
#endif //_DEBUG
if(ml_UseSize==0)
{
ZCLink* VP_TempLink = new ZCLink ;
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(VP_TempLink->mo_Data, *this);
return (++ml_AllSize, VP_TempLink);
}/*
if(ml_UseSize==0)*/
ZCLink* VP_TempLink=mp_NoUseHead;
if(VP_TempLink==mp_NoUseTail)
{
mp_NoUseHead=0;
mp_NoUseTail=0;
}
else
{
mp_NoUseHead = mp_NoUseHead->mp_NextLink;
}
//else
--ml_UseSize; return VP_TempLink;
}/*
ZCLink* SendFreeOut()*/
void SendFreeOut /*#####################################################*/
(
TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink
)
/*######################################################################*/
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
#ifdef _DEBUG
ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj;
#endif //_DEBUG
if(mp_NoUseHead==0)
{
MakeLink(AL_LinkSize, APR_HeadLink, APR_TailLink);
}
else if(AL_LinkSize==ml_UseSize)
{
ZCLink* VP_Temp = mp_NoUseHead;
while(true)
{
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(VP_Temp->mo_Data, *this);
if(VP_Temp==mp_NoUseTail)
{ break; }
VP_Temp = VP_Temp->mp_NextLink;
}/*
while(true)*/
APR_HeadLink = mp_NoUseHead ;
APR_TailLink = mp_NoUseTail ;
mp_NoUseHead =0 ;
mp_NoUseTail =0 ;
ml_UseSize =0 ;
}
else if(AL_LinkSize<ml_UseSize)
{
APR_HeadLink = mp_NoUseHead;
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(mp_NoUseHead->mo_Data, *this);
for(TypeSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count)
{
// VL_Count 가 2 부터 시작함으로 AL_LinkSize-1 번 순환한다.
// 그래야지 AL_LinkSize 개의 링크를 자를 수 있다.
mp_NoUseHead = mp_NoUseHead->mp_NextLink;
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(mp_NoUseHead->mo_Data, *this);
}/*
for(TypeSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count)*/
APR_TailLink = mp_NoUseHead ;
mp_NoUseHead= mp_NoUseHead->mp_NextLink;
ml_UseSize -= AL_LinkSize ;
}
else // AL_LinkSize > ml_UseSize
{
ZCLink* VP_Temp=mp_NoUseHead;
while(true)
{
if(VP_Temp==mp_NoUseTail)
{ break; }
VP_Temp=VP_Temp->mp_NextLink ;
}
//while(true)
APR_HeadLink = mp_NoUseHead;
// MakeLink() 에서 TypeInit::OnInit() 가 호출됨.
MakeLink( AL_LinkSize - ml_UseSize ,
mp_NoUseTail->mp_NextLink,
APR_TailLink
/*****/ );
mp_NoUseHead= 0 ;
mp_NoUseTail= 0 ;
ml_UseSize = 0 ;
}
//else // AL_LinkSize > ml_UseSize
}/*
void SendFreeOut
(
TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink
)
########################################################################*/
void SendFreeOutCopy /*////////////////////////////*/
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
/*/////////////////////////////////////////////////*/
{
// AL_FarNum > 0
// AP_LinkOrgin 링크부터,
// AP_LinkOrgin 에서 AL_FarNum 만큼 떨어진 링크까지를 복사하여
// 복사생성된 처음 링크 포인터를 APR_HeadCopy 에,
// 마지막 링크를 APR_TailCopy 에 대입한다.
// AP_LinkOrgin 링크에서 그 다음 링크로 접근하면서 링크를 복사할 것이다.
// 따라서 총 AL_FarNum + 1 개의 링크가 만들어진다.
// 이 함수는 각 링크를 새로 생성하는 MakeLinkCopy() 함수와는 달리
// 기존에 있는 ml_UseSize 개의 링크를 먼저 사용한다.
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
#ifdef _DEBUG
ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj;
#endif //_DEBUG
if(mp_NoUseHead==0)
{
MakeLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy);
}
else if( AL_FarNum < ml_UseSize) // ( (AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 <= ml_UseSize)
{
ml_UseSize -= AL_FarNum+1 ;
mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data ;
APR_HeadCopy = mp_NoUseHead ;
while(--AL_FarNum>=0)
{
mp_NoUseHead = mp_NoUseHead->mp_NextLink ;
AP_LinkOrgin = AP_LinkOrgin->mp_NextLink ;
mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data;
}
//while(--AL_FarNum>=0)
APR_TailCopy=mp_NoUseHead;
// 이 부분에서 mp_NoUseHead 는 잘려나가는 마지막 링크가 된다.
// 그러므로 다시 다음 링크로 초기화한다.
mp_NoUseHead=mp_NoUseHead->mp_NextLink;
if(mp_NoUseHead==0)
{
mp_NoUseTail=0;
// mp_NoUseHead == 0 인데 mp_NoUseTail !=0 이라면
// 나중에 자칫 무한루프에 빠질 수 있다.
// 따라서 위 코드를 두었다.
}
//if(mp_NoUseHead==0)
}
else // AL_FarNum > ml_UseSize
{
mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data ;
APR_HeadCopy = mp_NoUseHead ;
while(mp_NoUseHead!=mp_NoUseTail)
{
mp_NoUseHead= mp_NoUseHead->mp_NextLink;
AP_LinkOrgin= AP_LinkOrgin->mp_NextLink;
mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data;
}
//while(mp_NoUseHead!=mp_NoUseTail)
MakeLinkCopy /*++++++++++++++++++++++++++++++++++++++++++++*/
(
AP_LinkOrgin->mp_NextLink, AL_FarNum-ml_UseSize ,
mp_NoUseTail->mp_NextLink, APR_TailCopy
);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
mp_NoUseHead =
mp_NoUseTail = 0;
ml_UseSize = 0;
}
//else // AL_FarNum > ml_UseSize
}/*
void SendFreeOutCopy ////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
void MakeLink ///////////////////////////////////////
(
TypeSize AL_MakeSize ,
ZCLink*& APR_HeadLink,
ZCLink*& APR_TailLink
)
///////////////////////////////////////////////////*/
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
#ifdef _DEBUG
ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj;
#endif //_DEBUG
APR_HeadLink = new ZCLink;
if(APR_HeadLink==0)
{
//add codes for memory over
DeleteHeap(); return;
}/*
if(APR_HeadLink==0)*/
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(APR_HeadLink->mo_Data, *this);
ml_AllSize += AL_MakeSize;
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TempLink = APR_HeadLink;
bool VB_IsHeapOver= false ;
// bool VB_IsHeapOver 은 new 연산자가 NULL 포인터를 반환했을 때
// true 를 대입받는다. 이 값을 조사함으로써 heap overflow 를 처리한다.
// bool VB_IsHeapOver 변수를 두지 않고
// 아래 for 문에서 직접 메모리 처리를 하는 코드를 둘 수 있으나
// for 문 안에 if 문 속에서 또 for 문을 써야 함으로
// 가독성이 떨어질 수가 있다.
// 그래서 heap over 에 대한 예외처리 코드를
// for 문 바깥으로 빼려는 것이다.
while(--AL_MakeSize>0) // AL_MakeSize - 1 번 순환
{
// AL_MakeSize - 1 번 순환
VP_MakeLink = new ZCLink;
if(VP_MakeLink==0)
{
ml_AllSize -= AL_MakeSize+1 ;
VB_IsHeapOver = true ;
break;
}/*
if(VP_MakeLink==0)*/
if(TypeInit::ZEUseInit>0)
TypeInit::OnInit(VP_MakeLink->mo_Data, *this);
VP_TempLink->mp_NextLink=VP_MakeLink ;
VP_TempLink =VP_MakeLink ;
}/*
while(--AL_MakeSize>0)*/
APR_TailLink = VP_TempLink;
// 메모리를 더 이상 할당할 수 없었다면
// 이미 만들어진 VL_Count 개의 비원형 이중 링크를 지운다.
if(VB_IsHeapOver==true)
{
VP_TempLink=APR_HeadLink;
// 이 시점에서 최소한 APR_HeadLink 하나는
// heap 에 생성되어 있다.
do //////
{
delete VP_TempLink;
if(VP_TempLink==APR_TailLink)
{
DeleteHeap();
// Add extra codes for memory over
return;
}/*
if(VP_TempLink==APR_TailLink)*/
APR_HeadLink=APR_HeadLink->mp_NextLink;
}
while(true);
}/*
if(VB_IsHeapOver==true)*/
}/*
void MakeLink ///////////////////////////////////////
(
TypeSize AL_MakeSize ,
ZCLink*& APR_HeadLink,
ZCLink*& APR_TailLink
)
///////////////////////////////////////////////////*/
void MakeLinkCopy ///////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum ,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
{
// AP_LinkOrgin 링크부터,
// AP_LinkOrgin 에서 AL_FarNum 만큼 떨어진 링크까지를 복사하여
// 복사생성된 처음 링크 포인터를 APR_HeadCopy 에,
// 마지막 링크를 APR_TailCopy 에 대입한다.
// AL_FarNum > 0 , 총 AL_FarNum + 1 개의 링크가 만들어진다.
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
#ifdef _DEBUG
ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj;
#endif //_DEBUG
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TempLink = 0 ;
bool VB_IsHeapOver= false;
VP_TempLink = \
VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Data);
ml_AllSize += AL_FarNum+1 ;
if(VP_MakeLink==0)
{
//add codes for memory over
ml_AllSize -= AL_FarNum+1; DeleteHeap();
return; /////////////////////////////////
}/*
if(VP_MakeLink==0)*/
APR_HeadCopy=VP_MakeLink;
while(--AL_FarNum >= 0)
{
AP_LinkOrgin= AP_LinkOrgin->mp_NextLink ;
VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Data);
if(VP_MakeLink==0)
{
ml_AllSize -= AL_FarNum+1 ;
APR_TailCopy = VP_TempLink ;
VB_IsHeapOver= true ;
break;
}/*
if(VP_MakeLink==0)*/
VP_TempLink->mp_NextLink= VP_MakeLink;
VP_TempLink = VP_MakeLink;
}/*
while(--AL_FarNum >= 0)*/
APR_TailCopy=VP_TempLink;
// 메모리를 더 이상 할당할 수 없었다면
// 이미 만들어진 비원형 이중 링크를 지운다.
if(VB_IsHeapOver==true)
{
do //////
{
delete APR_HeadCopy;
if(APR_HeadCopy==APR_TailCopy)
{
DeleteHeap(); return;
}/*
if(APR_HeadCopy==APR_TailCopy)*/
APR_HeadCopy = APR_HeadCopy->mp_NextLink;
}
while(true);
}/*
if(VB_IsHeapOver==true)*/
}/*
void MakeLinkCopy ///////////////////////////////////
(
ZCLink* AP_LinkOrgin, TypeSize AL_FarNum,
ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy
)
///////////////////////////////////////////////////*/
void RecvFreeIn(ZCLink* AP_Link)
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
AP_Link->mp_NextLink=0;
if(++ml_UseSize==1) // ml_UseSize 이 0 일때
{
mp_NoUseHead =
mp_NoUseTail = AP_Link ;
}
else
{
// 새로운 링크는 mp_NoUseTail 다음에 붙인다.
mp_NoUseTail->mp_NextLink= AP_Link;
mp_NoUseTail = AP_Link;
}
//else
if(TypeInit::ZEUseFini>0)
TypeInit::OnFini(AP_Link->mo_Data, *this);
}/*
void RecvFreeIn(ZCLink* AP_Link)*/
void RecvFreeIn(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TypeSize AL_Count)
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
if(TypeInit::ZEUseFini>0)
{
ZCLink* VP_NowLink = AP_HeadLink;
__for1(TypeSize, i, AL_Count)
{
TypeInit::OnFini(VP_NowLink->mo_Data, *this) ;
VP_NowLink = VP_NowLink->mp_NextLink;
}/*
__for1(TypeSize, i, AL_Count)*/
}/*
if(TypeInit::ZEUseFini>0)*/
if(ml_UseSize==0)
{
mp_NoUseHead = AP_HeadLink ;
mp_NoUseTail = AP_TailLink ;
}
else
{
// 새로운 링크는 mp_NoUseTail 다음에 붙인다.
mp_NoUseTail->mp_NextLink = AP_HeadLink;
mp_NoUseTail = AP_TailLink;
}
//else
mp_NoUseTail->mp_NextLink=0;
ml_UseSize += AL_Count ;
}/*
void RecvFreeIn(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TypeSize AL_Count)*/
//private:
public :
ZtCBody()
{
ml_AllSize =
ml_UseSize = 0 ;
mp_NoUseHead =
mp_NoUseTail = 0 ;
ZNsMain::GetCHeapAllocList().AddFreeAllocBase(*this);
}/*
ZtCBody()*/
~ZtCBody()
{
#ifndef _SIMLIST_FREE_STORE_CHECK_
#ifdef _SIMLIST_FREE_STORE_LOG_
if( ml_UseSize>0 )
{
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
fileout<<"Error In '~ZtCBody()' : All Static Link Not Returned !! "<<std::endl;
fileout.close();
}/*
if( ml_UseSize>0 )*/
#endif //_SIMLIST_FREE_STORE_LOG_
return ;
#endif //!_SIMLIST_FREE_STORE_CHECK_
if(ml_UseSize==0) return ;
ZCLink* VP_DelLink=mp_NoUseHead;
do //////
{
mp_NoUseHead =
mp_NoUseHead->mp_NextLink;
delete VP_DelLink;
VP_DelLink = mp_NoUseHead ;
}
while(VP_DelLink!=0);
ml_AllSize -= ml_UseSize ;
ml_UseSize = 0 ;
mp_NoUseHead =
mp_NoUseTail = 0 ;
}/*
~ZtCBody()*/
void DeleteHeap()
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
#endif //_REENTRANT_MUTEX
if(ml_UseSize==0) return ;
ZCLink* VP_DelLink = mp_NoUseHead;
do //////
{
mp_NoUseHead =
mp_NoUseHead->mp_NextLink ;
delete VP_DelLink;
VP_DelLink = mp_NoUseHead ;
}
while(VP_DelLink!=0);
ml_AllSize -= ml_UseSize;
ml_UseSize = 0 ;
mp_NoUseHead =
mp_NoUseTail = 0 ;
}/*
void DeleteHeap()*/
TypeSize GetUseHeapSize() const
{
return ml_UseSize;
}/*
TypeSize GetUseHeapSize() const*/
TypeSize GetAllHeapSize() const
{
return ml_AllSize;
}/*
TypeSize GetAllHeapSize() const*/
TypeSize size() const
{
return ml_UseSize;
}/*
TypeSize size() const*/
TypeSize capacity() const
{
return ml_AllSize;
}/*
TypeSize capacity() const*/
//public:
};
//template<typename TSimList> class ZtCBody
};/*
class ZCFreeHeapSngl*/
}/*
namespace ZNsIFaceEx*/
template<typename TypeObjList> class ZtCSortObjList;
@ -36,7 +696,7 @@ namespace ZNsMain
public:
class ZCLinkHeap;
class ZCFreeHeap;
class ZCLink : public TypeAlloc
@ -44,7 +704,7 @@ namespace ZNsMain
public:
template<typename TypeObjList> friend class ZtCSortObjList ;
friend class ZtCSimList ;
/*##########################*/ friend class ZCLinkHeap ;
/*##########################*/ friend class ZCFreeHeap ;
public:
@ -229,7 +889,7 @@ namespace ZNsMain
//////////////////////////////////////////////////
class ZCLinkHeap : public ZCFreeAllocBase
class ZCFreeHeap : public ZCFreeAllocBase
{
public:
friend class ZtCSimList ;
@ -522,7 +1182,7 @@ namespace ZNsMain
ZCLink* VP_MakeLink = 0 ;
ZCLink* VP_TempLink = APR_HeadLink;
bool VB_IsHeapOver= false ;
// bool VB_IsHeapOver 은 new 연산자가 NULL 포인터를 반환했을 때
// true 를 대입받는다. 이 값을 조사함으로써 heap overflow 를 처리한다.
// bool VB_IsHeapOver 변수를 두지 않고
@ -718,7 +1378,7 @@ namespace ZNsMain
}
//void ReceiveLink(ZCLink* AP_Link)
void ReceiveLink(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TTypSize AL_Count)
void ReceiveLink(TTypSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink)
{
#ifdef _REENTRANT_MUTEX
ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex);
@ -756,14 +1416,14 @@ namespace ZNsMain
mp_NoUseTailLink->mp_NextLink=0;
ml_UseSize += AL_Count ;
}
//void ReceiveLink(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TTypSize AL_Count)
//void ReceiveLink(TTypSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink)
//private:
public :
ZCLinkHeap()
ZCFreeHeap()
{
ml_AllSize =
ml_UseSize = 0 ;
@ -773,9 +1433,9 @@ namespace ZNsMain
ZNsMain::GetCHeapAllocList().AddFreeAllocBase(*this);
}
//ZCLinkHeap()
//ZCFreeHeap()
~ZCLinkHeap()
~ZCFreeHeap()
{
#ifndef _SIMLIST_FREE_STORE_CHECK_
@ -785,7 +1445,7 @@ namespace ZNsMain
{
std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app);
fileout<<std::endl<<"File : "<<__FILE__<<std::endl<<"Line : "<<__LINE__<<std::endl;
fileout<<"Error In '~ZCLinkHeap()' : All Static Link Not Returned !! "<<std::endl;
fileout<<"Error In '~ZCFreeHeap()' : All Static Link Not Returned !! "<<std::endl;
fileout.close();
}
//if( ml_UseSize>0 )
@ -816,7 +1476,7 @@ namespace ZNsMain
mp_NoUseHeadLink =
mp_NoUseTailLink = 0 ;
}
//~ZCLinkHeap()
//~ZCFreeHeap()
void DeleteAllInHeap()
@ -848,23 +1508,23 @@ namespace ZNsMain
//void DeleteAllInHeap()
TTypSize GetUseLinkSize() const
TTypSize GetUseHeapSize() const
{
return ml_UseSize;
}
//TTypSize GetUseLinkSize() const
//TTypSize GetUseHeapSize() const
TTypSize GetAllLinkSize() const
TTypSize GetAllHeapSize() const
{
return ml_AllSize;
}
//TTypSize GetAllLinkSize() const
//TTypSize GetAllHeapSize() const
long GetHeapSize() const
long size() const
{
return ml_UseSize;
}
//long GetHeapSize() const
//long size() const
long GetMemSize() const
{
@ -874,12 +1534,12 @@ namespace ZNsMain
//public:
};
//class ZCLinkHeap
//class ZCFreeHeap
////////////////////////////////////////////////
/************ end class ZCLinkHeap ************/
/************ end class ZCFreeHeap ************/
////////////////////////////////////////////////
@ -909,7 +1569,7 @@ namespace ZNsMain
ZCLink* VP_HeadLink=0;
ZCLink* VP_TailLink=0;
GetCLinkHeap().GetManyLinkCopy
GetCFreeHeap().GetManyLinkCopy
(
const_cast<ZCLink*>(AP_CopyLink), // g++ 에서는 반드시 AP_CopyLink 부분을 () 로 묶어 줄 것.
AL_FarNum ,
@ -1079,7 +1739,7 @@ namespace ZNsMain
ZCLink* VP_HeadLink=0;
ZCLink* VP_TailLink=0;
GetCLinkHeap().GetManyLink
GetCFreeHeap().GetManyLink
(AL_DefaultSize, VP_HeadLink, VP_TailLink);
ZCLink::MakeCircle( VP_HeadLink, VP_TailLink );
@ -1211,7 +1871,7 @@ namespace ZNsMain
void AddHead(TypeArg AR_Type)
{
ZCLink* VP_AddLink = GetCLinkHeap().GetOneLink() ;
ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink() ;
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
@ -1238,7 +1898,7 @@ namespace ZNsMain
ZCLink* AddHeadDefault()
{
ZCLink* VP_AddLink=GetCLinkHeap().GetOneLink();
ZCLink* VP_AddLink=GetCFreeHeap().GetOneLink();
if(++ml_Size==1) // ml_Size==0
{
@ -1257,7 +1917,7 @@ namespace ZNsMain
void AddTail(TypeArg AR_Type)
{
ZCLink* VP_AddLink = GetCLinkHeap().GetOneLink();
ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink();
#if(_CODE_NEW_)
if(TypeMoveObj::ZEUseMoveObj>0) ////////////////////
@ -1284,7 +1944,7 @@ namespace ZNsMain
ZCLink* AddTailDefault()
{
ZCLink* VP_AddLink = GetCLinkHeap().GetOneLink();
ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink();
if(++ml_Size==1) // ml_Size==0
{
@ -1638,7 +2298,7 @@ namespace ZNsMain
ZCLink* VP_DelLink= mp_HeadLink ;
mp_HeadLink = mp_HeadLink->mp_NextLink;
GetCLinkHeap().ReceiveLink(VP_DelLink);
GetCFreeHeap().ReceiveLink(VP_DelLink);
if(--ml_Size==0)
{
@ -1690,7 +2350,7 @@ namespace ZNsMain
mp_HeadLink->GetNextPtr(ml_Size-1);
mp_TailLink->mp_NextLink=0 ;
GetCLinkHeap().ReceiveLink(VP_CutLink);
GetCFreeHeap().ReceiveLink(VP_CutLink);
}/*
void DeleteTail()*/
@ -1703,8 +2363,8 @@ namespace ZNsMain
if(AL_DelSize==ml_Size)
{
GetCLinkHeap().ReceiveLink
(mp_HeadLink, mp_TailLink, ml_Size);
GetCFreeHeap().ReceiveLink
(ml_Size, mp_HeadLink, mp_TailLink);
mp_HeadLink=0 ;
mp_TailLink=0 ;
ml_Size =0 ;
@ -1715,8 +2375,8 @@ namespace ZNsMain
ZCLink* VP_NewTail= mp_HeadLink->
GetNextPtr( ml_Size-AL_DelSize-1 );
GetCLinkHeap().ReceiveLink
(VP_NewTail->mp_NextLink, mp_TailLink, AL_DelSize);
GetCFreeHeap().ReceiveLink
(AL_DelSize, VP_NewTail->mp_NextLink, mp_TailLink);
mp_TailLink = VP_NewTail ;
mp_TailLink-> mp_NextLink=0 ;
@ -1740,7 +2400,7 @@ namespace ZNsMain
}
#endif //_DEBUG
GetCLinkHeap().ReceiveLink
GetCFreeHeap().ReceiveLink
( CutLink(AP_PrevLink, AP_CutLink) );
}/*
void Delete(ZCLink* AP_PrevLink, ZCLink* AP_CutLink)*/
@ -1762,7 +2422,7 @@ namespace ZNsMain
}
#endif //_DEBUG
GetCLinkHeap().ReceiveLink
GetCFreeHeap().ReceiveLink
( CutLink(AP_PrevLink, AP_CutLink, AL_CutPos) );
}/*
void Delete(ZCLink* AP_PrevLink, ZCLink* AP_CutLink, TTypSize AL_CutPos)*/
@ -1818,8 +2478,8 @@ namespace ZNsMain
{
if(ml_Size==0) {return;}
GetCLinkHeap().ReceiveLink
(mp_HeadLink, mp_TailLink, ml_Size);
GetCFreeHeap().ReceiveLink
(ml_Size, mp_HeadLink, mp_TailLink);
mp_HeadLink =
mp_TailLink =0;
@ -1828,11 +2488,11 @@ namespace ZNsMain
void DeleteAll()*/
static void DeleteAllInHeap()
static void DeleteHeap()
{
GetCLinkHeap().DeleteAllInHeap();
GetCFreeHeap().DeleteHeap();
}/*
static void DeleteAllInHeap()*/
static void DeleteHeap()*/
TTypSize Find(const ZCLink* AP_pSearchLink, TTypSize AL_FirstFindIndex=1) const
@ -1954,11 +2614,11 @@ namespace ZNsMain
const ZCLink* GetLinkPtr(TTypSize AL_Index) const*/
static ZCLinkHeap& GetCLinkHeap()
static ZCFreeHeap& GetCFreeHeap()
{
static ZCLinkHeap SO_CLinkHeap; return SO_CLinkHeap;
static ZCFreeHeap SO_CLinkHeap; return SO_CLinkHeap;
}/*
static ZCLinkHeap& GetCLinkHeap()*/
static ZCFreeHeap& GetCFreeHeap()*/
inline TTypSize GetSize() const