From 8f8ddb9460042227d5b92b49ec9cbe6a2ece48bb Mon Sep 17 00:00:00 2001 From: sauron Date: Sun, 12 Oct 2025 00:58:51 +0900 Subject: [PATCH] commit 2025-10-12 00:58 add ZtCObjList::mp_TailLink : ZCppMain/ZtCObjList.H --- ZCppMain/ZMainHead.H | 77 +- ZCppMain/ZtCObjList.H | 2920 ++++++++++++++++++--------------------- ZCppMainTest/ZtCObjList_000.cpp | 8 +- 3 files changed, 1382 insertions(+), 1623 deletions(-) diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index ea8b3d9..b32413c 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -6331,14 +6331,6 @@ namespace ZNsMain }/* _VT_ ZCLink* SendFreeOut() const*/ - _VT_ ZCLink* SendFreeOut(TypeArg AO_ArgData) const - { - if(TTypeCRTP::ZEUseCRTP<1) - { return NewLink(AO_ArgData); } - - return GetChildObj().SendFreeOut(AO_ArgData); - }/* - _VT_ ZCLink* SendFreeOut(TypeArg AO_ArgData) const*/ _VT_ void SendFreeOut (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) const @@ -6848,7 +6840,7 @@ namespace ZNsMain #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { - ZCLink* VP_NewNode = SendFreeOut(AO_ArgData); + ZCLink* VP_NewNode = SendFreeOut(); TypeMoveObj::Exec(**VP_NewNode, AO_ArgData); @@ -6865,7 +6857,7 @@ namespace ZNsMain #if(_CODE_NEW_) if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { - ZCLink* VP_NewNode = SendFreeOut(AO_ArgData); + ZCLink* VP_NewNode = SendFreeOut(); TypeMoveObj::Exec(*VP_NewNode, AO_ArgData); @@ -7950,7 +7942,6 @@ namespace ZNsMain const ZCLink& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} - ZCLinkOpt HeadOpt(){return ZCLinkOpt(mp_HeadLink);} ZCLinkOpt TailOpt(){return ZCLinkOpt(mp_TailLink);} @@ -7981,6 +7972,70 @@ namespace ZNsMain const ZCLink& _0(TypeSize AI_Distance) const{return TailRef(AI_Distance);} + ZCDataOpt GetDataOpt(TypeSize AI_Index) // 1부터 시작. + { + return DataOpt(AI_Index-1); + }/* + ZCDataOpt GetDataOpt(TypeSize AI_Index)*/ + + const ZCDataOpt GetDataOpt(TypeSize AI_Index) const + { + return DataOpt(AI_Index-1); + }/* + const ZCDataOpt GetDataOpt(TypeSize AI_Index) const*/ + + + ZCDataOpt DataOpt(TypeSize AI_Index) // 1부터 + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Index-1)); + }/* + ZCDataOpt DataOpt(TypeSize AI_Index)*/ + + const ZCDataOpt DataOpt(TypeSize AI_Index) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Index-1)); + }/* + const ZCDataOpt DataOpt(TypeSize AI_Index) const*/ + + + ZCDataOpt DataOptHead(TypeSize AI_Distance=0) + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Distance)); + }/* + ZCDataOpt DataOptHead(TypeSize AI_Distance=0)*/ + + ZCDataOpt DataOptTail(TypeSize AI_Distance=0) + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**TailPtr(AI_Distance)); + }/* + ZCDataOpt DataOptTail(TypeSize AI_Distance=0)*/ + + + const ZCDataOpt DataOptHead(TypeSize AI_Distance=0) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Distance)); + }/* + const ZCDataOpt DataOptHead(TypeSize AI_Distance=0) const*/ + + const ZCDataOpt DataOptTail(TypeSize AI_Distance=0) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**TailPtr(AI_Distance)); + }/* + const ZCDataOpt DataOptTail(TypeSize AI_Distance=0) const*/ + + /***/ ZCLinkOpt GetLinkOpt(TypeSize AI_Index) { if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); } const ZCLinkOpt GetLinkOpt(TypeSize AI_Index) const diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index c95066f..b547c56 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -1030,946 +1030,563 @@ namespace ZNsMain /******************************************************************/ protected: ZCLink* mp_HeadLink; + ZCLink* mp_TailLink; TypeSize ml_LinkSize; mutable ZCFreeHeap mo_FreeObjt; protected: - void JoinAfter(ZCLink* AP_LinkNew, ZCLink* AP_LinkStd) + ZCLink* AddTailLink(ZCLink* AP_NewLink) { - // AP_LinkNew 를 AP_LinkStd 뒤에 삽입한다. - // AL_PosStd==0 이면 맨 앞에 삽입한다. - - if(AP_LinkStd==0) + if(ml_LinkSize<1) { - // 맨 앞에 삽입. + mp_HeadLink = AP_NewLink; + mp_TailLink = AP_NewLink; - if(++ml_LinkSize==1) - { - mp_HeadLink =AP_LinkNew ; - mp_HeadLink->mp_NextLink=mp_HeadLink ; - mp_HeadLink->mp_PrevLink=mp_HeadLink ; - } - else - { - ZCLink* VP_TailLink = mp_HeadLink->mp_PrevLink ; - - ZCLink::JoinLink(AP_LinkNew, mp_HeadLink); - ZCLink::MakeRing(AP_LinkNew, VP_TailLink); - - mp_HeadLink=AP_LinkNew; - }/* - else*/ - } - else - { - ++ml_LinkSize; - - ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ; - - ZCLink::JoinLink(AP_LinkStd, AP_LinkNew); - ZCLink::JoinLink(AP_LinkNew, AP_NextStd); - }/* - else*/ - }/* - void JoinAfter(ZCLink* AP_LinkNew, ZCLink* AP_LinkStd)*/ - - - void JoinBefore(ZCLink* AP_LinkNew, ZCLink* AP_LinkStd) - { - // AP_LinkNew 를 AP_LinkStd 앞에 삽입한다. - // AL_PosStd==0 이면 맨 뒤에 삽입한다. - - if(AP_LinkStd==0) - { - // 맨 뒤에 삽입. - - if(++ml_LinkSize==1) - { - mp_HeadLink =AP_LinkNew ; - mp_HeadLink->mp_NextLink=mp_HeadLink; - mp_HeadLink->mp_PrevLink=mp_HeadLink; - } - else - { - ZCLink* VP_TailLink = mp_HeadLink->mp_PrevLink ; - - ZCLink::JoinLink(VP_TailLink, AP_LinkNew); - ZCLink::MakeRing(mp_HeadLink, AP_LinkNew); - }/* - else*/ - } - else - { - ++ml_LinkSize; - - ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ; - - ZCLink::JoinLink(AP_PrevStd, AP_LinkNew); - ZCLink::JoinLink(AP_LinkNew, AP_LinkStd); - }/* - else*/ - }/* - void JoinBefore(ZCLink* AP_LinkNew, ZCLink* AP_LinkStd)*/ - - - /*protected:*/ - public : - - - void JoinAfter(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt) - { - if(this == &rhs ) return; - if(rhs.ml_LinkSize<1) return; - - if(!bool(AO_StdOpt)) // 맨 앞에 삽입 - { - if(ml_LinkSize==0) - { - mp_HeadLink = rhs.mp_HeadLink ; - ml_LinkSize = rhs.ml_LinkSize ; - } - else - { - ZCLink* VP_TailLink = rhs.mp_HeadLink->mp_PrevLink; - - ZCLink::MakeRing(rhs.mp_HeadLink, mp_HeadLink->mp_PrevLink); - ZCLink::JoinLink( VP_TailLink, mp_HeadLink ); - - mp_HeadLink = rhs.mp_HeadLink ; - ml_LinkSize += rhs.ml_LinkSize ; - }/* - else*/ - } - else // bool(AO_StdOpt) - { - ZCLink* VP_RhsTail= rhs.mp_HeadLink->mp_PrevLink ; - ZCLink* VP_LinkStd= &AO_StdOpt.value() ; - ZCLink* VP_StdNext= VP_LinkStd->mp_NextLink ; - - ZCLink::JoinLink(VP_LinkStd, rhs.mp_HeadLink); - ZCLink::JoinLink(VP_RhsTail, VP_StdNext ); - - ml_LinkSize += rhs.ml_LinkSize ; - }/* - else // bool(AO_StdOpt)*/ - - rhs.mp_HeadLink = 0; - rhs.ml_LinkSize = 0; - }/* - void JoinAfter (ZtCObjList& rhs, ZCLinkOpt AO_StdOpt)*/ - - void JoinBefore(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt) - { - if(this == &rhs ) return; - if(rhs.ml_LinkSize<1) return; - - if(!bool(AO_StdOpt)) // 맨 뒤에 삽입 - { - if(ml_LinkSize==0) - { - mp_HeadLink = rhs.mp_HeadLink ; - ml_LinkSize = rhs.ml_LinkSize ; - } - else - { - ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink ; - ZCLink* VP_LhsTail = mp_HeadLink->mp_PrevLink ; - - ZCLink::JoinLink(VP_LhsTail , rhs.mp_HeadLink); - ZCLink::MakeRing(mp_HeadLink, VP_RhsTail ); - - ml_LinkSize += rhs.ml_LinkSize ; - }/* - else*/ - } - else // bool(AO_StdOpt) - { - ZCLink* VP_RhsHead = rhs.mp_HeadLink ; - ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink; - ZCLink* VP_LinkStd= &AO_StdOpt.value() ; - ZCLink* VP_PrevStd = VP_LinkStd ->mp_PrevLink; - - ZCLink::JoinLink(VP_PrevStd, VP_RhsHead); - ZCLink::JoinLink(VP_RhsTail, VP_LinkStd); - - ml_LinkSize += rhs.ml_LinkSize ; - }/* - else // bool(AO_StdOpt)*/ - - rhs.mp_HeadLink = 0; - rhs.ml_LinkSize = 0; - }/* - void JoinBefore(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt)*/ - - - /*public :*/ - protected: - - - ZCLink* CutLink(ZCLink* AP_CutLink) - { - if(AP_CutLink==mp_HeadLink) - { - if(mp_HeadLink==mp_HeadLink->mp_PrevLink) - mp_HeadLink=0; - else - { - ZCLink::MakeRing //////////////////////////// - ( - mp_HeadLink=mp_HeadLink->mp_NextLink, - AP_CutLink->mp_PrevLink - ); - ///////////////////////////////////////////// - }/* - else*/ - } - else if(AP_CutLink==mp_HeadLink->mp_PrevLink) - { - ZCLink::MakeRing(mp_HeadLink, AP_CutLink->mp_PrevLink); - } - else - { - ZCLink::JoinLink - (AP_CutLink->mp_PrevLink, AP_CutLink->mp_NextLink); - } - - return (--ml_LinkSize, AP_CutLink); - }/* - protected: ZCLink* CutLink(ZCLink* AP_CutLink)*/ - - - TypeThis& CutLink /*##########################################################*/ - ( - ZCLink* AP_CutHead , - ZCLink* AP_CutTail , - TypeSize AL_CutSize , - TypeThis& ARR_Rhs - ) - /*#############################################################################*/ - { - // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 - // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 - // ARR_Rhs 은 비어 있어야 한다. - - if(this==&ARR_Rhs) return *this ; - - if(ml_LinkSize<1) return ARR_Rhs; - - ZCLink* VP_TailLink = mp_HeadLink->mp_PrevLink; - - if(AP_CutHead==mp_HeadLink && AP_CutTail==VP_TailLink) - { - mp_HeadLink=0; // 모든 링크를 삭제할 때. - } - else if(AP_CutHead==mp_HeadLink) - { ZCLink::MakeRing - ( - mp_HeadLink=AP_CutTail->mp_NextLink, VP_TailLink - ); - //////////////// - } - else if(AP_CutTail==VP_TailLink) + ( mp_HeadLink, mp_TailLink ) ; + + ml_LinkSize= 1; return AP_NewLink; + }/* + if(ml_LinkSize<1)*/ + + ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; + ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; + + mp_TailLink = AP_NewLink; ++ml_LinkSize ; + + return AP_NewLink; /*::::::::::::::::::::*/ + }/* + ZCLink* AddTailLink(ZCLink* AP_NewLink)*/ + + ZCLink* AddHeadLink(ZCLink* AP_NewLink) + { + if(ml_LinkSize<1) { + mp_HeadLink = AP_NewLink; + mp_TailLink = AP_NewLink; + ZCLink::MakeRing - ( - mp_HeadLink, AP_CutHead->mp_PrevLink - ); - //////////////// + ( mp_HeadLink, mp_TailLink ) ; + + ml_LinkSize= 1; return AP_NewLink; + }/* + if(ml_LinkSize<1)*/ + + ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; + ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; + + mp_HeadLink = AP_NewLink; ++ml_LinkSize ; + + return AP_NewLink; /*::::::::::::::::::::*/ + }/* + ZCLink* AddHeadLink(ZCLink* AP_NewLink)*/ + + + ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink) + { + // *this 에 속한 AP_StdLink 의 뒤에, AP_NewLink 를 삽입한다. + // AP_StdLink 이 0 이면, 맨 앞에 삽입한다. + + if(AP_StdLink==0) // 맨 앞에 삽입 + { + if(ml_LinkSize<1) + { + mp_HeadLink = AP_NewLink; + mp_TailLink = AP_NewLink; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + } + else + { + ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; + ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; + + mp_HeadLink = AP_NewLink; + } + } + else if(AP_StdLink==mp_TailLink) + { + ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; + ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; + + mp_TailLink = AP_NewLink; + } + else + { + ZCLink* VP_StdNext = AP_StdLink->mp_NextLink ; + + ZCLink::JoinLink(AP_StdLink, AP_NewLink) ; + ZCLink::JoinLink(AP_NewLink, VP_StdNext) ; + } + + ++ml_LinkSize; return AP_NewLink; + }/* + ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/ + + + ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink) + { + // *this 에 속한 AP_StdLink 의 앞에, AP_NewLink 를 삽입한다. + // AP_StdLink 이 0 이면, 맨 뒤에 삽입한다. + + if(AP_StdLink==0) // 맨 뒤에 삽입 + { + if(ml_LinkSize<1) + { + mp_HeadLink = AP_NewLink; + mp_TailLink = AP_NewLink; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + } + else + { + ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; + ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; + + mp_TailLink = AP_NewLink; + } + } + else if(AP_StdLink==mp_HeadLink) + { + ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; + ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; + + mp_HeadLink = AP_NewLink; + } + else + { + ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink ; + + ZCLink::JoinLink(VP_StdPrev, AP_NewLink) ; + ZCLink::JoinLink(AP_NewLink, AP_StdLink) ; + } + + ++ml_LinkSize; return AP_NewLink; + }/* + ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/ + + + ZCLink* CutLink(ZCLink* AP_StdLink) + { + if(mp_HeadLink==AP_StdLink) + { + if(ml_LinkSize==1) + { + mp_HeadLink = 0; + mp_TailLink = 0; + } + else // ml_LinkSize>1 + { + mp_HeadLink = mp_HeadLink->mp_NextLink ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + }/* + else*/ + } + else if(mp_TailLink==AP_StdLink) + { + mp_TailLink = mp_TailLink->mp_PrevLink ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else { ZCLink::JoinLink ( - AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink - ); + AP_StdLink->mp_PrevLink, AP_StdLink->mp_NextLink + ) ; //////////////// - } + }/* + else*/ - - ml_LinkSize -= AL_CutSize; - - - // ARR_Rhs 은 비어 있어야 한다. - - ZCLink::MakeRing(AP_CutHead, AP_CutTail); - - ARR_Rhs.mp_HeadLink = AP_CutHead ; - ARR_Rhs.ml_LinkSize = AL_CutSize ; - - return ARR_Rhs; /*:::::::::::::::::::::*/ + --ml_LinkSize ; return AP_StdLink; }/* - TypeThis& CutLink ############################################################## - ( - ZCLink* AP_CutHead , - ZCLink* AP_CutTail , - TypeSize AL_CutSize , - TypeThis& ARR_Rhs - ) - ###############################################################################*/ + ZCLink* CutLink(ZCLink* AP_StdLink)*/ - TypeThis& CutLinkRangeOut /*##################################################*/ + ZtCObjList& CutLinkRangeOut /*////////////////////////////////////////*/ ( - ZCLink* AP_CutHead , ZCLink* AP_CutTail , - TypeSize AL_CutSize , TypeThis& rhs , - ZCLink* AP_RhsStd , bool AB_After=true + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCObjList& rhs , + ZCLink* AP_RhsStd , + bool AB_After=true ) - /*#############################################################################*/ + /*#####################################################################*/ { - /*////////////////////////////////////////////////// + /*/////////////////////////////////////////////////////////// - ■ AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 - AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 - 이 범위의 링크를 AP_RhsStd 뒤에 붙인다. + ■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. + AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. - AP_RhsStd 이 0 이면, rhs 의 앞에 붙인다. + AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고, + rhs 의 AP_RhsStd 의 뒤에 삽입한다. - ■ bool AB_After 추가. -- 2025-10-07 09:36 + AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16 - AB_After==true 이면, AP_RhsStd 의 뒤에 연결. - AB_After==false 이면, AP_RhsStd 의 앞에 연결. + ■ bool AB_After=true 추가. AB_After==false 이면, rhs 의 + AP_RhsStd 의 앞에 삽입한다. - //////////////////////////////////////////////////*/ + AP_RhsStd==0 이면 맨 뒤에 삽입한다. -- 2025-10-07 08:36 - if(this==&rhs ) return *this; - if(ml_LinkSize<1) return rhs ; + ///////////////////////////////////////////////////////////*/ - ZCLink* VP_TailLink = mp_HeadLink->mp_PrevLink; + if(this==&rhs ) return rhs; + if(ml_LinkSize<1) return rhs; - if(AP_CutHead==mp_HeadLink && AP_CutTail==VP_TailLink) + if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때. { - mp_HeadLink=0; // 모든 링크를 삭제할 때. + mp_HeadLink=0; } - else if(AP_CutHead==mp_HeadLink) + else if(&AR_CutHead==mp_HeadLink) { - ZCLink::MakeRing /////////////// - ( - mp_HeadLink = - AP_CutTail->mp_NextLink, - VP_TailLink - ); - //////////////////////////////// + ZCLink::MakeRing + ( mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink ); } - else if(AP_CutTail==VP_TailLink) + else if(&AR_CutTail==mp_TailLink) { - ZCLink::MakeRing /////////////// - ( - mp_HeadLink, - AP_CutHead->mp_PrevLink - ); - //////////////////////////////// + ZCLink::MakeRing + ( mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink ); } else { - ZCLink::JoinLink /////////////// - ( - AP_CutHead->mp_PrevLink, - AP_CutTail->mp_NextLink - ); - //////////////////////////////// - } + ZCLink::JoinLink + ( AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink ); + }/* + else*/ ml_LinkSize -= AL_CutSize; if(rhs.size()<1) { - ZCLink::MakeRing - ( AP_CutHead, AP_CutTail ) ; + // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. - rhs.mp_HeadLink = AP_CutHead ; + ZCLink::MakeRing(&AR_CutHead, &AR_CutTail); + + rhs.mp_HeadLink = &AR_CutHead ; + rhs.mp_TailLink = &AR_CutTail ; } else if(AB_After) { if(AP_RhsStd==0) // 맨 앞에 삽입. { - ZCLink* VP_RhsHead = rhs.mp_HeadLink ; - ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink ; + ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink); + ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink); - ZCLink::JoinLink(AP_CutTail, VP_RhsHead); - ZCLink::MakeRing(AP_CutHead, VP_RhsTail); - - rhs.mp_HeadLink = AP_CutHead; + rhs.mp_HeadLink = &AR_CutHead; } else // AP_RhsStd 의 뒤에 삽입. { ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ; - ZCLink::JoinLink(AP_RhsStd , AP_CutHead ); - ZCLink::JoinLink(AP_CutTail, VP_RhsStdNext); + ZCLink::JoinLink(AP_RhsStd , &AR_CutHead ); + ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext); + + if(AP_RhsStd==rhs.mp_TailLink) + { rhs.mp_TailLink = &AR_CutTail; } } } else // !AB_After { if(AP_RhsStd==0) // 맨 뒤에 삽입. { - ZCLink* VP_RhsHead = rhs.mp_HeadLink ; - ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink ; + ZCLink::JoinLink(rhs.mp_TailLink, &AR_CutHead); + ZCLink::MakeRing(rhs.mp_HeadLink, &AR_CutTail); - ZCLink::JoinLink(VP_RhsTail, AP_CutHead); - ZCLink::MakeRing(VP_RhsHead, AP_CutTail); + rhs.mp_TailLink = &AR_CutTail; } else // AP_RhsStd 의 앞에 삽입. { ZCLink* VP_RhsStdPrev = AP_RhsStd->mp_PrevLink ; - ZCLink::JoinLink(VP_RhsStdPrev, AP_CutHead); - ZCLink::JoinLink(AP_CutTail , AP_RhsStd ); + ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead); + ZCLink::JoinLink(&AR_CutTail , AP_RhsStd ); if(AP_RhsStd==rhs.mp_HeadLink) - rhs.mp_HeadLink = AP_CutHead ; + { rhs.mp_HeadLink = &AR_CutHead; } } }/* else // !AB_After*/ rhs.ml_LinkSize += AL_CutSize; return rhs; }/* - TypeThis& CutLinkRangeOut ###################################################### + ZtCObjList& CutLinkRangeOut //////////////////////////////////////////// ( - ZCLink* AP_CutHead , ZCLink* AP_CutTail , - TypeSize AL_CutSize , TypeThis& rhs , - ZCLink* AP_RhsStd , bool AB_After=true + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCObjList& rhs , + ZCLink* AP_RhsStd , + bool AB_After=true ) - ###############################################################################*/ + #######################################################################*/ - ZtCObjList& CopyLink /*########################################################*/ - ( - const ZCLink* AP_CopyLink , - TypeSize AL_FarNum , - TypeThis& ARR_Rhs - ) const - /*#############################################################################*/ - { - /*///////////////////////////////////////////////////////// - - ■ AP_CopyLink 부터 AP_CopyLink->GetNextPrevPtr(AL_FarNum) - 링크까지를 복사한다. - - AL_FarNum 은 0 이상이어야 한다. - 총 FarNum + 1 개의 링크가 만들어진다. - - ARR_Rhs 은 비어 있어야 한다. -- 2025-10-06 13:01 - - /////////////////////////////////////////////////////////*/ - - if(ARR_Rhs.IsEmpty()!=true) - { - return ARR_Rhs; - }/* - if(ARR_Rhs.IsEmpty()!=true)*/ - - ZCLink* VP_HeadLink=0; - ZCLink* VP_TailLink=0; - - GetManyLinkCopy ///////////////////////////// - ( - const_cast(AP_CopyLink), - AL_FarNum , - VP_HeadLink , - VP_TailLink - ); - ///////////////////////////////////////////// - - ZCLink::MakeRing(VP_HeadLink, VP_TailLink); - - TypeThis VO_TempList; - - VO_TempList.mp_HeadLink = VP_HeadLink ; - VO_TempList.ml_LinkSize = - (AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 ; - - return ARR_Rhs.JoinTail(VO_TempList); - }/* - ZtCObjList& CopyLink ############################################################ - ( - const ZCLink* AP_CopyLink , - TypeSize AL_FarNum , - TypeThis& ARR_Rhs - ) const - ###############################################################################*/ - - - ZtCObjList& MakeDefault - (TypeSize AL_DefaultSize, ZtCObjList& ARR_Rhs) const - { - // must AL_DefaultSize > 0 - - ZCLink* VP_HeadLink=0; - ZCLink* VP_TailLink=0; - - GetManyLink - (AL_DefaultSize, RR(VP_HeadLink), RR(VP_TailLink)); - ZCLink::MakeRing(VP_HeadLink, VP_TailLink); - - ARR_Rhs.mp_HeadLink= VP_HeadLink ; - ARR_Rhs.ml_LinkSize= AL_DefaultSize ; - - return ARR_Rhs; /*:::::::::::::::::::::::::::::::::::*/ - }/* - ZtCObjList& MakeDefault - (TypeSize AL_DefaultSize, ZtCObjList& ARR_Rhs) const*/ - - - void GetManyLink( - TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) const - { - mo_FreeObjt.SendFreeOut - (AL_LinkSize, RR(APR_HeadLink), RR(APR_TailLink)); - }/* - void GetManyLink( - TypeSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) const */ - - - void GetManyLinkCopy /*########################################################*/ - ( - ZCLink* AP_CopyLink , TypeSize AL_FarNum , - ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink - ) const - /*#############################################################################*/ - { - // AL_FarNum 의 절대값 + 1 개의 링크가 생성된다. - - mo_FreeObjt.SendFreeOutCopy - (AP_CopyLink, AL_FarNum, RR(APR_HeadLink), RR(APR_TailLink)); - }/* - void GetManyLinkCopy ############################################################ - ( - ZCLink* AP_CopyLink , TypeSize AL_FarNum , - ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink - ) const - ###############################################################################*/ - - - /*protected:*/ - public : + /*private :*/ + public : ZtCObjList() { - mp_HeadLink = 0; - ml_LinkSize = 0; + mp_HeadLink = 0 ; + mp_TailLink = 0 ; + ml_LinkSize = 0 ; }/* ZtCObjList()*/ - ZtCObjList(const ZtCObjList& rhs):mp_HeadLink(0),ml_LinkSize(0) + ZtCObjList(const ZtCObjList& rhs) { - *this=rhs; + mp_HeadLink = 0 ; + mp_TailLink = 0 ; + ml_LinkSize = 0 ; + + *this = (rhs); }/* ZtCObjList(const ZtCObjList& rhs)*/ - - virtual ~ZtCObjList() + ~ZtCObjList() { DeleteAll(); - #if(_CODE_NEW_) - mo_FreeObjt.DeleteHeap(); - #endif }/* - virtual ~ZtCObjList()*/ + ~ZtCObjList()*/ ZtCObjList& operator=(const ZtCObjList& rhs) { - if(rhs.ml_LinkSize<1) - { - return DeleteAll(); - } - if(ml_LinkSize<=rhs.ml_LinkSize) - { - AddDefault(rhs.ml_LinkSize-ml_LinkSize, ml_LinkSize+1); - } - else // ml_LinkSize > rhs.ml_LinkSize - { - ZtCObjList VO_StoreList; + if(this==&rhs) return *this; - CutLink //////////////////////////////////////////////// + if(rhs.size()<1) + { this->DeleteAll(); return *this; } + + TypeSize VL_MinusSize = this->size() - rhs.size() ; + + if (VL_MinusSize>0) + { + ZCLink* VP_CutTail = + mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1); + ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ; + + mo_FreeObjt.RecvFreeIn /////////////////////////// ( - GetLinkPtr(rhs.ml_LinkSize+1), - GetLinkPtr( ml_LinkSize ), - ml_LinkSize - rhs.ml_LinkSize, - RR(VO_StoreList) - ). DeleteAll(); - ///////////////////////////////////////////////////////// - }/* - else*/ + VL_MinusSize, mp_HeadLink, VP_CutTail + ); + ////////////////////////////////////////////////// + mp_HeadLink = VP_CutTailNext; + ml_LinkSize -= VL_MinusSize ; - ZCLink* pRhsLink = rhs.mp_HeadLink; - ZCLink* pLhsLink = mp_HeadLink; - - __for1(TypeSize, i, ml_LinkSize) + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + } + else if(VL_MinusSize<0) { - **pLhsLink = ** pRhsLink ; + ZCLink* VP_HeadLink=0; + ZCLink* VP_TailLink=0; - pLhsLink = pLhsLink->mp_NextLink; - pRhsLink = pRhsLink->mp_NextLink; + mo_FreeObjt.SendFreeOut /////////////////////////// + ( + -VL_MinusSize , + RR(VP_HeadLink) , + RR(VP_TailLink) + ); + /////////////////////////////////////////////////// + + if(ml_LinkSize>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, mp_TailLink); + }/* + else*/ + + ml_LinkSize += (-VL_MinusSize); }/* - __for1(TypeSize, i, ml_LinkSize)*/ + else if(VL_MinusSize<0)*/ + + + ZCLink* VP_RhsLink = rhs.mp_HeadLink ; + ZCLink* VP_LhsLink = mp_HeadLink ; + + __for0(TypeSize, i, rhs.size()) + { + **VP_LhsLink = **VP_RhsLink ; + + VP_RhsLink = VP_RhsLink->mp_NextLink; + VP_LhsLink = VP_LhsLink->mp_NextLink; + }/* + __for0(TypeSize, i, rhs.size())*/ return *this; }/* ZtCObjList& operator=(const ZtCObjList& rhs)*/ - bool IsEmpty() const{ return mp_HeadLink==0 ; } - bool empty () const{ return mp_HeadLink==0 ; } - - - TypeSize GetSize () const{return ml_LinkSize;} - TypeSize size () const{return ml_LinkSize;} - - TypeSize capacity() const - { return size()+mo_FreeObjt.size(); } - - TypeSize GetFreeSize() const - { return mo_FreeObjt.size(); } - TypeSize size_free () const - { return mo_FreeObjt.size(); } - - - ZCLink* GetHeadLinkPtr(){return mp_HeadLink;} - ZCLink* GetTailLinkPtr() + void DeleteAll() { - return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; - }/* - ZCLink* GetTailLinkPtr()*/ - - - const ZCLink* GetHeadLinkPtr() const{return mp_HeadLink;} - const ZCLink* GetTailLinkPtr() const - { - return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; - }/* - const ZCLink* GetTailLinkPtr() const*/ - - - ZCLinkOpt GetHeadLinkOpt(){return ZCLinkOpt(mp_HeadLink);} - ZCLinkOpt GetTailLinkOpt() - { - if(mp_HeadLink==0) return ZCLinkOpt(0); - - return ZCLinkOpt(*mp_HeadLink->mp_PrevLink); - }/* - ZCLinkOpt GetTailLinkOpt()*/ - - const ZCLinkOpt GetHeadLinkOpt() const{return ZCLinkOpt(mp_HeadLink);} - const ZCLinkOpt GetTailLinkOpt() const - { - if(mp_HeadLink==0) return ZCLinkOpt(0); - - return ZCLinkOpt(*mp_HeadLink->mp_PrevLink); - }/* - const ZCLinkOpt GetTailLinkOpt()*/ - - - - Type& operator[](TypeSize AL_Index) // start by 1 - { - return GetLinkPtr(AL_Index)->GetData(); - }/* - Type& operator[](TypeSize AL_Index)*/ - - const Type& operator[](TypeSize AL_Index) const - { - return GetLinkPtr(AL_Index)->GetData(); - }/* - Type& operator[](TypeSize AL_Index) const*/ - - - ZCFreeHeap& GetCFreeHeap() const - { - return mo_FreeObjt; - }/* - ZCFreeHeap& GetCFreeHeap() const*/ - - - TypeSize Find /*###############################################################*/ - ( - TypeArg AR_SearchType , - TypeSize AL_FirstFindIndex =1 , - bool AB_DoFindFromFront=true - ) const - /*#############################################################################*/ - { - // AB_DoFindFromFront==true 이면 AL_FirstFindIndex 번째 링크부터 - // 다음 링크로 순회하면서 GetData() == AR_SearchType 이 되는 - // 최초의 위치를 반환한다. - - const bool CB_IsTrue = ////////////////// - ( - mp_HeadLink == 0 || - AL_FirstFindIndex < 1 || - AL_FirstFindIndex > ml_LinkSize - ) ; - if(CB_IsTrue) return 0; //////////////// - - TypeSize VL_FindIndex=AL_FirstFindIndex; const - ZCLink* VP_TempLink =GetLinkPtr(AL_FirstFindIndex); - - if(AB_DoFindFromFront==true) - { - do ///////// - { - if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; - if(VL_FindIndex ==ml_LinkSize ) return 0 ; - - VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; - } - while(true); - } - else // AB_DoFindFromFront!=true - { - do ///////// - { - if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; - if(VL_FindIndex ==1 ) return 0 ; - - VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; - } - while(true); - }/* - else // AB_DoFindFromFront!=true*/ - - return 0; - }/* - TypeSize Find ################################################################### - ( - TypeArg AR_SearchType , - TypeSize AL_FirstFindIndex =1 , - bool AB_DoFindFromFront=true - ) const - ###############################################################################*/ - - - TypeSize Find /*##############################################################*/ - ( - const ZCLink& AR_SearchLink , - TypeSize AL_FirstFindIndex =1, - bool AB_DoFindFromFront=true - ) const - /*#############################################################################*/ - { - if(mp_HeadLink==0 || AL_FirstFindIndex<1 || AL_FirstFindIndex>ml_LinkSize) - return 0; - ////////////////////////////////////////////////////////////////////////// - - TypeSize VL_FindIndex= AL_FirstFindIndex; - ZCLink* VP_TempLink = const_cast - ( GetLinkPtr(AL_FirstFindIndex) ); - - if(AB_DoFindFromFront==true) - { - do /**/ - { - if(VP_TempLink ==&AR_SearchLink) return VL_FindIndex; - if(VL_FindIndex==ml_LinkSize ) return 0 ; - - VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; - } - while(true); - } - else // AB_DoFindFromFront!=true - { - do /**/ - { - if(VP_TempLink ==&AR_SearchLink) return VL_FindIndex; - if(VL_FindIndex==1 ) return 0 ; - - VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; - } - while(true); - }/* - else // AB_DoFindFromFront!=true*/ - - return 0; - }/* - TypeSize Find ################################################################## - ( - ZCLink& AR_SearchLink , - TypeSize AL_FirstFindIndex =1 , - bool AB_DoFindFromFront=true - ) const - ###############################################################################*/ - - - /*//////////////////////////////////////////////////////////////////////////////////////// - - ■ FindData(TypeArg, ~) 함수가 없다면, TypeArg 이 const Type& 으로 정의되어 있는 경우, - const Type& 에 대해서만 찾기를 수행할 수 있고, Type& 에 대해서는 찾기를 수행할 수 없다. - - -- 2010-05-29 21:31:00 - - ////////////////////////////////////////////////////////////////////////////////////////*/ - - TypeSize FindData( - TypeArg AR_SearchType, TypeSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const - { - return Find(AR_SearchType, AL_FirstFindIndex, AB_DoFindFromFront); - }/* - TypeSize FindData( - TypeArg AR_SearchType, TypeSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ - - - ZCLink* GetLinkPtr(TypeSize AL_Index) - { - TypeSize VI_LeftDistance =AL_Index-1 ; - TypeSize VI_RightDistance=ml_LinkSize-AL_Index+1; - TypeSize VI_ShortDistance= - (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); - - return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); - }/* - ZCLink* GetLinkPtr(TypeSize AL_Index)*/ - - const ZCLink* GetLinkPtr(TypeSize AL_Index) const // or 'ZCLink const * const GetLinkPtr(TypeSize AL_Index) const' - { - TypeSize VI_LeftDistance = AL_Index-1 ; - TypeSize VI_RightDistance= ml_LinkSize -AL_Index+1; - TypeSize VI_ShortDistance= - (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); - - return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); - }/* - const ZCLink* GetLinkPtr(TypeSize AL_Index) const*/ - - - ZCLinkOpt GetLinkOpt(TypeSize AL_Index) - { - if(mp_HeadLink==0) return ZCLinkOpt(0); - - return ZCLinkOpt(*GetLinkPtr(AL_Index)); - }/* - ZCLinkOpt GetLinkOpt(TypeSize AL_Index)*/ - - const ZCLinkOpt GetLinkOpt(TypeSize AL_Index) const - { - if(mp_HeadLink==0) return ZCLinkOpt(0); - - return ZCLinkOpt(*GetLinkPtr(AL_Index)); - }/* - const ZCLinkOpt GetLinkOpt(TypeSize AL_Index) const*/ - - - - ZtCObjList& DeleteAll() - { - if(mp_HeadLink==0) return *this; + if(ml_LinkSize<1) return; mo_FreeObjt.RecvFreeIn - ( ml_LinkSize, mp_HeadLink, mp_HeadLink->mp_PrevLink ); + (ml_LinkSize, mp_HeadLink, mp_TailLink); - mp_HeadLink= 0; ml_LinkSize= 0; return *this; + mp_HeadLink =0 ; + mp_TailLink =0 ; + ml_LinkSize =0 ; }/* - ZtCObjList& DeleteAll()*/ + void DeleteAll()*/ - ZtCObjList& clear() + + TypeData& AddHead() + { return **AddHeadLink(mo_FreeObjt.SendFreeOut()); } + TypeData& AddTail() + { return **AddTailLink(mo_FreeObjt.SendFreeOut()); } + + ZCLink& AddHeadDef() + { return *AddHeadLink(mo_FreeObjt.SendFreeOut()); } + ZCLink& AddTailDef() + { return *AddTailLink(mo_FreeObjt.SendFreeOut()); } + + + TypeData& AddHead(TypeArg AO_ArgData) /*########################*/ { - return this->DeleteAll(); + if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// + { + ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); + + TypeMoveObj::Exec(**VP_NewNode, AO_ArgData); + + return AddHeadLink(VP_NewNode)->mo_DataObjt; + } + //////////////////////////////////////////////////// + + return AddHeadLink(new ZCLink(AO_ArgData))->mo_DataObjt; }/* - ZtCObjList& clear()*/ + TypeData& AddHead(TypeArg AO_ArgData) ##########################*/ - - ZtCObjList& DeleteHeap() + TypeData& AddTail(TypeArg AO_ArgData) /*########################*/ { - mo_FreeObjt.DeleteHeap(); return *this; + if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// + { + ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); + + TypeMoveObj::Exec(*VP_NewNode, AO_ArgData); + + return AddTailLink(VP_NewNode)->mo_DataObjt; + } + //////////////////////////////////////////////////// + + return AddTailLink(new ZCLink(AO_ArgData))->mo_DataObjt; }/* - ZtCObjList& DeleteHeap()*/ + TypeData& AddTail(TypeArg AO_ArgData) ##########################*/ - ZtCObjList& DeleteLink(ZCLink& AR_DeleteLink) + ZtCObjList& AddHead(ZtCObjList& rhs) { - #if(_CODE_NEW_) - mo_FreeObjt.RecvFreeIn - ( this->CutLink(&AR_DeleteLink) ); - #else - delete this->CutLink(&AR_DeleteLink); - #endif - return *this; + if(this == &rhs ) return *this; + if(rhs.size()<1 ) return *this; + + ZtCObjList VO_TempList(rhs); + + return JoinHead(VO_TempList); }/* - ZtCObjList& DeleteLink(ZCLink& AR_DeleteLink)*/ + ZtCObjList& AddHead(ZtCObjList& rhs)*/ - - ZtCObjList& Delete(ZCLink& AR_DeleteLink) + ZtCObjList& AddTail(ZtCObjList& rhs) { - return DeleteLink(&AR_DeleteLink); - }/* - ZtCObjList& Delete(ZCLink& AR_DeleteLink)*/ + if(this == &rhs ) return *this; + if(rhs.size()<1 ) return *this; - ZtCObjList& Delete(TypeSize AL_DeletePos) + ZtCObjList VO_TempList(rhs); + + return JoinTail(VO_TempList); + }/* + ZtCObjList& AddTail(ZtCObjList& rhs)*/ + + + void DeleteHead() { - if(AL_DeletePos<1 || this->ml_LinkSize>AL_DeletePos) - { return *this; } - Delete(this->GetLinkPtr(AL_DeletePos)); return *this; + if(ml_LinkSize<1) return; + + ZCLink* VP_TempLink = mp_HeadLink ; + mp_HeadLink = mp_HeadLink->mp_NextLink ; + + mo_FreeObjt.RecvFreeIn(VP_TempLink); + + if(--ml_LinkSize<1) + { + mp_HeadLink = mp_TailLink =0; return; + }/* + if(--ml_LinkSize<1)*/ + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* - ZtCObjList& Delete(TypeSize AL_DeletePos)*/ + void DeleteHead()*/ - ZtCObjList& DeleteHead() + void DeleteTail() { - if(ml_LinkSize>0) - #if(_CODE_NEW_) - mo_FreeObjt.RecvFreeIn - ( this->CutLink(mp_HeadLink) ); - #else - delete this->CutLink(mp_HeadLink) ; - #endif + if(ml_LinkSize<1) return; - return *this; + ZCLink* VP_TempLink = mp_TailLink ; + mp_TailLink = mp_TailLink->mp_PrevLink ; + + mo_FreeObjt.RecvFreeIn(VP_TempLink); + + if(--ml_LinkSize<1) + { + mp_HeadLink = mp_TailLink =0; return; + }/* + if(--ml_LinkSize<1)*/ + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* - ZtCObjList& DeleteHead()*/ + void DeleteTail()*/ - void DeleteHead(TypeSize AL_DelSize) + void DeleteHead(TTypSize AL_DelSize) { // AL_DelSize 개의 링크를 앞 부분에서 삭제 if(ml_LinkSize<1 || AL_DelSize<1){ return; } - if(AL_DelSize> ml_LinkSize){ AL_DelSize=ml_LinkSize; } + if(AL_DelSize > ml_LinkSize) + { AL_DelSize = ml_LinkSize; } - if(AL_DelSize==ml_LinkSize) + if(AL_DelSize== ml_LinkSize) { - GetCFreeHeap().RecvFreeIn - (ml_LinkSize, mp_HeadLink, mp_HeadLink->mp_PrevLink); + RecvFreeIn + (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink=0 ; + mp_TailLink=0 ; ml_LinkSize=0 ; return; }/* if(AL_DelSize==ml_LinkSize)*/ - ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink ; - ZCLink* VP_NewHead = &((*mp_HeadLink)+AL_DelSize); - GetCFreeHeap().RecvFreeIn + ZCLink* VP_NewHead = + mp_HeadLink->GetNextPrevPtr( AL_DelSize ) ; + mo_FreeObjt.RecvFreeIn (AL_DelSize, mp_HeadLink, VP_NewHead->mp_PrevLink); - mp_HeadLink = VP_NewHead ; - ml_LinkSize -= AL_DelSize ; + mp_HeadLink = VP_NewHead ; + ml_LinkSize -= AL_DelSize ; - ZCLink::MakeRing(mp_HeadLink, VP_TailLink); + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* - void DeleteHead(TypeSize AL_DelSize)*/ + void DeleteHead(TTypSize AL_DelSize)*/ - ZtCObjList& DeleteTail() - { - if(ml_LinkSize>0) - #if(_CODE_NEW_) - mo_FreeObjt.RecvFreeIn - ( this->CutLink(mp_HeadLink->mp_PrevLink) ); - #else - delete this->CutLink(mp_HeadLink->mp_PrevLink) ; - #endif - - return *this; - }/* - ZtCObjList& DeleteTail()*/ - - - void DeleteTail(TypeSize AL_DelSize) + void DeleteTail(TTypSize AL_DelSize) { if(ml_LinkSize==0 || AL_DelSize<1){ return; } @@ -1977,339 +1594,562 @@ namespace ZNsMain if(AL_DelSize==ml_LinkSize) { - GetCFreeHeap().RecvFreeIn - (ml_LinkSize, mp_HeadLink, mp_HeadLink->mp_PrevLink); + mo_FreeObjt.RecvFreeIn + (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink=0 ; + mp_TailLink=0 ; ml_LinkSize=0 ; return; }/* if(AL_DelSize==ml_LinkSize)*/ - ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink ; - ZCLink* VP_NewTail = &((*VP_TailLink)-AL_DelSize); - GetCFreeHeap().RecvFreeIn - (AL_DelSize, VP_NewTail->mp_NextLink, VP_TailLink); + ZCLink* VP_NewTail = + mp_TailLink->GetNextPrevPtr( -AL_DelSize ) ; + mo_FreeObjt.RecvFreeIn + (AL_DelSize, VP_NewTail->mp_NextLink, mp_TailLink); - ml_LinkSize -= AL_DelSize ; + mp_TailLink = VP_NewTail ; + ml_LinkSize -= AL_DelSize ; - ZCLink::MakeRing(mp_HeadLink, VP_NewTail); + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* - void DeleteTail(TypeSize AL_DelSize)*/ + void DeleteTail(TTypSize AL_DelSize)*/ - - ZCLink& AddDefault(TypeSize AL_DefSize, TypeSize AL_AddPos) + ZtCObjList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt) { - if(AL_DefSize<1) AL_DefSize= 1; - if(AL_AddPos <1) AL_AddPos = 1; + // AP_StdLink 의 뒤에 rhs 를 삽입. - ZtCObjList VO_StoreList; MakeDefault - ( AL_DefSize, RR(VO_StoreList) ) ; + if(rhs.ml_LinkSize<1) return *this; - ZCLink* VP_HeadLink= VO_StoreList.mp_HeadLink; + ZCLink* VP_StdLink = AO_StdOpt.Raw(); - if(AL_AddPos==1) - JoinAfter(VO_StoreList, ZCLinkOpt(0) ); - else JoinAfter(VO_StoreList, GetLinkOpt(AL_AddPos-1)); - - return *VP_HeadLink; - }/* - ZCLink& AddDefault(TypeSize AL_DefSize, TypeSize AL_AddPos)*/ - - - ZtCObjList& AddHead(TypeArg AR_Type) - { - ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); - - if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// + if(VP_StdLink==0) // 맨 앞에 삽입 { - TypeMoveObj::Exec(**VP_NewNode, AR_Type); + if(ml_LinkSize<1) + { + mp_HeadLink = rhs.mp_HeadLink ; + mp_TailLink = rhs.mp_TailLink ; + } + else // ml_LinkSize>=1 + { + ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink ); + ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink ); - JoinAfter(VP_NewNode, 0); return *this ; - } - **VP_NewNode = AR_Type; //////////////////////////// + mp_HeadLink = rhs.mp_HeadLink ; + }/* + else // ml_LinkSize>=1*/ - JoinAfter(VP_NewNode, 0); return *this; + ml_LinkSize += rhs.ml_LinkSize; + + rhs.mp_HeadLink = 0 ; + rhs.mp_TailLink = 0 ; + rhs.ml_LinkSize = 0 ; + + return *this; ///////////////// + }/* + if(VP_StdLink==0)*/ + + + ZCLink* VP_StdNext=VP_StdLink->mp_NextLink; + + ZCLink::JoinLink(VP_StdLink , rhs.mp_HeadLink ); + ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext ); + + if(VP_StdLink==mp_TailLink) + { mp_TailLink=rhs.mp_TailLink; } + + ml_LinkSize += rhs.ml_LinkSize; + + rhs.mp_HeadLink =0 ; + rhs.mp_TailLink =0 ; + rhs.ml_LinkSize =0 ; + + return *this; /*:::::::::::::*/ }/* - ZtCObjList& AddHead(TypeArg AR_Type)*/ + ZtCObjList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ - ZtCObjList& AddHead(const ZtCObjList& rhs) + + ZtCObjList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt) { - if(this==&rhs) return *this ; + // AO_StdOpt 의 앞에 rhs 를 삽입. - ZtCObjList VO_StoreList(rhs); + if(rhs.size()<1) return *this; - JoinAfter(VO_StoreList, 0); return *this; - }/* - ZtCObjList& AddHead(const ZtCObjList& rhs)*/ + ZCLink* VP_StdLink = AO_StdOpt.Raw(); - - ZtCObjList& AddTail(TypeArg AR_Type) - { - ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); - - if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// + if(VP_StdLink==0) // 맨 뒤에 삽입 { - TypeMoveObj::Exec(**VP_NewNode, AR_Type); + if(ml_LinkSize<1) + { + mp_HeadLink = rhs.mp_HeadLink ; + mp_TailLink = rhs.mp_TailLink ; + } + else // ml_LinkSize>=1 + { + ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink ); + ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink ); - JoinAfter(VP_NewNode, GetTailLinkPtr()); return *this; + mp_TailLink = rhs.mp_TailLink ; + }/* + else // ml_LinkSize>=1*/ + + ml_LinkSize += rhs.ml_LinkSize; + + rhs.mp_HeadLink = 0 ; + rhs.mp_TailLink = 0 ; + rhs.ml_LinkSize = 0 ; + + return *this; ///////////////// + }/* + if(VP_StdLink==0)*/ + + + ZCLink* VP_StdPrev = VP_StdLink->mp_PrevLink; + + ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink ); + ZCLink::JoinLink(rhs.mp_TailLink, VP_StdLink ); + + if(VP_StdLink==mp_HeadLink) + { mp_HeadLink = rhs.mp_HeadLink; } + + ml_LinkSize += rhs.ml_LinkSize; + + rhs.mp_HeadLink =0 ; + rhs.mp_TailLink =0 ; + rhs.ml_LinkSize =0 ; + + return *this; /*:::::::::::::*/ + }/* + ZtCObjList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ + + + ZtCObjList& JoinHead(TypeThis& rhs) + { if(this==&rhs) return *this; return JoinAfter (rhs, ZCLinkOpt(0)); } + ZtCObjList& JoinTail(TypeThis& rhs) + { if(this==&rhs) return *this; return JoinBefore(rhs, ZCLinkOpt(0)); } + + + void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt) + { + // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다. + + CutLink(&AR_CutLink); rhs.AddLinkAfter(AO_StdOpt.Raw(), &AR_CutLink); + }/* + void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ + + void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt) + { + // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. + + CutLink(&AR_CutLink); rhs.AddLinkBefore(AO_StdOpt.Raw(), &AR_CutLink); + }/* + void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ + + + ZtCObjList& SwapLinkNext(ZCLink& AR_LinkPrev) + { + // 다음 링크와 위치를 맞바꾼다. + + if(size()<=1){return *this;} + + + ZCLink* VP_LinkNext = AR_LinkPrev.mp_NextLink; + + if(&AR_LinkPrev == VP_LinkNext){ return *this; } + + if(size()==2) + { + if(&AR_LinkPrev==mp_HeadLink) /*************************/ + { + // VP_LinkNext==mp_TailLink + + mp_HeadLink = VP_LinkNext ; + mp_TailLink = &AR_LinkPrev; + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + else // VP_LinkNext==mp_HeadLink + { + mp_HeadLink = &AR_LinkPrev ; + mp_TailLink = VP_LinkNext ; + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ } - **VP_NewNode = AR_Type; //////////////////////////// + else if(&AR_LinkPrev==mp_HeadLink) + { + // VP_LinkNext == mp_HeadLink.mp_NextLink; - JoinAfter - (VP_NewNode, GetTailLinkPtr()); - return *this ; + ZCLink* VP_HeadNext2 = + VP_LinkNext->mp_NextLink ; + + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev); + ZCLink::JoinLink(&AR_LinkPrev, VP_HeadNext2); + ZCLink::MakeRing(VP_LinkNext , mp_TailLink ); + + mp_HeadLink = VP_LinkNext ; + } + else if(&AR_LinkPrev==mp_TailLink) + { + // VP_LinkNext==mp_HeadLink + + ZCLink* VP_HeadNext = + mp_HeadLink->mp_NextLink ; + ZCLink* VP_TailPrev = + mp_TailLink->mp_PrevLink ; + + ZCLink::JoinLink(mp_TailLink, VP_HeadNext); + ZCLink::JoinLink(VP_TailPrev, mp_HeadLink); + ZCLink::MakeRing(mp_TailLink, mp_HeadLink); + + mp_HeadLink = &AR_LinkPrev ; + mp_TailLink = VP_LinkNext ; + } + else if(VP_LinkNext==mp_TailLink) + { + ZCLink* VP_TailPrev2 = + AR_LinkPrev.mp_PrevLink ; + + ZCLink::JoinLink(VP_TailPrev2, VP_LinkNext ); + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ); + ZCLink::MakeRing(mp_HeadLink , &AR_LinkPrev ); + + mp_TailLink = &AR_LinkPrev ; + } + else + { + ZCLink* VP_SwapPrev = AR_LinkPrev. mp_PrevLink; + ZCLink* VP_SwapNext = VP_LinkNext->mp_NextLink; + + ZCLink::JoinLink(VP_SwapPrev , VP_LinkNext ) ; + ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ) ; + ZCLink::JoinLink(&AR_LinkPrev, VP_SwapNext ) ; + } + return *this; /***********************************/ }/* - ZtCObjList& AddTail(TypeArg AR_Type)*/ + ZtCObjList& SwapLinkNext(ZCLink& AR_LinkPrev)*/ - ZtCObjList& AddTail(const ZtCObjList& rhs) + ZtCObjList& SwapLinkPrev(ZCLink& AR_LinkNext) { - ZtCObjList VO_StoreList(rhs); return JoinTail(VO_StoreList); + // 이전 링크와 위치를 맞바꾼다. + + return SwapLinkNext(*AR_LinkNext.mp_PrevLink); }/* - ZtCObjList& AddTail(const ZtCObjList& rhs)*/ + ZtCObjList& SwapLinkPrev(ZCLink& AR_LinkNext)*/ - /*/////////////////////////////////////////////////////////////////// - - ■ ZCLink* AddHeadDef() 함수의 코드 중 return 문이 return *this - 라고 되어 있었다. 10 여년간 이를 모른 것이다. 자그마치 10 여년간! - -- 2015-02-21- 21:36:00 - - ///////////////////////////////////////////////////////////////////*/ - - ZCLink& AddHeadDef() + ZtCObjList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo) { - ZCLink* VP_NewLink = mo_FreeObjt.SendFreeOut(); + // AR_LinkOne 와 AR_LinkTwo 의 위치를 바꾼다. - JoinAfter(VP_NewLink, 0); return *VP_NewLink ; - } - ZCLink& AddTailDef() - { - ZCLink* VP_NewLink = mo_FreeObjt.SendFreeOut(); + if(size()<=1){return *this;} - JoinAfter(VP_NewLink, GetTailLinkPtr()); return *VP_NewLink; + if(&AR_LinkOne==&AR_LinkTwo){return *this;} + + if(&AR_LinkOne==mp_HeadLink && &AR_LinkTwo==mp_TailLink) + { return SwapLinkNext(AR_LinkTwo); } + if(&AR_LinkOne==mp_TailLink && &AR_LinkTwo==mp_HeadLink) + { return SwapLinkNext(AR_LinkOne); } + /******************************************************/ + if(&AR_LinkTwo==AR_LinkOne.mp_NextLink) + { return SwapLinkNext(AR_LinkOne); } + if(&AR_LinkOne==AR_LinkTwo.mp_NextLink) + { return SwapLinkNext(AR_LinkTwo); } + /******************************************************/ + + if(&AR_LinkOne==mp_HeadLink) + { + ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; + ZCLink* VP_TwoNext =AR_LinkTwo. mp_NextLink; + ZCLink* VP_TwoPrev =AR_LinkTwo. mp_PrevLink; + + ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; + ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext ) ; + ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; + + mp_HeadLink = &AR_LinkTwo ; return *this; + } + if(&AR_LinkOne==mp_TailLink) + { + ZCLink* VP_TailPrev= mp_TailLink->mp_PrevLink; + ZCLink* VP_TwoNext = AR_LinkTwo. mp_NextLink; + ZCLink* VP_TwoPrev = AR_LinkTwo. mp_PrevLink; + + ZCLink::JoinLink( VP_TwoPrev , &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne , VP_TwoNext ) ; + ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; + ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; + + mp_TailLink = &AR_LinkTwo ; return *this; + } + /******************************************************/ + if(&AR_LinkTwo==mp_HeadLink) + { + ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; + ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; + ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; + + ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; + ZCLink::JoinLink( VP_OnePrev, &AR_LinkOne ) ; + ZCLink::JoinLink(&AR_LinkOne, VP_OneNext ) ; + ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; + + mp_HeadLink = &AR_LinkTwo ; return *this; + } + if(&AR_LinkTwo==mp_TailLink) + { + ZCLink* VP_TailPrev=mp_TailLink->mp_PrevLink; + ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; + ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; + + ZCLink::JoinLink( VP_OnePrev , &AR_LinkTwo ) ; + ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext ) ; + ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; + ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; + + mp_TailLink = &AR_LinkTwo ; return *this; + } + /********************************************************/ + + ZCLink* VP_OnePrev= AR_LinkOne.mp_PrevLink ; + ZCLink* VP_OneNext= AR_LinkOne.mp_NextLink ; + ZCLink* VP_TwoPrev= AR_LinkTwo.mp_PrevLink ; + ZCLink* VP_TwoNext= AR_LinkTwo.mp_NextLink ; + + ZCLink::JoinLink( VP_OnePrev, &AR_LinkTwo) ; + ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext) ; + ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne) ; + ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext) ; return *this; }/* - ZCLink& AddTailDef()*/ + ZtCObjList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/ - ZtCObjList& pop_back (TypeArg AR_Type){return AddHead(AR_Type);} - ZtCObjList& push_back(TypeArg AR_Type){return AddTail(AR_Type);} - - - ZtCObjList& JoinHead(ZtCObjList& rhs) + ZtCObjList& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) { - if(this==&rhs) return *this; JoinAfter(rhs, 0); return *this; - }/* - ZtCObjList& JoinHead(ZtCObjList& rhs)*/ + if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;} - ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink& AR_CLink) + if(size()<=1){return *this;} AddLinkAfter + ( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ; + + return *this; /**************************/ + }/* + ZtCObjList& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/ + ZtCObjList& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) { - // rhs 의 AP_CLink 를 앞으로 연결한다. + if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;} - if(this==&rhs) return *this; + if(size()<=1){return *this;} AddLinkBefore + ( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ; - JoinAfter - (rhs.CutLink(&AR_CLink), 0); - - return *this; + return *this; /**************************/ }/* - ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink& AR_CLink)*/ + ZtCObjList& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/ - ZtCObjList& JoinTail(ZtCObjList& rhs) + ZtCObjList& MoveLinkHead(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/ { - if(this==&rhs) return *this; JoinAfter(rhs, GetTailLinkPtr()); return *this; - }/* - ZtCObjList& JoinTail(ZtCObjList& rhs)*/ + if(&AR_MoveLink==mp_HeadLink){return *this;} - ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink& AR_CLink) + if(size()<=1){return *this;} AddLinkAfter + ( 0, CutLink(&AR_MoveLink) ) ; + return *this; /**************************/ + }/* + ZtCObjList& MoveLinkHead(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/ + ZtCObjList& MoveLinkTail(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/ { - // rhs 의 AR_CLink 를 뒤로 연결한다. + if(&AR_MoveLink==mp_TailLink){return *this;} - if(this==&rhs) return *this; - - JoinAfter ////////////////////////////////////// - ( - rhs.CutLink(&AR_CLink), GetTailLinkPtr() - ); - return *this; ////////////////////////////////// + if(size()<=1){return *this;} AddLinkBefore + ( 0, CutLink(&AR_MoveLink) ) ; + return *this; /**************************/ }/* - ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink& AR_CLink)*/ + ZtCObjList& MoveLinkTail(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/ - ZtCObjList& JoinAfter /*######################################################*/ + void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 앞에 연결한다. + { SendOutAfter (AR_CutLink, rhs, ZCLinkOpt(0)); } + void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 뒤에 연결한다. + { SendOutBefore(AR_CutLink, rhs, ZCLinkOpt(0)); } + + + ZtCObjList& SendRangeOut /////////////////////////////////////////////// ( - ZtCObjList& rhs , - ZCLink& AR_LinkOfRhs, - ZCLinkOpt AO_StdOpt - ) - /*#############################################################################*/ - { - // rhs 의 AP_LinkOfRhs 링크를 잘라서 AO_StdOpt 뒤에 붙인다. - - if(this==&rhs) return *this; - - JoinAfter( - rhs.CutLink(&AR_LinkOfRhs), AO_StdOpt.Raw() ); - - return *this; - }/* - ZtCObjList& JoinAfter ########################################################## - ( - ZtCObjList& rhs , - ZCLink& AR_LinkOfRhs, - ZCLinkOpt AO_StdOpt - ) - ###############################################################################*/ - - - void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) - { - // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. - - CutLink(&AR_CutLink); rhs.JoinAfter(&AR_CutLink, &AR_StdLink); - }/* - void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ - - void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) - { - // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 앞에 연결한다. - - CutLink(&AR_CutLink); rhs.JoinBefore(&AR_CutLink, &AR_StdLink); - }/* - void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ - - - void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) - { CutLink(&AR_CutLink); rhs.JoinAfter (&AR_CutLink, 0); } - - void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) - { CutLink(&AR_CutLink); rhs.JoinBefore(&AR_CutLink, 0); } - - - TypeThis& SendRangeOut ////////////////////////////////////////////////// - ( - ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, - TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, TypeThis& rhs , + ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ { - return CutLinkRangeOut + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + return CutLinkRangeOut /************************/ ( - &AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), AB_After + AR_CutHead, AR_CutTail , AI_CutSize, + rhs , AO_LinkOpt.Raw(), AB_After ); - ////////////////////// - }/* - TypeThis& SendRangeOutAfter ///////////////////////////////////////////// + /***********************************************/ + } + /*#####################################################################*/ + + + ZtCObjList& SendRangeOutAfter ////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) - #######################################################################*/ - - - TypeThis& SendRangeOutAfter ///////////////////////////////////////////// - ( - ZCLink& AR_CutHead, ZCLink& AR_CutTail, - TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt - ) /*#####################################################################*/ { - // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AO_ObjOpt 뒤에 연결한다. + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. - return CutLinkRangeOut + return CutLinkRangeOut ///////////// ( - &AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true + AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), true ); - ////////////////////// + //////////////////////////////////// } - TypeThis& SendRangeOutBefore //////////////////////////////////////////// - ( - ZCLink& AR_CutHead, ZCLink& AR_CutTail, - TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt - ) - /*#####################################################################*/ - { - // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AO_ObjOpt 뒤에 연결한다. - - return CutLinkRangeOut - ( - &AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), false - ); - ////////////////////// - }/* - TypeThis& SendRangeOutAfter ///////////////////////////////////////////// + ZtCObjList& SendRangeOutBefore ///////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) - #######################################################################*/ - - - ZtCObjList& CopyThis(ZtCObjList& ARR_Rhs) const + /*#####################################################################*/ { - return CopyLink(mp_HeadLink, ml_LinkSize-1, RR(ARR_Rhs)); - }/* - ZtCObjList& CopyThis(ZtCObjList& ARR_Rhs) const*/ + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + return CutLinkRangeOut + ( + AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw(), false + ); + ////////////////////// + } + /*#####################################################################*/ - - operator Type&() + ZtCObjList& SendRangeIn ///////////////////////////////////////////////// + ( + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt, bool AB_After + ) + /*#####################################################################*/ { - return AddDefault(1, ml_LinkSize+1)->GetData(); - }/* - operator Type&()*/ + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 AR_StdLink 뒤에 연결한다. + if(AI_CutSize < 1 ){return *this;} + if(AI_CutSize >= size()){return *this;} - Type& GetData(TypeSize AI_Index) + ZtCObjList VO_Saver; CutLinkRangeOut /***********/ + ( + AR_CutHead , AR_CutTail , AI_CutSize, + RR(VO_Saver), AO_LinkOpt.Raw(), AB_After + ); + /*************************************************/ + + if(AB_After) + return JoinAfter (VO_Saver, AO_LinkOpt); + else return JoinBefore(VO_Saver, AO_LinkOpt); + } + /*#####################################################################*/ + + ZtCObjList& SendRangeInAfter //////////////////////////////////////////// + ( + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ { - return GetLinkPtr(AI_Index)->GetData(); - }/* - Type& GetData(TypeSize AI_Index)*/ - - const Type& GetData(TypeSize AI_Index) const + return SendRangeIn + ( AR_CutHead, AR_CutTail, AI_CutSize, AO_LinkOpt, true ); + } + /*#####################################################################*/ + ZtCObjList& SendRangeInBefore /////////////////////////////////////////// + ( + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ { - return GetLinkPtr(AI_Index)->GetData(); - }/* - const Type& GetData(TypeSize AI_Index) const*/ + return SendRangeIn + ( AR_CutHead, AR_CutTail, AI_CutSize, AO_LinkOpt, false); + } + /*#####################################################################*/ - - Type& GetHeadData() + ZtCObjList& SendRangeInHead ///////////////////////////////////////////// + ( + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ { - return mp_HeadLink->GetData(); - }/* - Type& GetHeadData()*/ - - Type& GetTailData() + return SendRangeIn + ( AR_CutHead, AR_CutTail, AI_CutSize, ZCLinkOpt(0), true ); + } + /*#####################################################################*/ + ZtCObjList& SendRangeInTail //////////////////////////////////////////// + ( + ZCLink& AR_CutHead, ZCLink& AR_CutTail, + TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ { - return mp_HeadLink->mp_PrevLink->GetData(); - }/* - Type& GetTailData()*/ + return SendRangeIn + ( AR_CutHead, AR_CutTail, AI_CutSize, ZCLinkOpt(0), false); + } + /*#####################################################################*/ - const Type& GetHeadData() const - { - return mp_HeadLink->GetData(); - }/* - const Type& GetHeadData() const*/ - const Type& GetTailData() const + + + TypeThis& CopyThis(TypeThis& ARR_Rhs) const { - return mp_HeadLink->mp_PrevLink->GetData(); + // *this 를 복사해서, ARR_Rhs 의 끝에 연결한다. + + if(size()<1) return ARR_Rhs; + + ZCLink* VP_HeadCopy=0; + ZCLink* VP_TailCopy=0; + + mo_FreeObjt.SendFreeOutCopy //////////// + ( + mp_HeadLink , size()-1, + RR(VP_HeadCopy), RR(VP_TailCopy) + ); + //////////////////////////////////////// + + TypeThis VO_TempList; + + VO_TempList.mp_HeadLink=VP_HeadCopy ; + VO_TempList.mp_TailLink=VP_TailCopy ; + VO_TempList.ml_LinkSize=size() ; + + return ARR_Rhs.JoinTail(VO_TempList); }/* - const Type& GetTailData() const*/ + TypeThis& CopyThis(TypeThis& ARR_Rhs) const*/ + + + + ZCFreeHeap& GetCFreeHeap() const{return mo_FreeObjt;} + + + TypeData& GetHeadData(){return mp_HeadLink->mo_DataObjt;} + TypeData& GetTailData(){return mp_TailLink->mo_DataObjt;} + + const TypeData& GetHeadData() const{return mp_HeadLink->mo_DataObjt;} + const TypeData& GetTailData() const{return mp_TailLink->mo_DataObjt;} + + operator TypeData&() { return AddTail() ; } ZCDataOpt GetHeadDataOpt() { if(mp_HeadLink==0) return ZCDataOpt(0); - return ZCDataOpt(**mp_HeadLink); - }/* - ZCDataOpt GetHeadDataOpt()*/ + return ZCDataOpt(mp_HeadLink->mo_DataObjt); + } ZCDataOpt GetTailDataOpt() { - if(mp_HeadLink==0) return ZCDataOpt(0); + if(mp_TailLink==0) return ZCDataOpt(0); - return ZCDataOpt(**mp_HeadLink->mp_PrevLink); + return ZCDataOpt(mp_TailLink->mo_DataObjt); }/* ZCDataOpt GetTailDataOpt()*/ @@ -2318,55 +2158,47 @@ namespace ZNsMain { if(mp_HeadLink==0) return ZCDataOpt(0); - return ZCDataOpt(**mp_HeadLink); - }/* - const ZCDataOpt GetHeadDataOpt() const*/ + return ZCDataOpt(mp_HeadLink->mo_DataObjt); + } const ZCDataOpt GetTailDataOpt() const { - if(mp_HeadLink==0) return ZCDataOpt(0); + if(mp_TailLink==0) return ZCDataOpt(0); - return ZCDataOpt(**mp_HeadLink->mp_PrevLink); + return ZCDataOpt(mp_TailLink->mo_DataObjt); }/* - const ZCDataOpt GetTailDataOpt() const*/ + const ZCDataOpt GetTailDataOpt()*/ - ZCDataOpt GetDataOpt(TypeSize AI_Index) - { - if(mp_HeadLink==0) return ZCDataOpt(0); - return ZCDataOpt( GetLinkPtr(AI_Index)->GetData() ); - }/* - ZCDataOpt GetDataOpt(TypeSize AI_Index)*/ + TypeSize size() const{ return ml_LinkSize; } + TypeSize GetSize() const{ return ml_LinkSize; } - const ZCDataOpt GetDataOpt(TypeSize AI_Index) const - { - if(mp_HeadLink==0) return ZCDataOpt(0); + TypeSize capacity () const + { return mo_FreeObjt.size()+size(); } + TypeSize size_free() const + { return mo_FreeObjt.size() ; } - return ZCDataOpt( GetLinkPtr(AI_Index)->GetData() ); - }/* - const ZCDataOpt GetDataOpt(TypeSize AI_Index) const*/ + TypeSize GetFreeSize() const{ return size_free(); } - Type& front(){return GetHeadData();} - Type& back (){return GetTailData();} + bool IsEmpty() const{return ml_LinkSize<1;} + bool empty () const{return ml_LinkSize<1;} - const Type& front() const{return GetHeadData();} - const Type& back () const{return GetTailData();} + void clear (){DeleteAll();} - ZtCObjList& Rotate(TypeSize AL_RotateNum) - { - if(ml_LinkSize>0) mp_HeadLink = - mp_HeadLink->GetNextPrevPtr(AL_RotateNum); + void push_front(TypeArg AO_ArgData){AddHead(AO_ArgData);} + void push_back (TypeArg AO_ArgData){AddTail(AO_ArgData);} - return *this; - }/* - ZtCObjList& Rotate(TypeSize AL_RotateNum)*/ + void pop_front(){DeleteHead();} + void pop_back (){DeleteTail();} - ZtCObjList& Rotate () - { if(ml_LinkSize>0) mp_HeadLink = mp_HeadLink->mp_NextLink ; return *this; } - ZtCObjList& RotateBack() - { if(ml_LinkSize>0) mp_HeadLink = mp_HeadLink->mp_PrevLink ; return *this; } + + TypeData& front(){return GetHeadData();} + TypeData& back (){return GetTailData();} + + const TypeData& front() const{return GetHeadData();} + const TypeData& back () const{return GetTailData();} template void IterElement(TFunctor AO_Functor) @@ -2376,15 +2208,14 @@ namespace ZNsMain __for0(TypeSize, i, ml_LinkSize) { ZtCTypeData:: - GetObjRef(AO_Functor)( **VP_LoopLink ); + GetObjRef(AO_Functor)(VP_LoopLink->mo_DataObjt); VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(TypeSize, i, ml_LinkSize)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor) */ - template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) { @@ -2403,145 +2234,22 @@ namespace ZNsMain VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(TypeSize, i, ml_LinkSize)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ template - < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > - void IterElement - ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) - /*#############################################################################*/ - { - typedef ZNsMain::ZtCCheckRef ZCCheckRef1; - typedef ZNsMain::ZtCCheckRef ZCCheckRef2; - - ZCLink* VP_LoopLink=mp_HeadLink; - - __for0(TypeSize, i, ml_LinkSize) - { - ZtCTypeData::GetObjRef(AO_Functor) - ( - **VP_LoopLink - , ZCCheckRef1::PassData(AO_TypeHelp1) - , ZCCheckRef2::PassData(AO_TypeHelp2) - ); - //////////////////////////////////////////// - - VP_LoopLink = VP_LoopLink->mp_NextLink ; - }/* - __for0(TypeSize, i, ml_LinkSize)*/ - }/* - template - < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > - void IterElement - ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) - ###############################################################################*/ - - - template - void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) - { - /* TTypeHelp 을 참조로 받고 있음에 주의한다. -- 2015-09-07 02:55:00 */ - - ZCLink* VP_LoopLink=mp_HeadLink; - - __for0(TypeSize, i, ml_LinkSize) - { - ZtCTypeData::GetObjRef - (AO_Functor)(**VP_LoopLink, AR_TypeHelp); - - VP_LoopLink = VP_LoopLink->mp_NextLink ; - }/* - __for0(TypeSize, i, ml_LinkSize)*/ - }/* - template - void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) */ - - - template - < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > - void IterElemRef - ( TFunctor AO_Functor, TTypeHelp1& AR_TypeHelp1, TTypeHelp2& AR_TypeHelp2 ) - /*#############################################################################*/ - { - /* TTypeHelp1 과 2 을 참조로 받고 있음에 주의한다. -- 2021-03-04 04:00:00 */ - - ZCLink* VP_LoopLink=mp_HeadLink; - - __for0(TypeSize, i, ml_LinkSize) - { - ZtCTypeData::GetObjRef(AO_Functor) - ( **VP_LoopLink, AR_TypeHelp1, AR_TypeHelp2 ); - - VP_LoopLink = VP_LoopLink->mp_NextLink ; - }/* - __for0(TypeSize, i, ml_LinkSize)*/ - }/* - template - < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > - void IterElemRef - ( TFunctor AO_Functor, TTypeHelp1& AR_TypeHelp1, TTypeHelp2& AR_TypeHelp2 ) - ###############################################################################*/ - - - template void IterElemRev(TFunctor AO_Functor) - { - // 끝에서부터 순회한다. - - if(size()<1) return; ZCLink* - VP_LoopLink = mp_HeadLink->mp_PrevLink; - - __for0(TypeSize, i, ml_LinkSize) - { - ZtCTypeData:: - GetObjRef(AO_Functor)( **VP_LoopLink ); - - VP_LoopLink = VP_LoopLink->mp_PrevLink ; - }/* - __for0(TypeSize, i, ml_LinkSize)*/ - }/* - template void IterElemRev(TFunctor AO_Functor) */ - - template - void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) - { - if(size()<1) return; ////////////////////////////// - - typedef ZNsMain::ZtCCheckRef ZCCheckRef; - - ZCLink* VP_LoopLink = mp_HeadLink->mp_PrevLink ; - - __for0(TypeSize, i, ml_LinkSize) - { - ZtCTypeData::GetObjRef(AO_Functor) - ( - **VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp) - ); - //////////////////////////////////////////// - - VP_LoopLink = VP_LoopLink->mp_PrevLink ; - }/* - __for0(TypeSize, i, ml_LinkSize)*/ - }/* - template - void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ - - - template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > - void IterElemRev + void IterElement ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) /*#############################################################################*/ { - if(size()<1) return; - typedef ZNsMain::ZtCCheckRef ZCCheckRef1; typedef ZNsMain::ZtCCheckRef ZCCheckRef2; - ZCLink* VP_LoopLink = mp_HeadLink->mp_PrevLink ; + ZCLink* VP_LoopLink=mp_HeadLink; __for0(TypeSize, i, ml_LinkSize) { @@ -2553,9 +2261,76 @@ namespace ZNsMain ); //////////////////////////////////////////// + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(TypeSize, i, ml_Size)*/ + }/* + template + < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > + void IterElement + ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) + ###############################################################################*/ + + + template void IterElemRev(TFunctor AO_Functor) + { + ZCLink* VP_LoopLink=mp_TailLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData:: + GetObjRef(AO_Functor)(**VP_LoopLink); + VP_LoopLink = VP_LoopLink->mp_PrevLink ; }/* - __for0(TypeSize, i, ml_LinkSize)*/ + __for0(TypeSize, i, ml_Size)*/ + }/* + template void IterElemRev(TFunctor AO_Functor) */ + + template + void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain:: + ZtCCheckRef ZCCheckRef; + + ZCLink* VP_LoopLink = mp_TailLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData::GetObjRef(AO_Functor) + ( + **VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp) + ); + VP_LoopLink = VP_LoopLink->mp_PrevLink ; + }/* + __for0(TypeSize, i, ml_Size)*/ + }/* + template + void IterElemRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ + + + template + < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > + void IterElemRev + ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) + /*#############################################################################*/ + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef1; + typedef ZNsMain::ZtCCheckRef ZCCheckRef2; + + ZCLink* VP_LoopLink = mp_TailLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData::GetObjRef(AO_Functor) + ( + VP_LoopLink->mo_DataObjt + , ZCCheckRef1::PassData(AO_TypeHelp1) + , ZCCheckRef2::PassData(AO_TypeHelp2) + ); + VP_LoopLink = VP_LoopLink->mp_PrevLink ; + }/* + __for0(TypeSize, i, ml_Size)*/ }/* template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > @@ -2636,53 +2411,371 @@ namespace ZNsMain ###############################################################################*/ - template void IterElemLink /////////////////////// - ( - ZCLink& AR_StdLink , - TypeSize AL_WorkDistance, - TFunctor AO_Functor - ) - /*#################################################################*/ + template void IterElemLinkRev(TFunctor AO_Functor) { - /* AP_StdLink 부터 AL_WorkDistance 만큼 이동하면서 - * 각 ZCLink 에 대하여 AO_Functor() 함수를 수행한다. - (총 수행 횟수는 (AL_WorkDistance)절대값+1) - */ - ZCLink* VP_StdLink = &AR_StdLink; + ZCLink* VP_LoopLink = mp_TailLink ; - if(AL_WorkDistance>=0) + __for0(TypeSize, i, ml_LinkSize) { - for(TypeSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop) - { - ZtCTypeData:: - GetObjRef(AO_Functor)(*VP_StdLink); + ZtCTypeData:: + GetObjRef(AO_Functor)( *VP_LoopLink ); - VP_StdLink = VP_StdLink->mp_NextLink ; - }/* - for(TypeSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop)*/ - } - else // AL_WorkDistance<0 - { - AL_WorkDistance = -AL_WorkDistance; - - for(TypeSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop) - { - ZtCTypeData:: - GetObjRef(AO_Functor)(*VP_StdLink); - - VP_StdLink = VP_StdLink->mp_PrevLink ; - }/* - for(TypeSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop)*/ + VP_LoopLink = VP_LoopLink->mp_PrevLink ; }/* - else // AL_WorkDistance<0*/ + __for0(TypeSize, i, ml_LinkSize)*/ }/* - void IterElemLink /////////////////////////////////////////////////// - ( - ZCLink& AR_StdLink , - TypeSize AL_WorkDistance, - TFunctor AO_Functor - ) - ###################################################################*/ + template void IterElemLinkRev(TFunctor AO_Functor) */ + + + template + void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain:: + ZtCCheckRef ZCCheckRef; + + ZCLink* VP_LoopLink=mp_TailLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData::GetObjRef(AO_Functor) + ( + *VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp) + ); + //////////////////////////////////////////// + + VP_LoopLink = VP_LoopLink->mp_PrevLink ; + }/* + __for0(TypeSize, i, ml_LinkSize)*/ + }/* + template + void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ + + + template + < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > + void IterElemLinkRev + ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) + /*#############################################################################*/ + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef1; + typedef ZNsMain::ZtCCheckRef ZCCheckRef2; + + ZCLink* VP_LoopLink=mp_TailLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData::GetObjRef(AO_Functor) + ( + *VP_LoopLink + , ZCCheckRef1::PassData(AO_TypeHelp1) + , ZCCheckRef2::PassData(AO_TypeHelp2) + ); + //////////////////////////////////////////// + + VP_LoopLink = VP_LoopLink->mp_PrevLink ; + }/* + __for0(TypeSize, i, ml_LinkSize)*/ + }/* + template + < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > + void IterElemLinkRev + ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) + ###############################################################################*/ + + + + ZCLink* GetHeadLinkPtr(){return mp_HeadLink;} + ZCLink* GetTailLinkPtr(){return mp_TailLink;} + + const ZCLink* GetHeadLinkPtr() const{return mp_HeadLink;} + const ZCLink* GetTailLinkPtr() const{return mp_TailLink;} + + ZCLink* GetLinkPtr(TypeSize AI_Index) {return mp_HeadLink->GetNextPrevPtr(AI_Index-1);} + const ZCLink* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);} + + + ZCLink& GetHeadLink(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;} + ZCLink& GetTailLink(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;} + + const ZCLink& GetHeadLink(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;} + const ZCLink& GetTailLink(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} + + + ZCLink& GetLink(TypeSize AI_Index) {return (*mp_HeadLink)+(AI_Index-1);} + const ZCLink& GetLink(TypeSize AI_Index) const{return (*mp_HeadLink)+(AI_Index-1);} + + + ZCLink* HeadPtr(){return mp_HeadLink;} + ZCLink* TailPtr(){return mp_TailLink;} + + ZCLink* HeadPtr(TypeSize AI_Distance){return &((*mp_HeadLink)+AI_Distance);} + ZCLink* TailPtr(TypeSize AI_Distance){return &((*mp_TailLink)-AI_Distance);} + + const ZCLink* HeadPtr() const{return mp_HeadLink;} + const ZCLink* TailPtr() const{return mp_TailLink;} + + const ZCLink* HeadPtr(TypeSize AI_Distance) const{return &((*mp_HeadLink)+AI_Distance);} + const ZCLink* TailPtr(TypeSize AI_Distance) const{return &((*mp_TailLink)-AI_Distance);} + + + ZCLink& HeadRef(){return *mp_HeadLink;} + ZCLink& TailRef(){return *mp_TailLink;} + + ZCLink& HeadRef(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;} + ZCLink& TailRef(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;} + + const ZCLink& HeadRef() const{return *mp_HeadLink;} + const ZCLink& TailRef() const{return *mp_TailLink;} + + const ZCLink& HeadRef(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;} + const ZCLink& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} + + + ZCDataOpt GetDataOpt(TypeSize AI_Index) // 1부터 시작. + { + return DataOpt(AI_Index-1); + }/* + ZCDataOpt GetDataOpt(TypeSize AI_Index)*/ + + const ZCDataOpt GetDataOpt(TypeSize AI_Index) const + { + return DataOpt(AI_Index-1); + }/* + const ZCDataOpt GetDataOpt(TypeSize AI_Index) const*/ + + + ZCDataOpt DataOpt(TypeSize AI_Index) // 1부터 + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Index-1)); + }/* + ZCDataOpt DataOpt(TypeSize AI_Index)*/ + + const ZCDataOpt DataOpt(TypeSize AI_Index) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Index-1)); + }/* + const ZCDataOpt DataOpt(TypeSize AI_Index) const*/ + + + ZCDataOpt HeadOptD(TypeSize AI_Distance=0) + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Distance)); + }/* + ZCDataOpt HeadOptD(TypeSize AI_Distance=0)*/ + + ZCDataOpt TailOptD(TypeSize AI_Distance=0) + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**TailPtr(AI_Distance)); + }/* + ZCDataOpt TailOptD(TypeSize AI_Distance=0)*/ + + + const ZCDataOpt HeadOptD(TypeSize AI_Distance=0) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**HeadPtr(AI_Distance)); + }/* + const ZCDataOpt HeadOptD(TypeSize AI_Distance=0) const*/ + + const ZCDataOpt TailOptD(TypeSize AI_Distance=0) const + { + if(mp_HeadLink==0){return ZCDataOpt(0);} + + return ZCDataOpt(**TailPtr(AI_Distance)); + }/* + const ZCDataOpt TailOptD(TypeSize AI_Distance=0) const*/ + + + ZCLinkOpt HeadOpt(){return ZCLinkOpt(mp_HeadLink);} + ZCLinkOpt TailOpt(){return ZCLinkOpt(mp_TailLink);} + + ZCLinkOpt HeadOpt(TypeSize AI_Distance) + {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} + ZCLinkOpt TailOpt(TypeSize AI_Distance) + {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} + + const ZCLinkOpt HeadOpt() const{return ZCLinkOpt(mp_HeadLink);} + const ZCLinkOpt TailOpt() const{return ZCLinkOpt(mp_TailLink);} + + const ZCLinkOpt HeadOpt(TypeSize AI_Distance) const + {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} + const ZCLinkOpt TailOpt(TypeSize AI_Distance) const + {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} + + + ZCLink& _1(){return HeadRef();} + ZCLink& _0(){return TailRef();} + + ZCLink& _1(TypeSize AI_Distance){return HeadRef(AI_Distance);} + ZCLink& _0(TypeSize AI_Distance){return TailRef(AI_Distance);} + + const ZCLink& _1() const{return HeadRef();} + const ZCLink& _0() const{return TailRef();} + + const ZCLink& _1(TypeSize AI_Distance) const{return HeadRef(AI_Distance);} + const ZCLink& _0(TypeSize AI_Distance) const{return TailRef(AI_Distance);} + + + /***/ ZCLinkOpt GetLinkOpt(TypeSize AI_Index) + { if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); } + const ZCLinkOpt GetLinkOpt(TypeSize AI_Index) const + { if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); } + + + + IterEasy GetHeadIterEasy (){return GetHeadLinkPtr();} + IterEasy GetTailIterEasy (){return GetTailLinkPtr();} + IterEasyID GetHeadIterEasyID (){return (IterEasyID)GetHeadLinkPtr();} + IterEasyID GetTailIterEasyID (){return (IterEasyID)GetTailLinkPtr();} + + IterEasy GetHeadIterEasy () const{return GetHeadLinkPtr();} + IterEasy GetTailIterEasy () const{return GetTailLinkPtr();} + IterEasyID GetHeadIterEasyID () const{return (IterEasyID)GetHeadLinkPtr();} + IterEasyID GetTailIterEasyID () const{return (IterEasyID)GetTailLinkPtr();} + + IterEasyIDc GetHeadIterEasyIDc() const{return (IterEasyIDc)GetHeadLinkPtr();} + IterEasyIDc GetTailIterEasyIDc() const{return (IterEasyIDc)GetTailLinkPtr();} + + void MoveNextIter(ZCLink*& APR_CLink ) const + { + APR_CLink=APR_CLink->GetNextPtr(); + } + void MoveNextIter(IterEasyID& ARRI_IterEasyID) const + { + MoveNextIter((ZCLink*&)(ARRI_IterEasyID)); + } + void MoveNextIter(const ZCLink*& APR_CLink ) const + { + APR_CLink=APR_CLink->GetNextPtr(); + } + void MoveNextIter(IterEasyIDc& ARRI_IterEasyID) const + { + MoveNextIter((const ZCLink*&)(ARRI_IterEasyID)); + }/* + void MoveNextIter(IterEasyIDc& ARRI_IterEasyID) const*/ + + + void MovePrevIter(ZCLink*& APR_CLink ) const + { + APR_CLink=APR_CLink->GetPrevPtr(); + } + void MovePrevIter(IterEasyID& ARRI_IterEasyID) const + { + MovePrevIter((ZCLink*&)(ARRI_IterEasyID)); + } + void MovePrevIter(const ZCLink*& APR_CLink ) const + { + APR_CLink=APR_CLink->GetPrevPtr(); + } + void MovePrevIter(IterEasyIDc& ARRI_IterEasyID) const + { + MovePrevIter((const ZCLink*&)(ARRI_IterEasyID)); + }/* + void MovePrevIter(IterEasyIDc& ARRI_IterEasyID) const*/ + + + TypeData& GetDataInIter(ZCLink* AP_CLink ){return **AP_CLink ;} + TypeData& GetDataInIter(IterEasyID ARRI_IterEasyID) + { return GetDataInIter((ZCLink*)ARRI_IterEasyID); } + + const TypeData& GetDataInIter(const ZCLink* AP_CLink ) const + { return **AP_CLink ; } + const TypeData& GetDataInIter(IterEasyIDc ARRI_IterEasyID) const + { return GetDataInIter((const ZCLink*)ARRI_IterEasyID); } + + + TypeData& GetDataInIter( ZCLink* AP_CLink , TypeSize AI_FarNum) + {return **(AP_CLink->GetNextPrevPtr(AI_FarNum)) ; } + TypeData& GetDataInIter( IterEasyID ARRI_IterEasyID, TypeSize AI_FarNum) + { return GetDataInIter((ZCLink*)ARRI_IterEasyID, AI_FarNum); } + + const TypeData& GetDataInIter( const ZCLink* AP_CLink , TypeSize AI_FarNum) const + {return **(AP_CLink->GetNextPrePtr(AI_FarNum)) ; } + const TypeData& GetDataInIter( IterEasyIDc ARRI_IterEasyID, TypeSize AI_FarNum) const + { return GetDataInIter((ZCLink*)ARRI_IterEasyID, AI_FarNum); } + + + + IterEasy ItHEasy(){return GetHeadIterEasy ();} + IterEasy ItTEasy(){return GetTailIterEasy ();} + IterEasyID ItHID (){return GetHeadIterEasyID();} + IterEasyID ItTID (){return GetTailIterEasyID();} + + IterEasyIDc ItHIDc () const{return GetHeadIterEasyIDc();} + IterEasyIDc ItTIDc () const{return GetTailIterEasyIDc();} + + const IterEasy ItHEasy() const{return GetHeadIterEasy ();} + const IterEasy ItTEasy() const{return GetTailIterEasy ();} + const IterEasyID ItHID () const{return GetHeadIterEasyID ();} + const IterEasyID ItTID () const{return GetTailIterEasyID ();} + + void ItNext(ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} + void ItNext(IterEasyID& ARRI_IterEasyID) const{ItNext((ZCLink*&)(ARRI_IterEasyID));} + void ItNext(const ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} + void ItNext(IterEasyIDc& ARRI_IterEasyID) const + { ItNext((const ZCLink*&)(ARRI_IterEasyID)); } + + void ItPrev(ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;} + void ItPrev(IterEasyID& ARRI_IterEasyID) const{ItPrev((ZCLink*&)(ARRI_IterEasyID));} + void ItPrev(const ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;} + void ItPrev(IterEasyIDc& ARRI_IterEasyID) const + { ItPrev((const ZCLink*&)(ARRI_IterEasyID)); } + + TypeData& ItD(IterEasy AP_CLink ){return GetDataInIter(AP_CLink );} + TypeData& ItD(IterEasyID ARRI_IterEasyID){return GetDataInIter(ARRI_IterEasyID);} + + const TypeData& ItD(const IterEasy AP_CLink ) const{return GetDataInIter(AP_CLink );} + const TypeData& ItD(IterEasyIDc ARRI_IterEasyID ) const{return GetDataInIter(ARRI_IterEasyID);} + + + TypeData& ItD(IterEasy AP_CLink , TypeSize AI_FarNum){return GetDataInIter(AP_CLink , AI_FarNum);} + TypeData& ItD(IterEasyID ARRI_IterEasyID, TypeSize AI_FarNum){return GetDataInIter(ARRI_IterEasyID, AI_FarNum);} + + const TypeData& ItD(const IterEasy AP_CLink , TypeSize AI_FarNum) const{return GetDataInIter(AP_CLink , AI_FarNum);} + const TypeData& ItD(IterEasyIDc ARRI_IterEasyID , TypeSize AI_FarNum) const{return GetDataInIter(ARRI_IterEasyID, AI_FarNum);} + + + + ZtCObjList& Rotate(TypeSize AL_RotateNum) + { + if(ml_LinkSize>0) /***********************/ + { + mp_HeadLink = mp_HeadLink-> + GetNextPrevPtr(AL_RotateNum); + mp_TailLink = mp_HeadLink->mp_PrevLink; + } + return *this; /***************************/ + }/* + ZtCObjList& Rotate(TypeSize AL_RotateNum)*/ + ZtCObjList& Rotate() + { + if(ml_LinkSize>0) /************************/ + { + mp_HeadLink = mp_HeadLink->mp_NextLink ; + mp_TailLink = mp_HeadLink->mp_PrevLink ; + } + return *this; /****************************/ + }/* + ZtCObjList& Rotate()*/ + ZtCObjList& RotateBack() + { + if(ml_LinkSize>0) /************************/ + { + mp_HeadLink = mp_HeadLink->mp_PrevLink ; + mp_TailLink = mp_HeadLink->mp_PrevLink ; + } + return *this; /****************************/ + }/* + ZtCObjList& RotateBack()*/ @@ -2731,395 +2824,6 @@ namespace ZNsMain ///////////////////////////////////////////////////////////////////////////*/ - class ZCIterator - { - protected: - mutable ZCLink* mp_Link; - mutable TypeSize ml_Pos ; - public : - - ZCIterator(ZCLink* AP_CLink=0, TypeSize AL_Pos=0) - { - mp_Link=AP_CLink; - ml_Pos =AL_Pos ; - }/* - ZCIterator(ZCLink* AP_CLink=0, TypeSize AL_Pos=0)*/ - - ZCLink* GetLink() - { - return mp_Link; - }/* - ZCLink* GetLink()*/ - - const ZCLink* GetLink() const - { - return mp_Link; - }/* - const ZCLink* GetLink() const*/ - - TypeSize GetPos() const - { - return ml_Pos; - }/* - TypeSize GetPos() const*/ - - Type& operator *() - { - return mp_Link->GetData(); - }/* - Type& operator *()*/ - - const Type& operator *() const - { - return mp_Link->GetData(); - }/* - const Type& operator *() const*/ - - ZCIterator& operator++() - { - mp_Link=mp_Link->GetNextPtr(); ++ml_Pos; return *this; - }/* - ZCIterator& operator++()*/ - - const ZCIterator& operator++() const - { - mp_Link=mp_Link->GetNextPtr(); ++ml_Pos; return *this; - }/* - const ZCIterator& operator++() const*/ - - ZCIterator operator++(int) - { - ZCIterator VO_CIterator(*this); - - mp_Link=mp_Link->GetNextPtr(); - - ++ml_Pos; return VO_CIterator; - }/* - ZCIterator operator++(int)*/ - - const ZCIterator operator++(int) const - { - ZCIterator VO_CIterator(*this); - - mp_Link=mp_Link->GetNextPtr(); - - ++ml_Pos; return VO_CIterator; - }/* - const ZCIterator operator++(int) const*/ - - - ZCIterator& operator--() - { - mp_Link=mp_Link->GetPrevPtr(); --ml_Pos; return *this; - }/* - ZCIterator& operator--()*/ - - const ZCIterator& operator--() const - { - mp_Link=mp_Link->GetPrevPtr(); --ml_Pos; return *this; - }/* - const ZCIterator& operator--() const*/ - - ZCIterator operator--(int) - { - ZCIterator VO_CIterator(*this); - - mp_Link=mp_Link->GetPrevPtr(); - - --ml_Pos; return VO_CIterator; - }/* - ZCIterator operator--(int)*/ - - const ZCIterator operator--(int) const - { - ZCIterator VO_CIterator(*this); - - mp_Link=mp_Link->GetPrevPtr(); - - --ml_Pos; return VO_CIterator; - }/* - ZCIterator operator--(int) const*/ - - - ZCIterator operator+(TypeSize AI_FarNum) const - { - ZCIterator VO_CIterator(*this); - - VO_CIterator.mp_Link =mp_Link->GetNextPtr(AI_FarNum); - VO_CIterator.ml_Pos +=AI_FarNum ; - - return VO_CIterator; - }/* - ZCIterator operator+(TypeSize AI_FarNum) const*/ - - ZCIterator operator-(TypeSize AI_FarNum) const - { - ZCIterator VO_CIterator(*this); - - VO_CIterator.mp_Link =mp_Link->GetNextPtr(-AI_FarNum); - VO_CIterator.ml_Pos -=AI_FarNum ; - - return VO_CIterator; - }/* - ZCIterator operator-(TypeSize AI_FarNum) const*/ - - - bool operator==(const ZCIterator& rhs) const - { - return mp_Link==rhs.mp_Link && ml_Pos==rhs.ml_Pos ; - }/* - bool operator==(const ZCIterator& rhs) const*/ - bool operator!=(const ZCIterator& rhs) const - { - return mp_Link!=rhs.mp_Link || ml_Pos!=rhs.mp_Pos ; - }/* - bool operator!=(const ZCIterator& rhs) const*/ - - public: - };/* - class ZCIterator*/ - - - ZCIterator begin() - { - return ZCIterator(mp_HeadLink, (ml_LinkSize>0 ? 1 : 0) ); - }/* - ZCIterator begin()*/ - - ZCIterator end() - { - return ZCIterator(mp_HeadLink, (ml_LinkSize>0 ? ml_LinkSize+1 : 0) ); - }/* - ZCIterator end()*/ - - const ZCIterator begin() const - { - return ZCIterator(mp_HeadLink, (ml_LinkSize>0 ? 1 : 0) ); - }/* - const ZCIterator begin() const*/ - - const ZCIterator end() const - { - return ZCIterator(mp_HeadLink, (ml_LinkSize>0 ? ml_LinkSize+1 : 0) ); - }/* - const ZCIterator end() const*/ - - - void erase(ZCIterator& AR_CIterator) - { - return DeleteLink(AR_CIterator.GetLink(), AR_CIterator.GetPos()); - }/* - void erase(ZCIterator& AR_CIterator)*/ - - void erase(ZCIterator& AR_CIterator1, ZCIterator& AR_CIterator2) - { - ZtCObjList VO_CObjList; - - CutLink ////////////////////////////////////////////////// - ( - AR_CIterator1.GetLink(), AR_CIterator2.GetLink(), - AR_CIterator2.GetPos () - AR_CIterator1.GetPos (), - RR(VO_CObjList) - ) - .DeleteAll(); //////////////////////////////////////////// - }/* - void erase(ZCIterator& AR_CIterator1, ZCIterator& AR_CIterator2)*/ - - - IterEasy GetHeadIterEasy (){return GetHeadLinkPtr();} - IterEasy GetTailIterEasy (){return GetTailLinkPtr();} - IterEasyID GetHeadIterEasyID (){return (IterEasyID)GetHeadLinkPtr();} - IterEasyID GetTailIterEasyID (){return (IterEasyID)GetTailLinkPtr();} - - IterEasy GetHeadIterEasy () const{return GetHeadLinkPtr();} - IterEasy GetTailIterEasy () const{return GetTailLinkPtr();} - IterEasyID GetHeadIterEasyID () const{return (IterEasyID)GetHeadLinkPtr();} - IterEasyID GetTailIterEasyID () const{return (IterEasyID)GetTailLinkPtr();} - - IterEasyIDc GetHeadIterEasyIDc() const{return (IterEasyIDc)GetHeadLinkPtr();} - IterEasyIDc GetTailIterEasyIDc() const{return (IterEasyIDc)GetTailLinkPtr();} - - - /*/////////////////////////////////////////////////////////////////////////// - - ■ 순차적으로 각 원소를 순회할 수 있는 자료 구조, 즉 리스트나 배열 클래스는 - - MoveNextIter(), MovePrevIter() - - 멤버를 갖는 것으로 정했다. stl 의 반복자는 너무 일반화하다보니, 성능 상의 - 제약이 발생한 것 같다. - - -- 2011-06-07 20:25:00 - - GetDataInIter() 를 추가했다. - - -- 2011-06-12 16:35:00 - - ■ -- - - ///////////////////////////////////////////////////////////////////////////*/ - - void MoveNextIter(ZCLink*& APR_CLink ) const - { - APR_CLink=APR_CLink->GetNextPtr(); - } - void MoveNextIter(iterator& ARR_CIterator ) - { - ++ARR_CIterator; - } - void MoveNextIter(IterEasyID& ARRI_IterEasyID) const - { - MoveNextIter((ZCLink*&)(ARRI_IterEasyID)); - } - void MoveNextIter(const ZCLink*& APR_CLink ) const - { - APR_CLink=APR_CLink->GetNextPtr(); - } - void MoveNextIter(const iterator& ARR_CIterator ) const - { - ++ARR_CIterator; - } - void MoveNextIter(IterEasyIDc& ARRI_IterEasyID) const - { - MoveNextIter((const ZCLink*&)(ARRI_IterEasyID)); - }/* - void MoveNextIter(IterEasyIDc& ARRI_IterEasyID) const*/ - - - void MovePrevIter(ZCLink*& APR_CLink ) const - { - APR_CLink=APR_CLink->GetPrevPtr(); - } - void MovePrevIter(iterator& ARR_CIterator ) - { - --ARR_CIterator; - } - void MovePrevIter(IterEasyID& ARRI_IterEasyID) const - { - MovePrevIter((ZCLink*&)(ARRI_IterEasyID)); - } - void MovePrevIter(const ZCLink*& APR_CLink ) const - { - APR_CLink=APR_CLink->GetPrevPtr(); - } - void MovePrevIter(const iterator& ARR_CIterator ) const - { - --ARR_CIterator; - } - void MovePrevIter(IterEasyIDc& ARRI_IterEasyID) const - { - MovePrevIter((const ZCLink*&)(ARRI_IterEasyID)); - }/* - void MovePrevIter(IterEasyIDc& ARRI_IterEasyID) const*/ - - - Type& GetDataInIter(ZCLink* AP_CLink ){return **AP_CLink ;} - Type& GetDataInIter(iterator& ARR_CIterator ){return *ARR_CIterator;} - Type& GetDataInIter(IterEasyID ARRI_IterEasyID) - { return GetDataInIter((ZCLink*)ARRI_IterEasyID); } - - Type& GetDataInIter(ZCLink* AP_CLink, TypeSize AI_FarNum) - { - return **AP_CLink->GetNextPrevPtr(AI_FarNum); - }/* - Type& GetDataInIter(ZCLink* AP_CLink, TypeSize AI_FarNum)*/ - - Type& GetDataInIter(iterator& ARR_CIterator, TypeSize AI_FarNum) - { - return *(ARR_CIterator+AI_FarNum); - }/* - Type& GetDataInIter(iterator& ARR_CIterator, TypeSize AI_FarNum)*/ - - Type& GetDataInIter(IterEasyID ARRI_IterEasyID, TypeSize AI_FarNum) - { - return GetDataInIter((ZCLink*)ARRI_IterEasyID, AI_FarNum); - }/* - Type& GetDataInIter(IterEasyID ARRI_IterEasyID, TypeSize AI_FarNum)*/ - - - const Type& GetDataInIter(const ZCLink* AP_CLink) const - { - return **AP_CLink; - }/* - const Type& GetDataInIter(const ZCLink* AP_CLink) const*/ - - const Type& GetDataInIter(const iterator& ARR_CIterator) const - { - return *ARR_CIterator; - }/* - const Type& GetDataInIter(const iterator& ARR_CIterator) const*/ - - const Type& GetDataInIter(IterEasyIDc ARRI_IterEasyID) const - { - return GetDataInIter((const ZCLink*)ARRI_IterEasyID); - }/* - const Type& GetDataInIter(IterEasyIDc ARRI_IterEasyID) const*/ - - - const Type& GetDataInIter(const ZCLink* AP_CLink, TypeSize AI_FarNum) const - { - return **AP_CLink->GetNextPrevPtr(AI_FarNum); - }/* - const Type& GetDataInIter(const ZCLink* AP_CLink, TypeSize AI_FarNum) const*/ - - const Type& GetDataInIter(const iterator& ARR_CIterator, TypeSize AI_FarNum) const - { - return *(ARR_CIterator+AI_FarNum); - }/* - const Type& GetDataInIter(const iterator& ARR_CIterator, TypeSize AI_FarNum) const*/ - - const Type& GetDataInIter(IterEasyIDc ARRI_IterEasyID, TypeSize AI_FarNum) const - { - return GetDataInIter((ZCLink*)ARRI_IterEasyID, AI_FarNum); - }/* - const Type& GetDataInIter(IterEasyIDc ARRI_IterEasyID, TypeSize AI_FarNum) const*/ - - - // cf typedef ZCLink* IterEasy; - - IterEasy ItHEasy(){return GetHeadIterEasy ();} - IterEasy ItTEasy(){return GetTailIterEasy ();} - IterEasyID ItHID (){return GetHeadIterEasyID();} - IterEasyID ItTID (){return GetTailIterEasyID();} - - IterEasyIDc ItHIDc () const{return GetHeadIterEasyIDc();} - IterEasyIDc ItTIDc () const{return GetTailIterEasyIDc();} - - const IterEasy ItHEasy() const{return GetHeadIterEasy ();} - const IterEasy ItTEasy() const{return GetTailIterEasy ();} - const IterEasyID ItHID () const{return GetHeadIterEasyID ();} - const IterEasyID ItTID () const{return GetTailIterEasyID ();} - - void ItNext(ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} - void ItNext(iterator& ARR_CIterator ) {++ARR_CIterator;} - void ItNext(IterEasyID& ARRI_IterEasyID) const{ItNext((ZCLink*&)(ARRI_IterEasyID));} - void ItNext(const ZCLink*& APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} - void ItNext(const iterator& ARR_CIterator ) const{++ARR_CIterator;} - void ItNext(IterEasyIDc& ARRI_IterEasyID) const - { ItNext((const ZCLink*&)(ARRI_IterEasyID)); } - - void ItPrev(ZCLink*& APR_CLink ) const{APR_CLink=APR_CLink->GetPrevPtr() ;} - void ItPrev(iterator& ARR_CIterator ){--ARR_CIterator;} - void ItPrev(IterEasyID& ARRI_IterEasyID) const{ItPrev((ZCLink*&)(ARRI_IterEasyID));} - void ItPrev(const ZCLink*& APR_CLink ) const{APR_CLink=APR_CLink->GetPrevPtr() ;} - void ItPrev(const iterator& ARR_CIterator ) const{--ARR_CIterator;} - void ItPrev(IterEasyIDc& ARRI_IterEasyID) const - { ItPrev((const ZCLink*&)(ARRI_IterEasyID)); } - - Type& ItD(IterEasy AP_CLink ){return GetDataInIter(AP_CLink );} - Type& ItD(iterator& ARR_CIterator ){return GetDataInIter(ARR_CIterator );} - Type& ItD(IterEasyID ARRI_IterEasyID ){return GetDataInIter(ARRI_IterEasyID );} - Type& ItD(ZCLink* AP_CLink , TypeSize AI_FarNum){return GetDataInIter(AP_CLink , AI_FarNum);} - Type& ItD(iterator& ARR_CIterator , TypeSize AI_FarNum){return GetDataInIter(ARR_CIterator , AI_FarNum);} - Type& ItD(IterEasyID ARRI_IterEasyID, TypeSize AI_FarNum){return GetDataInIter(ARRI_IterEasyID, AI_FarNum);} - - const Type& ItD(const IterEasy AP_CLink ) const{return GetDataInIter(AP_CLink );} - const Type& ItD(const iterator& ARR_CIterator ) const{return GetDataInIter(ARR_CIterator );} - const Type& ItD(IterEasyIDc ARRI_IterEasyID ) const{return GetDataInIter(ARRI_IterEasyID );} - const Type& ItD(const ZCLink* AP_CLink , TypeSize AI_FarNum) const{return GetDataInIter(AP_CLink );} - const Type& ItD(const iterator& ARR_CIterator , TypeSize AI_FarNum) const{return GetDataInIter(ARR_CIterator , AI_FarNum);} - const Type& ItD(IterEasyIDc ARRI_IterEasyID, TypeSize AI_FarNum) const{return GetDataInIter(ARRI_IterEasyID, AI_FarNum);} - public: };/* template< typename TType /////////////////////////////////////////////////// diff --git a/ZCppMainTest/ZtCObjList_000.cpp b/ZCppMainTest/ZtCObjList_000.cpp index 941e628..879514d 100644 --- a/ZCppMainTest/ZtCObjList_000.cpp +++ b/ZCppMainTest/ZtCObjList_000.cpp @@ -117,8 +117,8 @@ namespace ZNsMain CStringList1 VO_ListOfStr10 ; CStringList2 VO_ListOfStr20 ; - ZCDataOpt1 VO_ZCDataOpt1 = VO_ListOfStr10.GetHeadDataOpt() ; - ZCLinkOpt1 VO_ZCLinkOpt1 = VO_ListOfStr10.GetTailLinkOpt() ; + ZCDataOpt1 VO_ZCDataOpt1 = VO_ListOfStr10.HeadOptD() ; + ZCLinkOpt1 VO_ZCLinkOpt1 = VO_ListOfStr10.TailOpt() ; if(bool(VO_ZCDataOpt1)) cout<<"# VO_ListOfStr10's head data : " <<*VO_ZCDataOpt1<