diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index 9437410..c462455 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -3799,11 +3799,11 @@ namespace ZNsMain public: - template class ZtCBody + template 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 class ZtCBody*/ + template class ZtCBody*/ public: @@ -3875,6 +3875,322 @@ namespace ZNsMain namespace ZNsIFace*/ + namespace ZNsIFaceEx + { + + /*################################################################ + + ■ 자료 구조에서 자유 기억 공간을 구현하는 interface + + 만약 다르게 구헌한 자유 기억 공간 class 가 필요하다면, + + 단방향 연결 리스트는 ZtCFreeHeapSngl<> 를 통해 중첩 정의하고, + 양방향 연결 리스트는 ZtCFreeHeapCDL <> 를 통해 중첩 정의하자. + + 이렇게 하면, + + ZtCFreeHeapSngl<>::ZCLink 와 ZtCFreeHeapCDL<>::ZCLink + + 에서 friend 선언을 아래처럼 고정시켜 놓을 수 있다. + + template + friend class ZNsIFaceEx::ZtCFreeHeapSngl ; + + ################################################################*/ + template class ZtCFreeHeapSngl // Single List + { + public: + + template 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 class ZtCBody*/ + + public: + };/* + template class ZtCFreeHeapSngl*/ + + + template class ZtCFreeHeapCDL // Circular Double List + { + public: + + template 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 class ZtCBody*/ + + + public: + };/* + template 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 diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index 66e16f8..38ced79 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -35,7 +35,7 @@ namespace ZNsMain , typename TTypeInit = ZtCInit , typename TTypSize = ZTypLong , typename TMoveObj = ZtCMoveObj - , 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); }/* diff --git a/ZCppMain/ZtCSimList.H b/ZCppMain/ZtCSimList.H index 69415b4..cf4e461 100644 --- a/ZCppMain/ZtCSimList.H +++ b/ZCppMain/ZtCSimList.H @@ -13,21 +13,42 @@ namespace ZNsMain namespace ZNsIFaceEx { - class ZCFreeHeapSngl + template<> class ZtCFreeHeapSngl< ZNsConst::CI_ListKind_Single > { + public: template class ZtCBody { - public: - typedef typename ZtCBody::TypeData TypeData; - typedef typename ZtCBody::TypeSize TypeSize; - typedef typename ZtCBody::TypeInit TypeInit; - typedef typename ZtCBody::ZCLink ZCLink ; - public: + public : + typedef typename TSimList::TypeData TypeData; + typedef typename TSimList::TypeSize TypeSize; + typedef typename TSimList::TypeInit TypeInit; + typedef typename TSimList::ZCLink ZCLink ; + public : - #ifdef _REENTRANT_MUTEX - ZNsMain::ZCMutexSmallInit mo_Mutex ; - #endif //_REENTRANT_MUTEX + #if(0) + + /* 아래는 g++ 이 지원하지 않는다. + + In file included from ZtCSimList_000.cpp:4: + ../ZCppMain/ZtCSimList.H:35:39: error: ‘ZtCSimList’ in namespace ‘ZNsMain’ does not name a type; did you mean ‘ZtCList’? + 35 | friend class ZNsMain::ZtCSimList; ///////////////////////////// + | ^~~~~~~~~~ + | ZtCList + + -- Visual C++ 2022 는 지원한다. -- 2025-09-13 22:06 + + -- ZNsMain::ZtCSimList 을 전방 선언하면 되기는 할 것이다. -- 2025-09-13 22:44 + */ + template ////////////////////////////////////////////////////// + < + typename TType , typename TTypArgu + , typename TTypCAlloc , typename TTypCInit + , typename TTypSize , typename TMoveObj + , typename TFeeeHeap + > + friend class ZNsMain::ZtCSimList; ///////////////////////////// + #endif //(0) private: TypeSize ml_AllSize ; @@ -35,24 +56,16 @@ namespace ZNsMain ZCLink* mp_NoUseHead ; ZCLink* mp_NoUseTail ; - private: + public : - ZCLink* SendFreeOut() + _NP_ 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); + TypeInit::OnInit(*VP_TempLink, *this); return (++ml_AllSize, VP_TempLink); }/* @@ -68,46 +81,42 @@ namespace ZNsMain } else { - mp_NoUseHead = mp_NoUseHead->mp_NextLink; + mp_NoUseHead = mp_NoUseHead->GetNextPtr(); } //else --ml_UseSize; return VP_TempLink; }/* - ZCLink* SendFreeOut()*/ + _NP_ ZCLink* SendFreeOut()*/ - void SendFreeOut /*#####################################################*/ + _NP_ void SendFreeOut /*################################################*/ ( - TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + TypeSize AL_NeedCnt, 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); + MakeLink(AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink)); } - else if(AL_LinkSize==ml_UseSize) + else if(AL_NeedCnt==ml_UseSize) { ZCLink* VP_Temp = mp_NoUseHead; while(true) { if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(VP_Temp->mo_Data, *this); + TypeInit::OnInit(**VP_Temp, *this); if(VP_Temp==mp_NoUseTail) { break; } - VP_Temp = VP_Temp->mp_NextLink; + VP_Temp = VP_Temp->GetNextPtr(); }/* while(true)*/ @@ -118,30 +127,30 @@ namespace ZNsMain mp_NoUseTail =0 ; ml_UseSize =0 ; } - else if(AL_LinkSize0) - TypeInit::OnInit(mp_NoUseHead->mo_Data, *this); + TypeInit::OnInit(**mp_NoUseHead, *this); - for(TypeSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count) + for(TypeSize VL_Count=2; VL_Count<=AL_NeedCnt; ++VL_Count) { - // VL_Count 가 2 부터 시작함으로 AL_LinkSize-1 번 순환한다. - // 그래야지 AL_LinkSize 개의 링크를 자를 수 있다. + // VL_Count 가 2 부터 시작함으로 AL_NeedCnt-1 번 순환한다. + // 그래야지 AL_NeedCnt 개의 링크를 자를 수 있다. - mp_NoUseHead = mp_NoUseHead->mp_NextLink; + mp_NoUseHead = mp_NoUseHead->GetNextPtr(); if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(mp_NoUseHead->mo_Data, *this); + TypeInit::OnInit(**mp_NoUseHead, *this); }/* - for(TypeSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count)*/ + for(TypeSize VL_Count=2; VL_Count<=AL_NeedCnt; ++VL_Count)*/ - APR_TailLink = mp_NoUseHead ; - mp_NoUseHead= mp_NoUseHead->mp_NextLink; - ml_UseSize -= AL_LinkSize ; + APR_TailLink = mp_NoUseHead ; + mp_NoUseHead = mp_NoUseHead->GetNextPtr(); + ml_UseSize -= AL_NeedCnt ; } - else // AL_LinkSize > ml_UseSize + else // AL_NeedCnt > ml_UseSize { ZCLink* VP_Temp=mp_NoUseHead; @@ -150,32 +159,35 @@ namespace ZNsMain if(VP_Temp==mp_NoUseTail) { break; } - VP_Temp=VP_Temp->mp_NextLink ; - } - //while(true) + VP_Temp=VP_Temp->GetNexPtr() ; + }/* + while(true)*/ APR_HeadLink = mp_NoUseHead; // MakeLink() 에서 TypeInit::OnInit() 가 호출됨. - MakeLink( AL_LinkSize - ml_UseSize , - mp_NoUseTail->mp_NextLink, - APR_TailLink - /*****/ ); + MakeLink /////////////////////////////////////// + ( + AL_NeedCnt - ml_UseSize , + RR(mp_NoUseTail->mp_NextLink) , + RR(APR_TailLink) + ); + //////////////////////////////////////////////// mp_NoUseHead= 0 ; mp_NoUseTail= 0 ; ml_UseSize = 0 ; - } - //else // AL_LinkSize > ml_UseSize + }/* + else // AL_NeedCnt > ml_UseSize*/ }/* - void SendFreeOut + _NP_ void SendFreeOut ################################################### ( - TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ) ########################################################################*/ - void SendFreeOutCopy /*////////////////////////////*/ + _NP_ void SendFreeOutCopy /*///////////////////////*/ ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy @@ -192,40 +204,37 @@ namespace ZNsMain // 이 함수는 각 링크를 새로 생성하는 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); + MakeLinkCopy ///////////////////////////// + ( + AP_LinkOrgin , AL_FarNum , + RR(APR_HeadCopy), RR(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 ; + **mp_NoUseHead = **AP_LinkOrgin ; + APR_HeadCopy = mp_NoUseHead ; while(--AL_FarNum>=0) { - mp_NoUseHead = mp_NoUseHead->mp_NextLink ; - AP_LinkOrgin = AP_LinkOrgin->mp_NextLink ; + mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; + AP_LinkOrgin = AP_LinkOrgin->GetNextPtr() ; - mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data; + **mp_NoUseHead = **AP_LinkOrgin ; } //while(--AL_FarNum>=0) - APR_TailCopy=mp_NoUseHead; + APR_TailCopy = mp_NoUseHead ; // 이 부분에서 mp_NoUseHead 는 잘려나가는 마지막 링크가 된다. // 그러므로 다시 다음 링크로 초기화한다. - mp_NoUseHead=mp_NoUseHead->mp_NextLink; + mp_NoUseHead = mp_NoUseHead->GetNextPtr(); if(mp_NoUseHead==0) { @@ -234,27 +243,27 @@ namespace ZNsMain // mp_NoUseHead == 0 인데 mp_NoUseTail !=0 이라면 // 나중에 자칫 무한루프에 빠질 수 있다. // 따라서 위 코드를 두었다. - } - //if(mp_NoUseHead==0) + }/* + if(mp_NoUseHead==0)*/ } else // AL_FarNum > ml_UseSize { - mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data ; - APR_HeadCopy = mp_NoUseHead ; + **mp_NoUseHead = **AP_LinkOrgin ; + APR_HeadCopy = mp_NoUseHead ; while(mp_NoUseHead!=mp_NoUseTail) { - mp_NoUseHead= mp_NoUseHead->mp_NextLink; - AP_LinkOrgin= AP_LinkOrgin->mp_NextLink; + mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; + AP_LinkOrgin = AP_LinkOrgin->GetNextPtr() ; - mp_NoUseHead->mo_Data = AP_LinkOrgin->mo_Data; - } - //while(mp_NoUseHead!=mp_NoUseTail) + **mp_NoUseHead = **AP_LinkOrgin ; + }/* + while(mp_NoUseHead!=mp_NoUseTail)*/ MakeLinkCopy /*++++++++++++++++++++++++++++++++++++++++++++*/ ( - AP_LinkOrgin->mp_NextLink, AL_FarNum-ml_UseSize , - mp_NoUseTail->mp_NextLink, APR_TailCopy + AP_LinkOrgin->GetNextPtr() , AL_FarNum-ml_UseSize, + RR(mp_NoUseTail->mp_NextLink), RR(APR_TailCopy) ); /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @@ -272,7 +281,7 @@ namespace ZNsMain ///////////////////////////////////////////////////*/ - void MakeLink /////////////////////////////////////// + _NP_ void MakeLink ///////////////////////////////// ( TypeSize AL_MakeSize , ZCLink*& APR_HeadLink, @@ -280,14 +289,6 @@ namespace ZNsMain ) ///////////////////////////////////////////////////*/ { - #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) @@ -299,7 +300,7 @@ namespace ZNsMain if(APR_HeadLink==0)*/ if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(APR_HeadLink->mo_Data, *this); + TypeInit::OnInit(**APR_HeadLink, *this); ml_AllSize += AL_MakeSize; @@ -332,10 +333,12 @@ namespace ZNsMain if(VP_MakeLink==0)*/ if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(VP_MakeLink->mo_Data, *this); + TypeInit::OnInit(**VP_MakeLink, *this); - VP_TempLink->mp_NextLink=VP_MakeLink ; - VP_TempLink =VP_MakeLink ; + ZCLink::JoinLink + (VP_TempLink, VP_MakeLink); + + VP_TempLink = VP_MakeLink ; }/* while(--AL_MakeSize>0)*/ @@ -365,13 +368,13 @@ namespace ZNsMain }/* if(VP_TempLink==APR_TailLink)*/ - APR_HeadLink=APR_HeadLink->mp_NextLink; + APR_HeadLink=APR_HeadLink->GetNextPtr(); } while(true); }/* if(VB_IsHeapOver==true)*/ }/* - void MakeLink /////////////////////////////////////// + _NP_ void MakeLink ////////////////////////////////// ( TypeSize AL_MakeSize , ZCLink*& APR_HeadLink, @@ -380,7 +383,7 @@ namespace ZNsMain ///////////////////////////////////////////////////*/ - void MakeLinkCopy /////////////////////////////////// + _NP_ void MakeLinkCopy ////////////////////////////// ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy @@ -393,21 +396,12 @@ namespace ZNsMain // 마지막 링크를 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 ; + ZCLink* VP_TailLink = 0 ; bool VB_IsHeapOver= false; - VP_TempLink = \ - VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Data); + VP_TailLink = VP_MakeLink = + new ZCLink(**AP_LinkOrgin) ; ml_AllSize += AL_FarNum+1 ; @@ -415,35 +409,38 @@ namespace ZNsMain { //add codes for memory over - ml_AllSize -= AL_FarNum+1; DeleteHeap(); + ml_AllSize -= AL_FarNum+1; - return; ///////////////////////////////// + DeleteHeap(); return ; }/* if(VP_MakeLink==0)*/ - APR_HeadCopy=VP_MakeLink; + + APR_HeadCopy = VP_MakeLink; while(--AL_FarNum >= 0) { - AP_LinkOrgin= AP_LinkOrgin->mp_NextLink ; - VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Data); + AP_LinkOrgin= AP_LinkOrgin->GetNextPtr() ; + VP_MakeLink = new ZCLink(**AP_LinkOrgin) ; if(VP_MakeLink==0) { ml_AllSize -= AL_FarNum+1 ; - APR_TailCopy = VP_TempLink ; + APR_TailCopy = VP_TailLink ; VB_IsHeapOver= true ; break; }/* if(VP_MakeLink==0)*/ - VP_TempLink->mp_NextLink= VP_MakeLink; - VP_TempLink = VP_MakeLink; + ZCLink::JoinLink + (VP_TailLink, VP_MakeLink); + + VP_TailLink = VP_MakeLink; }/* while(--AL_FarNum >= 0)*/ - APR_TailCopy=VP_TempLink; + APR_TailCopy=VP_TailLink; // 메모리를 더 이상 할당할 수 없었다면 // 이미 만들어진 비원형 이중 링크를 지운다. @@ -466,7 +463,7 @@ namespace ZNsMain }/* if(VB_IsHeapOver==true)*/ }/* - void MakeLinkCopy /////////////////////////////////// + _NP_ void MakeLinkCopy ////////////////////////////// ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum, ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy @@ -474,50 +471,47 @@ namespace ZNsMain ///////////////////////////////////////////////////*/ - void RecvFreeIn(ZCLink* AP_Link) + _NP_ void RecvFreeIn(ZCLink* AP_CutLink) { - #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 ; + mp_NoUseTail = AP_CutLink ; } else { // 새로운 링크는 mp_NoUseTail 다음에 붙인다. - mp_NoUseTail->mp_NextLink= AP_Link; - mp_NoUseTail = AP_Link; + ZCLink::JoinLink + (mp_NoUseTail, AP_CutLink); + + mp_NoUseTail = AP_CutLink; } //else if(TypeInit::ZEUseFini>0) - TypeInit::OnFini(AP_Link->mo_Data, *this); + TypeInit::OnFini(**AP_CutLink, *this); }/* - void RecvFreeIn(ZCLink* AP_Link)*/ + _NP_ void RecvFreeIn(ZCLink* AP_Link)*/ - void RecvFreeIn(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TypeSize AL_Count) + + _NP_ void RecvFreeIn ////////////////////////////////////////////// + ( + TypeSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink + ) + /////////////////////////////////////////////////////////////////// { - #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) ; + TypeInit::OnFini(**VP_NowLink, *this) ; - VP_NowLink = VP_NowLink->mp_NextLink; - }/* - __for1(TypeSize, i, AL_Count)*/ + VP_NowLink = VP_NowLink->GetNextPtr() ; + } + /*=========================*/ }/* if(TypeInit::ZEUseFini>0)*/ @@ -531,18 +525,23 @@ namespace ZNsMain { // 새로운 링크는 mp_NoUseTail 다음에 붙인다. - mp_NoUseTail->mp_NextLink = AP_HeadLink; - mp_NoUseTail = AP_TailLink; + ZCLink::JoinLink + (mp_NoUseTail, AP_HeadLink); + + mp_NoUseTail = AP_TailLink; } //else - mp_NoUseTail->mp_NextLink=0; - ml_UseSize += AL_Count ; + ml_UseSize += AL_Count ; }/* - void RecvFreeIn(ZCLink* AP_HeadLink, ZCLink* AP_TailLink, TypeSize AL_Count)*/ + _NP_ void RecvFreeIn ////////////////////////////////////////////// + ( + TypeSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink + ) + /////////////////////////////////////////////////////////////////*/ - //private: + //public : public : @@ -553,80 +552,37 @@ namespace ZNsMain 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<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 ; + DeleteHeap(); }/* ~ZtCBody()*/ void DeleteHeap() { - #ifdef _REENTRANT_MUTEX - ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex); - #endif //_REENTRANT_MUTEX - - if(ml_UseSize==0) return ; + if(ml_UseSize<1) return ; ZCLink* VP_DelLink = mp_NoUseHead; - do ////// + do /*+++++++++++++++++++++++++++*/ { mp_NoUseHead = - mp_NoUseHead->mp_NextLink ; + mp_NoUseHead->GetNextPtr() ; delete VP_DelLink; - VP_DelLink = mp_NoUseHead ; + VP_DelLink = mp_NoUseHead ; } - while(VP_DelLink!=0); + while(--ml_UseSize>0); /*+++++++*/ - ml_AllSize -= ml_UseSize; - ml_UseSize = 0 ; + ml_AllSize -= ml_UseSize; + ml_UseSize = 0 ; mp_NoUseHead = - mp_NoUseTail = 0 ; + mp_NoUseTail = 0 ; }/* void DeleteHeap()*/ @@ -643,6 +599,7 @@ namespace ZNsMain }/* TypeSize GetAllHeapSize() const*/ + TypeSize size() const { return ml_UseSize; @@ -655,13 +612,14 @@ namespace ZNsMain }/* TypeSize capacity() const*/ - //public: - }; - //template class ZtCBody + public: + };/* + template class ZtCBody*/ + public: };/* - class ZCFreeHeapSngl*/ + template<> class ZtCFreeHeapSngl< ZNsConst::CI_ListKind_Single >*/ }/* @@ -673,17 +631,19 @@ namespace ZNsMain template class ZtCSortObjList; - template /*#######################################*/ + template /*##################################################################*/ < - typename TType , - typename TTypArgu = const TType& , - typename TTypCAlloc= ZCAllocator , - typename TTypCInit = ZtCInit , - typename TTypSize = ZTypLong , - typename TMoveObj = ZNsMain:: + typename TType + , typename TTypArgu = const TType& + , typename TTypCAlloc= ZCAllocator + , typename TTypCInit = ZtCInit + , typename TTypSize = ZTypLong + , typename TMoveObj = ZNsMain:: ZtCMoveObj + , typename TFeeeHeap = ZNsIFaceEx:: + ZtCFreeHeapSngl< ZNsConst::CI_ListKind_Single > > - class ZtCSimList /*###############################*/ + class ZtCSimList /*##########################################################*/ { public: typedef TType Type ; @@ -694,30 +654,25 @@ namespace ZNsMain typedef TTypSize TypeSize ; typedef TMoveObj TypeMoveObj; public: - - - class ZCFreeHeap; + typedef typename TFeeeHeap:: + template ZtCBody ZCFreeHeap; + public: class ZCLink : public TypeAlloc { public: - template friend class ZtCSortObjList ; - friend class ZtCSimList ; - /*##########################*/ friend class ZCFreeHeap ; - + template + friend class ZtCSortObjList; ///////////// + template + friend class ZNsIFaceEx::ZtCFreeHeapSngl ; public: - - #ifdef _DEBUG - ZCCheckAlloc mo_CheckStack; - #endif //_DEBUG - + friend class ZtCSimList ; private: ZCLink* mp_NextLink; TType mo_Data ; private: - inline static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink) { // 두 개의 링크를 연결 상태로 만든다. @@ -818,7 +773,7 @@ namespace ZNsMain while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; - //end while + /*:::::::::::::::::*/ return VP_TmpLink; }/* @@ -830,7 +785,7 @@ namespace ZNsMain // TTypSize 가 object 일 경우 AL_FarNum 의 값이 이 함수에서 변하고 있으므로 // TTypSize 을 참조로 받으면 안된다. - ZCLink* VP_TmpLink=const_cast(this); + ZCLink* VP_TmpLink = const_cast(this); // 이 함수는 뒤에 const keyword 가 붙어 있는데 이것 때문에 this pointer 는 상수 포인터로 간주된다. // 윗줄에서 이 this 포인터를 비상수 포인터로 먼저 형변환하였다. @@ -838,7 +793,7 @@ namespace ZNsMain while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; - //end while + /*:::::::::::::::::*/ return VP_TmpLink; }/* @@ -889,667 +844,13 @@ namespace ZNsMain ////////////////////////////////////////////////// - class ZCFreeHeap : public ZCFreeAllocBase - { - public: - friend class ZtCSimList ; - friend class ZCLink ; - public: - - #ifdef _REENTRANT_MUTEX - ZNsMain::ZCMutexSmallInit mo_Mutex ; - #endif //_REENTRANT_MUTEX - - private: - - TTypSize ml_AllSize ; - TTypSize ml_UseSize ; - - ZCLink* mp_NoUseHeadLink; - ZCLink* mp_NoUseTailLink; - - //private: - private: - - ZCLink* GetOneLink() - { - #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_NoUseHeadLink; - - if(VP_TempLink==mp_NoUseTailLink) - { - mp_NoUseHeadLink=0; - mp_NoUseTailLink=0; - } - else - { - mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; - } - //else - - --ml_UseSize; return VP_TempLink; - }/* - ZCLink* GetOneLink()*/ - - - void GetManyLink /*#####################################################*/ - ( - TTypSize 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_NoUseHeadLink==0) - { - MakeLink(AL_LinkSize, APR_HeadLink, APR_TailLink); - } - else if(AL_LinkSize==ml_UseSize) - { - ZCLink* VP_Temp = mp_NoUseHeadLink; - - while(true) - { - if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(VP_Temp->mo_Data, *this); - - if(VP_Temp==mp_NoUseTailLink) - { break; } - - VP_Temp = VP_Temp->mp_NextLink; - } - //while(true) - - APR_HeadLink = mp_NoUseHeadLink ; - APR_TailLink = mp_NoUseTailLink ; - - mp_NoUseHeadLink =0; - mp_NoUseTailLink =0; - - ml_UseSize=0; - } - else if(AL_LinkSize0) - TypeInit::OnInit(mp_NoUseHeadLink->mo_Data, *this); - - for(TTypSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count) - { - // VL_Count 가 2 부터 시작함으로 AL_LinkSize-1 번 순환한다. - // 그래야지 AL_LinkSize 개의 링크를 자를 수 있다. - - mp_NoUseHeadLink = mp_NoUseHeadLink->mp_NextLink; - - if(TypeInit::ZEUseInit>0) - TypeInit::OnInit(mp_NoUseHeadLink->mo_Data, *this); - } - //for(TTypSize VL_Count=2; VL_Count<=AL_LinkSize; ++VL_Count) - - APR_TailLink = mp_NoUseHeadLink; - mp_NoUseHeadLink= mp_NoUseHeadLink->mp_NextLink; - - ml_UseSize -= AL_LinkSize; - } - else // AL_LinkSize > ml_UseSize - { - ZCLink* VP_Temp=mp_NoUseHeadLink; - - while(true) - { - if(VP_Temp==mp_NoUseTailLink) - { break; } - - VP_Temp=VP_Temp->mp_NextLink ; - } - //while(true) - - APR_HeadLink = mp_NoUseHeadLink; - - // MakeLink() 에서 TypeInit::OnInit() 가 호출됨. - MakeLink( AL_LinkSize - ml_UseSize , - mp_NoUseTailLink->mp_NextLink, - APR_TailLink - /*****/ ); - - mp_NoUseHeadLink=0; - mp_NoUseTailLink=0; - ml_UseSize =0; - } - //else // AL_LinkSize > ml_UseSize - }/* - void GetManyLink - ( - TTypSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink - ) - ########################################################################*/ - - - void GetManyLinkCopy /*////////////////////////////*/ - ( - ZCLink* AP_LinkOrgin, TTypSize 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_NoUseHeadLink==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_NoUseHeadLink->mo_Data = AP_LinkOrgin->mo_Data; - APR_HeadCopy = mp_NoUseHeadLink ; - - while(--AL_FarNum>=0) - { - mp_NoUseHeadLink= mp_NoUseHeadLink->mp_NextLink ; - AP_LinkOrgin = AP_LinkOrgin->mp_NextLink ; - - mp_NoUseHeadLink->mo_Data = AP_LinkOrgin->mo_Data; - } - //while(--AL_FarNum>=0) - - APR_TailCopy=mp_NoUseHeadLink; - - // 이 부분에서 mp_NoUseHeadLink 는 잘려나가는 마지막 링크가 된다. - // 그러므로 다시 다음 링크로 초기화한다. - - mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; - - if(mp_NoUseHeadLink==0) - { - mp_NoUseTailLink=0; - - // mp_NoUseHeadLink == 0 인데 mp_NoUseTailLink !=0 이라면 - // 나중에 자칫 무한루프에 빠질 수 있다. - // 따라서 위 코드를 두었다. - } - //if(mp_NoUseHeadLink==0) - } - else // AL_FarNum > ml_UseSize - { - mp_NoUseHeadLink->mo_Data = AP_LinkOrgin->mo_Data ; - APR_HeadCopy = mp_NoUseHeadLink ; - - while(mp_NoUseHeadLink!=mp_NoUseTailLink) - { - mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; - AP_LinkOrgin =AP_LinkOrgin ->mp_NextLink; - - mp_NoUseHeadLink->mo_Data = AP_LinkOrgin->mo_Data; - } - //while(mp_NoUseHeadLink!=mp_NoUseTailLink) - - MakeLinkCopy /*++++++++++++++++++++++++++++++++++++++++++++*/ - ( - AP_LinkOrgin ->mp_NextLink, AL_FarNum-ml_UseSize , - mp_NoUseTailLink->mp_NextLink, APR_TailCopy - ); - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - mp_NoUseHeadLink = - mp_NoUseTailLink = 0; - ml_UseSize = 0; - } - //else // AL_FarNum > ml_UseSize - }/* - void GetManyLinkCopy //////////////////////////////// - ( - ZCLink* AP_LinkOrgin, TTypSize AL_FarNum , - ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy - ) - ///////////////////////////////////////////////////*/ - - - void MakeLink /////////////////////////////////////// - ( - TTypSize 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 - - DeleteAllInHeap(); 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) - { - DeleteAllInHeap(); - - // 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 /////////////////////////////////////// - ( - TTypSize AL_MakeSize , - ZCLink*& APR_HeadLink, - ZCLink*& APR_TailLink - ) - ///////////////////////////////////////////////////*/ - - - void MakeLinkCopy /////////////////////////////////// - ( - ZCLink* AP_LinkOrgin, TTypSize 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 ; - DeleteAllInHeap() ; - - 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) - { - DeleteAllInHeap(); return; - } - //if(APR_HeadCopy==APR_TailCopy) - - APR_HeadCopy=APR_HeadCopy->mp_NextLink; - } - while(true); - } - //if(VB_IsHeapOver==true) - }/* - void MakeLinkCopy /////////////////////////////////// - ( - ZCLink* AP_LinkOrgin, TTypSize AL_FarNum, - ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy - ) - ///////////////////////////////////////////////////*/ - - - void ReceiveLink(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_NoUseHeadLink = - mp_NoUseTailLink = AP_Link ; - } - else - { - // 새로운 링크는 mp_NoUseTailLink 다음에 붙인다. - - mp_NoUseTailLink->mp_NextLink= AP_Link; - mp_NoUseTailLink = AP_Link; - } - //else - - if(TypeInit::ZEUseFini>0) - TypeInit::OnFini(AP_Link->mo_Data, *this); - } - //void ReceiveLink(ZCLink* AP_Link) - - void ReceiveLink(TTypSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink) - { - #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_NoUseHeadLink = AP_HeadLink ; - mp_NoUseTailLink = AP_TailLink ; - } - else - { - // 새로운 링크는 mp_NoUseTailLink 다음에 붙인다. - - mp_NoUseTailLink->mp_NextLink = AP_HeadLink; - mp_NoUseTailLink = AP_TailLink; - } - //else - - mp_NoUseTailLink->mp_NextLink=0; - ml_UseSize += AL_Count ; - } - //void ReceiveLink(TTypSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink) - - - //private: - public : - - - ZCFreeHeap() - { - ml_AllSize = - ml_UseSize = 0 ; - - mp_NoUseHeadLink = - mp_NoUseTailLink = 0 ; - - ZNsMain::GetCHeapAllocList().AddFreeAllocBase(*this); - } - //ZCFreeHeap() - - ~ZCFreeHeap() - { - #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<0 ) - - #endif //_SIMLIST_FREE_STORE_LOG_ - - return ; - - #endif //!_SIMLIST_FREE_STORE_CHECK_ - - if(ml_UseSize==0) return ; - - ZCLink* VP_DelLink=mp_NoUseHeadLink; - - do ////// - { - mp_NoUseHeadLink = - mp_NoUseHeadLink->mp_NextLink; - - delete VP_DelLink; - - VP_DelLink = mp_NoUseHeadLink ; - } - while(VP_DelLink!=0); - - ml_AllSize -= ml_UseSize ; - ml_UseSize = 0 ; - mp_NoUseHeadLink = - mp_NoUseTailLink = 0 ; - } - //~ZCFreeHeap() - - - void DeleteAllInHeap() - { - #ifdef _REENTRANT_MUTEX - ZNsMain::ZCMutexSmallLock VO_ZCMutexSmallLock(mo_Mutex); - #endif //_REENTRANT_MUTEX - - if(ml_UseSize==0) return ; - - ZCLink* VP_DelLink=mp_NoUseHeadLink; - - do ////// - { - mp_NoUseHeadLink = - mp_NoUseHeadLink->mp_NextLink; - - delete VP_DelLink; - - VP_DelLink = mp_NoUseHeadLink ; - } - while(VP_DelLink!=0); - - ml_AllSize -= ml_UseSize; - ml_UseSize = 0 ; - mp_NoUseHeadLink = - mp_NoUseTailLink = 0 ; - } - //void DeleteAllInHeap() - - - TTypSize GetUseHeapSize() const - { - return ml_UseSize; - } - //TTypSize GetUseHeapSize() const - - TTypSize GetAllHeapSize() const - { - return ml_AllSize; - } - //TTypSize GetAllHeapSize() const - - long size() const - { - return ml_UseSize; - } - //long size() const - - long GetMemSize() const - { - return ml_UseSize*sizeof(ZCLink); - } - //long GetMemSize() const - - //public: - }; - //class ZCFreeHeap - - - //////////////////////////////////////////////// - - /************ end class ZCFreeHeap ************/ - - //////////////////////////////////////////////// - - //public : protected: - TTypSize ml_Size ; - ZCLink* mp_HeadLink; - ZCLink* mp_TailLink; + TTypSize ml_Size ; + ZCLink* mp_HeadLink ; + ZCLink* mp_TailLink ; + ZCFreeHeap mo_FreeObjt ; /////////////////////////////////////////////////////////////// @@ -1569,7 +870,7 @@ namespace ZNsMain ZCLink* VP_HeadLink=0; ZCLink* VP_TailLink=0; - GetCFreeHeap().GetManyLinkCopy + GetCFreeHeap().SendFreeOutCopy ( const_cast(AP_CopyLink), // g++ 에서는 반드시 AP_CopyLink 부분을 () 로 묶어 줄 것. AL_FarNum , @@ -1739,7 +1040,7 @@ namespace ZNsMain ZCLink* VP_HeadLink=0; ZCLink* VP_TailLink=0; - GetCFreeHeap().GetManyLink + GetCFreeHeap().SendFreeOut (AL_DefaultSize, VP_HeadLink, VP_TailLink); ZCLink::MakeCircle( VP_HeadLink, VP_TailLink ); @@ -1804,7 +1105,7 @@ namespace ZNsMain virtual ~ZtCSimList() { - DeleteAll(); + DeleteAll(); GetCFreeHeap().DeleteHeap(); }/* virtual ~ZtCSimList()*/ @@ -1871,7 +1172,7 @@ namespace ZNsMain void AddHead(TypeArg AR_Type) { - ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink() ; + ZCLink* VP_AddLink = GetCFreeHeap().SendFreeOut() ; #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// @@ -1898,7 +1199,7 @@ namespace ZNsMain ZCLink* AddHeadDefault() { - ZCLink* VP_AddLink=GetCFreeHeap().GetOneLink(); + ZCLink* VP_AddLink=GetCFreeHeap().SendFreeOut(); if(++ml_Size==1) // ml_Size==0 { @@ -1917,7 +1218,7 @@ namespace ZNsMain void AddTail(TypeArg AR_Type) { - ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink(); + ZCLink* VP_AddLink = GetCFreeHeap().SendFreeOut(); #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// @@ -1944,7 +1245,7 @@ namespace ZNsMain ZCLink* AddTailDefault() { - ZCLink* VP_AddLink = GetCFreeHeap().GetOneLink(); + ZCLink* VP_AddLink = GetCFreeHeap().SendFreeOut(); if(++ml_Size==1) // ml_Size==0 { @@ -2298,7 +1599,7 @@ namespace ZNsMain ZCLink* VP_DelLink= mp_HeadLink ; mp_HeadLink = mp_HeadLink->mp_NextLink; - GetCFreeHeap().ReceiveLink(VP_DelLink); + GetCFreeHeap().RecvFreeIn(VP_DelLink); if(--ml_Size==0) { @@ -2350,7 +1651,7 @@ namespace ZNsMain mp_HeadLink->GetNextPtr(ml_Size-1); mp_TailLink->mp_NextLink=0 ; - GetCFreeHeap().ReceiveLink(VP_CutLink); + GetCFreeHeap().RecvFreeIn(VP_CutLink); }/* void DeleteTail()*/ @@ -2363,7 +1664,7 @@ namespace ZNsMain if(AL_DelSize==ml_Size) { - GetCFreeHeap().ReceiveLink + GetCFreeHeap().RecvFreeIn (ml_Size, mp_HeadLink, mp_TailLink); mp_HeadLink=0 ; mp_TailLink=0 ; @@ -2375,7 +1676,7 @@ namespace ZNsMain ZCLink* VP_NewTail= mp_HeadLink-> GetNextPtr( ml_Size-AL_DelSize-1 ); - GetCFreeHeap().ReceiveLink + GetCFreeHeap().RecvFreeIn (AL_DelSize, VP_NewTail->mp_NextLink, mp_TailLink); mp_TailLink = VP_NewTail ; @@ -2400,7 +1701,7 @@ namespace ZNsMain } #endif //_DEBUG - GetCFreeHeap().ReceiveLink + GetCFreeHeap().RecvFreeIn ( CutLink(AP_PrevLink, AP_CutLink) ); }/* void Delete(ZCLink* AP_PrevLink, ZCLink* AP_CutLink)*/ @@ -2422,7 +1723,7 @@ namespace ZNsMain } #endif //_DEBUG - GetCFreeHeap().ReceiveLink + GetCFreeHeap().RecvFreeIn ( CutLink(AP_PrevLink, AP_CutLink, AL_CutPos) ); }/* void Delete(ZCLink* AP_PrevLink, ZCLink* AP_CutLink, TTypSize AL_CutPos)*/ @@ -2478,7 +1779,7 @@ namespace ZNsMain { if(ml_Size==0) {return;} - GetCFreeHeap().ReceiveLink + GetCFreeHeap().RecvFreeIn (ml_Size, mp_HeadLink, mp_TailLink); mp_HeadLink = @@ -2488,11 +1789,11 @@ namespace ZNsMain void DeleteAll()*/ - static void DeleteHeap() + void DeleteHeap() { GetCFreeHeap().DeleteHeap(); }/* - static void DeleteHeap()*/ + void DeleteHeap()*/ TTypSize Find(const ZCLink* AP_pSearchLink, TTypSize AL_FirstFindIndex=1) const @@ -2614,11 +1915,11 @@ namespace ZNsMain const ZCLink* GetLinkPtr(TTypSize AL_Index) const*/ - static ZCFreeHeap& GetCFreeHeap() + ZCFreeHeap& GetCFreeHeap() { - static ZCFreeHeap SO_CLinkHeap; return SO_CLinkHeap; + return mo_FreeObjt; }/* - static ZCFreeHeap& GetCFreeHeap()*/ + ZCFreeHeap& GetCFreeHeap()*/ inline TTypSize GetSize() const @@ -2949,17 +2250,20 @@ namespace ZNsMain public: };/* - template ########################################### + template ###################################################################### < - typename TType , - typename TTypArgu = const TType& , - typename TTypCAlloc= ZCAllocator , - typename TTypCInit = ZtCInit , - typename TTypSize = ZTypLong , - typename TMoveObj = ZNsMain:: + typename TType + , typename TTypArgu = const TType& + , typename TTypCAlloc= ZCAllocator + , typename TTypCInit = ZtCInit + , typename TTypSize = ZTypLong + , typename TMoveObj = ZNsMain:: ZtCMoveObj + , typename TFeeeHeap = ZNsIFaceEx:: + ZtCFreeHeapSngl< ZNsConst::CI_ListKind_Single > > - class ZtCSimList #################################*/ + class ZtCSimList ##########################################################*/ + }/* namespace ZNsMain*/