From c0cc5540b593585ef08da73dfb7c198eb1917cf9 Mon Sep 17 00:00:00 2001 From: sauron Date: Fri, 3 Oct 2025 04:31:25 +0900 Subject: [PATCH] commit 2025-10-03 04:31 add RecvFreeIn() etc in ZtCBaseList : ZCppMain/ZMainHead.H --- ZCppMain/ZMainHead.H | 318 ++++++++++++++++++++++++++++++--------- ZCppMainTest/ZtCBaseList_000.cpp | 174 ++++++++++++++------- 2 files changed, 365 insertions(+), 127 deletions(-) diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index 64d38ce..496300d 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -5390,65 +5390,100 @@ namespace ZNsMain }/* TypeChild& GetChildObj()*/ - private : + protected: - _VT_ ZCLink* NewLink() + ZCLink* NewLink() { - if(TTypeCRTP::ZEUseCRTP<1) return new ZCLink; - - return GetChildObj().NewLink(); + return new ZCLink; }/* - _VT_ ZCLink* NewLink()*/ + ZCLink* NewLink()*/ - _VT_ ZCLink* NewLink(TypeArg AO_ArgData) + ZCLink* NewLink(TypeArg AO_ArgData) { - if(TTypeCRTP::ZEUseCRTP<1) - { return new ZCLink(AO_ArgData); } - - return GetChildObj().NewLink(AO_ArgData); + return new ZCLink(AO_ArgData); }/* - _VT_ ZCLink* NewLink(TypeArg AO_ArgData)*/ + ZCLink* NewLink(TypeArg AO_ArgData)*/ - _VT_ void NewLink - (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) + void NewLink //////////////////////////////////////// + ( + TypeSize AL_NeedCnt , + ZCLink*& APR_HeadLink , + ZCLink*& APR_TailLink + ) + ///////////////////////////////////////////////////// { - if(TTypeCRTP::ZEUseCRTP<1) + APR_HeadLink = new ZCLink; + + ZCLink* VP_MakeLink = 0 ; + ZCLink* VP_TailLink = APR_HeadLink; + + while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환 { - APR_HeadLink = new ZCLink; + // AL_NeedCnt - 1 번 순환 - ZCLink* VP_MakeLink = 0 ; - ZCLink* VP_TailLink = APR_HeadLink; + VP_MakeLink = new ZCLink; - 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; return; + ZCLink::JoinLink + (VP_TailLink, VP_MakeLink); + VP_TailLink = VP_MakeLink ; }/* - if(TTypeCRTP::ZEUseCRTP<1)*/ + while(--AL_NeedCnt>0)*/ - return GetChildObj().NewLink - (AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink)); + APR_TailLink = VP_TailLink; }/* - _VT_ void NewLink - (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) - */ - _VT_ void DelLink(ZCLink* AP_DelLink) + void NewLink //////////////////////////////////////// + ( + TypeSize AL_NeedCnt , + ZCLink*& APR_HeadLink , + ZCLink*& APR_TailLink + ) + ///////////////////////////////////////////////////*/ + + + void NewLinkCopy ////////////////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// { - if(TTypeCRTP::ZEUseCRTP<1) - { delete AP_DelLink; return; } + // 총 AL_FarNum+1 개의 링크가 만들어짊 - GetChildObj().DelLink(AP_DelLink); + 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; }/* - _VT_ void DelLink(ZCLink* AP_DelLink)*/ + void NewLinkCopy ////////////////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////*/ + + + void DelLink(ZCLink* AP_DelLink) + { + delete AP_DelLink; + }/* + void DelLink(ZCLink* AP_DelLink)*/ void DelLink ////////////////////////////////////////// ( @@ -5458,25 +5493,114 @@ namespace ZNsMain ) /////////////////////////////////////////////////////// { + 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)*/ + } + /////////////////////////////////////////////////////// + + /*protected:*/ + private : + + _VT_ ZCLink* SendFreeOut() + { + if(TTypeCRTP::ZEUseCRTP<1) return NewLink(); + + return GetChildObj().SendFreeOut(); + }/* + _VT_ ZCLink* SendFreeOut()*/ + + _VT_ ZCLink* SendFreeOut(TypeArg AO_ArgData) + { + if(TTypeCRTP::ZEUseCRTP<1) + { return NewLink(AO_ArgData); } + + return GetChildObj().SendFreeOut(AO_ArgData); + }/* + _VT_ ZCLink* SendFreeOut(TypeArg AO_ArgData)*/ + + _VT_ void SendFreeOut + (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) + { if(TTypeCRTP::ZEUseCRTP<1) { - ZCLink* VP_DelLink = AP_CutHead; + NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); return; + }/* + if(TTypeCRTP::ZEUseCRTP<1)*/ - __for0(TypeSize, i, AL_CutCnt) - { - AP_CutHead = AP_CutHead->GetNextPtr() ; + return GetChildObj().SendFreeOut + (AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink)); + }/* + _VT_ void SendFreeOut + (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) + */ - delete VP_DelLink; VP_DelLink=AP_CutHead; - }/* - __for0(TypeSize, i, AL_CutCnt)*/ + _VT_ void SendFreeOutCopy /*///////////////////////*/ + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// + { + // 총 AL_FarNum+1 개의 링크가 만들어짊 + if(TTypeCRTP::ZEUseCRTP<1) + { + NewLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); return; + }/* + if(TTypeCRTP::ZEUseCRTP<1)*/ + + return GetChildObj().SendFreeOutCopy + (AP_LinkOrgin, AL_FarNum, RR(APR_HeadCopy), RR(APR_TailCopy)); + }/* + _VT_ void SendFreeOutCopy ///////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////*/ + + + _VT_ void RecvFreeIn(ZCLink* AP_DelLink) + { + if(TTypeCRTP::ZEUseCRTP<1) + { DelLink(AP_DelLink); return; } + + GetChildObj().RecvFreeIn(AP_DelLink); + }/* + _VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/ + + _VT_ void RecvFreeIn ////////////////////////////////// + ( + TypeSize AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////// + { + if(TTypeCRTP::ZEUseCRTP<1) + { + DelLink + (AL_CutCnt, AP_CutHead, AP_CutTail); return; }/* if(TTypeCRTP::ZEUseCRTP<1)*/ - GetChildObj().DelLink(AL_CutCnt, AP_CutHead, AP_CutTail); - } - /////////////////////////////////////////////////////// + GetChildObj().RecvFreeIn(AL_CutCnt, AP_CutHead, AP_CutTail); + }/* + _VT_ void RecvFreeIn ////////////////////////////////// + ( + TypeSize AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////*/ /*private :*/ private : @@ -5558,38 +5682,82 @@ namespace ZNsMain ZtCBaseList& operator=(const ZtCBaseList& rhs) { - // 초기에 DeleteAll() 로 다 삭제하고, 필요한 만큼 - // AddTail() 을 호출하고 있는데, 최적화의 여지가 있다. + if(this==&rhs) return *this; - if(this==&rhs) return *this; this->DeleteAll(); + if(rhs.size()<1) + { this->DeleteAll(); return *this; } - ZCLink* VP_NowLink = rhs.mp_HeadLink ; + TypeSize VL_MinusSize = this->size() - rhs.size() ; + + if (VL_MinusSize>0) + { + RecvFreeIn //////////////////////////////////////// + ( + VL_MinusSize, + mp_HeadLink , + mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1) + ); + /////////////////////////////////////////////////// + + ml_LinkCnt -= VL_MinusSize; + } + else if(VL_MinusSize<0) + { + ZCLink* VP_HeadLink=0; + ZCLink* VP_TailLink=0; + + SendFreeOut //////////////////////////////////////// + ( + -VL_MinusSize , + RR(VP_HeadLink) , + RR(VP_TailLink) + ); + /////////////////////////////////////////////////// + + if(ml_LinkCnt>0) + { + ZCLink::JoinLink(mp_TailLink, VP_HeadLink); + ZCLink::MakeRing(mp_HeadLink, VP_TailLink); + + mp_TailLink = VP_TailLink ; + } + else + { + mp_HeadLink = VP_HeadLink ; + mp_TailLink = VP_TailLink ; + + ZCLink::MakeRing(mp_HeadLink, VP_TailLink); + }/* + else*/ + + ml_LinkCnt += (-VL_MinusSize); + }/* + else if(VL_MinusSize<0)*/ + + + ZCLink* VP_RhsLink = rhs.mp_HeadLink ; + ZCLink* VP_LhsLink = mp_HeadLink ; __for0(TypeSize, i, rhs.size()) { - this->AddTail(VP_NowLink->mo_Data) ; + **VP_LhsLink = **VP_RhsLink ; - VP_NowLink = VP_NowLink->mp_NextLink; + VP_RhsLink = VP_RhsLink->mp_NextLink; + VP_LhsLink = VP_LhsLink->mp_NextLink; }/* __for0(TypeSize, i, rhs.size())*/ + + return *this; }/* ZtCBaseList& operator=(const ZtCBaseList& rhs)*/ void DeleteAll() { - ZCLink* VP_NowLink = mp_HeadLink; + if(ml_LinkCnt<1) return; - while(--ml_LinkCnt>=0) - { - ZCLink* VP_NextLink = - VP_NowLink->mp_NextLink ; - - DelLink(VP_NowLink); - - VP_NowLink = VP_NextLink; - }/* - while(--ml_LinkCnt>=0)*/ + RecvFreeIn + (ml_LinkCnt, mp_HeadLink, mp_TailLink); mp_HeadLink =0 ; mp_TailLink =0 ; @@ -5599,9 +5767,9 @@ namespace ZNsMain TypeData& AddHead() - { return AddHeadLink(NewLink())->mo_Data; } + { return AddHeadLink(SendFreeOut())->mo_Data; } TypeData& AddTail() - { return AddTailLink(NewLink())->mo_Data; } + { return AddTailLink(SendFreeOut())->mo_Data; } TypeData& AddHead(TypeArg AO_ArgData) /*########################*/ @@ -5609,7 +5777,7 @@ namespace ZNsMain #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { - ZCLink* VP_NewNode = NewLink(AO_ArgData); + ZCLink* VP_NewNode = SendFreeOut(AO_ArgData); TypeMoveObj::Exec(VP_NewNode->mo_Data, AO_ArgData); @@ -5626,7 +5794,7 @@ namespace ZNsMain #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { - ZCLink* VP_NewNode = NewLink(AO_ArgData); + ZCLink* VP_NewNode = SendFreeOut(AO_ArgData); TypeMoveObj::Exec(VP_NewNode->mo_Data, AO_ArgData); @@ -5646,7 +5814,7 @@ namespace ZNsMain ZCLink* VP_TempLink = mp_HeadLink ; mp_HeadLink = mp_HeadLink->mp_NextLink ; - DelLink(VP_TempLink); + RecvFreeIn(VP_TempLink); if(--ml_LinkCnt<1) { @@ -5666,7 +5834,7 @@ namespace ZNsMain ZCLink* VP_TempLink = mp_TailLink ; mp_TailLink = mp_TailLink->mp_PrevLink ; - DelLink(VP_TempLink); + RecvFreeIn(VP_TempLink); if(--ml_LinkCnt<1) { diff --git a/ZCppMainTest/ZtCBaseList_000.cpp b/ZCppMainTest/ZtCBaseList_000.cpp index d797a03..f0dbca0 100644 --- a/ZCppMainTest/ZtCBaseList_000.cpp +++ b/ZCppMainTest/ZtCBaseList_000.cpp @@ -88,10 +88,7 @@ namespace ZNsMain class ZCBaseListEx10 : public ZtCBaseList < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP > @@ -100,10 +97,7 @@ namespace ZNsMain typedef ZtCBaseList /////////////////////////////////////////////////////// < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP > @@ -111,10 +105,7 @@ namespace ZNsMain friend class ZtCBaseList ////////////////////////////////////////////////// < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP >; @@ -124,29 +115,62 @@ namespace ZNsMain private: - _VT_ ZCLink* NewLink() + _VT_ ZCLink* SendFreeOut() { - cout<<"** ZCBaseListEx10 : NewLink()"<ZCBaseList::NewLink(); }/* - _VT_ ZCLink* NewLink()*/ + _VT_ ZCLink* SendFreeOut()*/ - _VT_ ZCLink* NewLink(CStringBase& AO_ArgData) + _VT_ ZCLink* SendFreeOut(CStringBase& AO_ArgData) { - cout<<"** ZCBaseListEx10 : NewLink(TypeArg)"<ZCBaseList::NewLink(AO_ArgData); }/* - _VT_ ZCLink* NewLink(CStringBase& AO_ArgData)*/ + _VT_ ZCLink* SendFreeOut(CStringBase& AO_ArgData)*/ - _VT_ void DelLink(ZCLink* AP_DelLink) + _VT_ void SendFreeOut + (ZTypLong AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) { - cout<<"** ZCBaseListEx10 : DelLink(ZCLink*)"<ZCBaseList::NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); + } + + _VT_ void SendFreeOutCopy /*///////////////////////*/ + ( + ZCLink* AP_LinkOrgin, ZTypLong AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// + { + cout<<"** ZCBaseListEx10 : SendFreeOut(ZCLink*, ZTypLong, ZCLink*&, ZCLink*&)"<ZCBaseList::NewLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); + } + + _VT_ void RecvFreeIn(ZCLink* AP_DelLink) + { + cout<<"** ZCBaseListEx10 : RecvFreeIn(AP_DelLink)"<ZCBaseList::DelLink(AP_DelLink); }/* - _VT_ void DelLink(ZCLink* AP_DelLink)*/ + _VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/ + + _VT_ void RecvFreeIn ////////////////////////////////// + ( + ZTypLong AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////// + { + cout<<"** ZCBaseListEx10 : RecvFreeIn(ZTypLong, AP_CutHead, AP_CutTail)"<ZCBaseList::DelLink(AL_CutCnt, AP_CutHead, AP_CutTail); + } private: };/* @@ -155,10 +179,7 @@ namespace ZNsMain class ZCBaseListEx11 : public ZtCBaseList < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP > @@ -167,10 +188,7 @@ namespace ZNsMain typedef ZtCBaseList /////////////////////////////////////////////////////// < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP > @@ -178,10 +196,7 @@ namespace ZNsMain friend class ZtCBaseList ////////////////////////////////////////////////// < - CStringBase - , CStringBase& - , ZCAllocator - , ZTypLong + CStringBase, CStringBase&, ZCAllocator, ZTypLong , ZNsMain::ZtCMoveObj , ZNsType::ZtCTypeCRTP >; @@ -191,29 +206,62 @@ namespace ZNsMain private: - _VT_ ZCLink* NewLink() + _VT_ ZCLink* SendFreeOut() { - cout<<"** ZCBaseListEx11 : NewLink()"<ZCBaseList::NewLink(); }/* - _VT_ ZCLink* NewLink()*/ + _VT_ ZCLink* SendFreeOut()*/ - _VT_ ZCLink* NewLink(CStringBase& AO_ArgData) + _VT_ ZCLink* SendFreeOut(CStringBase& AO_ArgData) { - cout<<"** ZCBaseListEx11 : NewLink(TypeArg)"<ZCBaseList::NewLink(AO_ArgData); }/* - _VT_ ZCLink* NewLink(CStringBase& AO_ArgData)*/ + _VT_ ZCLink* SendFreeOut(CStringBase& AO_ArgData)*/ - _VT_ void DelLink(ZCLink* AP_DelLink) + _VT_ void SendFreeOut + (ZTypLong AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) { - cout<<"** ZCBaseListEx11 : DelLink(ZCLink*)"<ZCBaseList::NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); + } + + _VT_ void SendFreeOutCopy /*///////////////////////*/ + ( + ZCLink* AP_LinkOrgin, ZTypLong AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// + { + cout<<"** ZCBaseListEx11 : SendFreeOut(ZCLink*, ZTypLong, ZCLink*&, ZCLink*&)"<ZCBaseList::NewLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); + } + + _VT_ void RecvFreeIn(ZCLink* AP_DelLink) + { + cout<<"** ZCBaseListEx11 : RecvFreeIn(AP_DelLink)"<ZCBaseList::DelLink(AP_DelLink); }/* - _VT_ void DelLink(ZCLink* AP_DelLink)*/ + _VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/ + + _VT_ void RecvFreeIn ////////////////////////////////// + ( + ZTypLong AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////// + { + cout<<"** ZCBaseListEx11: RecvFreeIn(ZTypLong, AP_CutHead, AP_CutTail)"<ZCBaseList::DelLink(AL_CutCnt, AP_CutHead, AP_CutTail); + } private: };/* @@ -286,15 +334,37 @@ namespace ZNsMain VO_CIntList.IterElement(StFunctor6::ShowElement, ZftMCP(VO_CHelpObj), VO_CHelpObj ); - ZCBaseListEx10 VO_ZCBaseListEx10; - ZCBaseListEx11 VO_ZCBaseListEx11; + cout<