diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index f1a2eed..362e2fd 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -4522,6 +4522,8 @@ namespace ZNsMain /***/ TypeData& value() {return *mp_TypeData;} const TypeData& value() const{return *mp_TypeData;} + TypeData* Raw() const{return mp_TypeData;} + public : };/* template class ZtCObjOpt */ @@ -5303,6 +5305,9 @@ namespace ZNsMain typedef ZCLink* IterEasy ; // 가장 대표적으로 쓰일 수 있는 반복자. typedef ZCLink* iterator ; public: + typedef ZtCObjOpt ZCLinkOpt; + typedef ZtCObjOpt ZCDataOpt; + public: typedef ZNsType::ZtCTypeNowCRTP /////////////////////////////////////// < @@ -5820,6 +5825,92 @@ namespace ZNsMain void CutLink(ZCLink* AP_StdLink)*/ + ZtCBaseList& CutLinkRangeOut /*#######################################*/ + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCBaseList& rhs , + ZCLink* AP_RhsStd + ) + /*#####################################################################*/ + { + /*/////////////////////////////////////////////////////////// + + ■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. + AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. + + AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고, + rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면 + 맨 앞에 삽입한다. -- 2025-10-06 09:16 + + ///////////////////////////////////////////////////////////*/ + + if(this==&rhs ) return rhs; + if(ml_LinkSize<1) return rhs; + + if(AL_CutSize>=ml_LinkSize) // 모든 링크를 삭제할 때. + { + mp_HeadLink=0; + } + else if(&AR_CutHead==mp_HeadLink) // 잘라내려는 링크가 처음 링크를 포함할 때. + { + ZCLink::MakeRing + (mp_HeadLink=AR_CutTail.mp_NextLink, mp_TailLink); + } + else if(&AR_CutTail==mp_TailLink) // 잘라내려는 링크가 끝 링크를 포함할 때. + { + ZCLink::MakeRing(mp_HeadLink, mp_TailLink=AR_CutHead.mp_PrevLink); + } + else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. + { + ZCLink::JoinLink(AR_CutHead.mp_PrevLink, AR_CutTail.mp_NextLink); + }/* + else*/ + + ml_LinkSize -= AL_CutSize; + + + if(rhs.size()<1) + { + // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. + + ZCLink::MakeRing(&AR_CutHead, &AR_CutTail); + + rhs.mp_HeadLink = &AR_CutHead ; + rhs.mp_TailLink = &AR_CutTail ; + } + else if(AP_RhsStd==0) // 맨 앞에 삽입. + { + ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink); + ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink); + + rhs.mp_HeadLink = &AR_CutHead; + } + else // AP_RhsStd 의 뒤에 삽입. + { + ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ; + + ZCLink::JoinLink(AP_RhsStd , &AR_CutHead ); + ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext); + + if(AP_RhsStd==rhs.mp_TailLink) + { rhs.mp_TailLink = &AR_CutTail; } + }/* + else*/ + + rhs.ml_LinkSize += AL_CutSize; return rhs; + }/* + ZtCBaseList& CutLinkRangeOut ########################################### + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZtCBaseList& rhs , + ZCLink* AP_RhsStd + ) + #######################################################################*/ + /*private :*/ public : @@ -6102,13 +6193,15 @@ namespace ZNsMain void DeleteTail(TTypSize AL_DelSize)*/ - ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLink* AP_StdLink) + ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt) { // AP_StdLink 의 뒤에 rhs 를 삽입. if(rhs.ml_LinkSize<1) return *this; - if(AP_StdLink==0) // 맨 앞에 삽입 + ZCLink* VP_StdLink = AO_StdOpt.Raw(); + + if(VP_StdLink==0) // 맨 앞에 삽입 { if(ml_LinkSize<1) { @@ -6134,15 +6227,15 @@ namespace ZNsMain return *this; }/* - if(AP_StdLink==0)*/ + if(VP_StdLink==0)*/ - ZCLink* VP_StdNext=AP_StdLink->mp_NextLink; + ZCLink* VP_StdNext=VP_StdLink->mp_NextLink; - ZCLink::JoinLink(AP_StdLink , rhs.mp_HeadLink ); + ZCLink::JoinLink(VP_StdLink , rhs.mp_HeadLink ); ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext ); - if(AP_StdLink==mp_TailLink) + if(VP_StdLink==mp_TailLink) { mp_TailLink=rhs.mp_TailLink; } rhs.mp_HeadLink =0 ; @@ -6151,16 +6244,18 @@ namespace ZNsMain ml_LinkSize += rhs.ml_LinkSize; return *this; }/* - ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLink* AP_StdLink)*/ + ZtCBaseList& JoinAfter(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/ - ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLink* AP_StdLink) + ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt) { // AP_StdLink 의 앞에 rhs 를 삽입. if(rhs.size()<1) return *this; - if(AP_StdLink==0) // 맨 뒤에 삽입 + ZCLink* VP_StdLink = AO_StdOpt.Raw(); + + if(VP_StdLink==0) // 맨 뒤에 삽입 { if(ml_LinkSize<1) { @@ -6184,15 +6279,15 @@ namespace ZNsMain ml_LinkSize += rhs.ml_LinkSize; return *this; }/* - if(AP_StdLink==0)*/ + if(VP_StdLink==0)*/ - ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink; + ZCLink* VP_StdPrev = VP_StdLink->mp_PrevLink; ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink ); - ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink ); + ZCLink::JoinLink(rhs.mp_TailLink, VP_StdLink ); - if(AP_StdLink==mp_HeadLink) + if(VP_StdLink==mp_HeadLink) { mp_HeadLink = rhs.mp_HeadLink; } rhs.mp_HeadLink =0 ; @@ -6201,47 +6296,75 @@ namespace ZNsMain ml_LinkSize += rhs.ml_LinkSize; return *this; }/* - ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLink* AP_StdLink)*/ + ZtCBaseList& JoinBefore(ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/ ZtCBaseList& JoinHead(ZtCBaseList& rhs) - { if(this==&rhs) return *this; return JoinAfter (rhs, 0); } + { if(this==&rhs) return *this; return JoinAfter (rhs, ZCLinkOpt(0)); } ZtCBaseList& JoinTail(ZtCBaseList& rhs) - { if(this==&rhs) return *this; return JoinBefore(rhs, 0); } + { if(this==&rhs) return *this; return JoinBefore(rhs, ZCLinkOpt(0)); } - void SendOutAfter(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink) + void SendOutAfter (ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt) { // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다. - CutLink(AP_CutLink); rhs.AddLinkAfter(AP_StdLink, AP_CutLink); + CutLink(&AR_CutLink); rhs.AddLinkAfter(AO_StdOpt.Raw(), &AR_CutLink); }/* - void SendOutAfter(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)*/ + void SendOutAfter (ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/ - void SendOutBefore(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink) + void SendOutBefore(ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt) { // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. - CutLink(AP_CutLink); rhs.AddLinkBefore(AP_StdLink, AP_CutLink); + CutLink(&AR_CutLink); rhs.AddLinkBefore(AO_StdOpt.Raw(), &AR_CutLink); }/* - void SendOutBefore(ZCLink* AP_CutLink, ZtCBaseList& rhs, ZCLink* AP_StdLink)*/ + void SendOutBefore(ZCLink& AR_CutLink, ZtCBaseList& rhs, ZCLinkOpt AO_StdOpt)*/ - void SendOutHead(ZCLink* AP_CutLink, ZtCBaseList& rhs) + void SendOutHead(ZCLink& AR_CutLink, ZtCBaseList& rhs) { // AP_CutLink 를 잘라서 rhs 의 앞에 연결한다. - SendOutAfter (AP_CutLink, rhs, 0); + SendOutAfter (AR_CutLink, rhs, ZCLinkOpt(0)); } - void SendOutTail(ZCLink* AP_CutLink, ZtCBaseList& rhs) + void SendOutTail(ZCLink& AR_CutLink, ZtCBaseList& rhs) { // AP_CutLink 를 잘라서 rhs 의 뒤에 연결한다. - SendOutBefore(AP_CutLink, rhs, 0); + SendOutBefore(AR_CutLink, rhs, ZCLinkOpt(0)); }/* - void SendOutTail(ZCLink* AP_CutLink, ZtCBaseList& rhs)*/ + void SendOutTail(ZCLink& AR_CutLink, ZtCBaseList& rhs)*/ + ZtCBaseList& SendRangeOutAfter ////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCBaseList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + { + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + return CutLinkRangeOut + ( + AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw() + ); + ////////////////////// + }/* + ZtCBaseList& SendRangeOutAfter ////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCBaseList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + TypeData& GetHeadData(){return mp_HeadLink->mo_DataObjt;} TypeData& GetTailData(){return mp_TailLink->mo_DataObjt;} @@ -6252,6 +6375,37 @@ namespace ZNsMain operator TypeData&() { return AddTail() ; } + ZCDataOpt GetHeadDataOpt() + { + if(mp_HeadLink==0) return ZCDataOpt(0); + + return ZCDataOpt(mp_HeadLink->mo_DataObjt); + } + ZCDataOpt GetTailDataOpt() + { + if(mp_TailLink==0) return ZCDataOpt(0); + + return ZCDataOpt(mp_TailLink->mo_DataObjt); + }/* + ZCDataOpt GetTailDataOpt()*/ + + + const ZCDataOpt GetHeadDataOpt() const + { + if(mp_HeadLink==0) return ZCDataOpt(0); + + return ZCDataOpt(mp_HeadLink->mo_DataObjt); + } + const ZCDataOpt GetTailDataOpt() const + { + if(mp_TailLink==0) return ZCDataOpt(0); + + return ZCDataOpt(mp_TailLink->mo_DataObjt); + }/* + const ZCDataOpt GetTailDataOpt()*/ + + + TypeSize size() const{ return ml_LinkSize; } TypeSize GetSize() const{ return ml_LinkSize; } @@ -6534,6 +6688,21 @@ namespace ZNsMain const ZCLink* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);} + 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)); + }/* + const ZCLinkOpt GetLinkOpt(TypeSize AI_Index) const*/ + + ZCLink& GetHeadLink(TypeSize AI_Distance){return (*mp_HeadLink)+AI_Distance;} ZCLink& GetTailLink(TypeSize AI_Distance){return (*mp_TailLink)-AI_Distance;} diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 470c964..a1c14cd 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -1298,9 +1298,10 @@ namespace ZNsMain { /*/////////////////////////////////////////////////////////// - ■ AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. - AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. - AP_CutHead 의 앞과 AP_CutTail 의 뒤에서 연결 상태를 끊고, + ■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. + AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. + + AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고, rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16 @@ -1580,7 +1581,7 @@ namespace ZNsMain ZCLink& AR_CutTail, TypeSize AI_CutSize, ZtCLinkList& rhs , - ZCDataOpt AO_ObjOpt + ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { @@ -1588,8 +1589,7 @@ namespace ZNsMain return CutLinkRangeOut ( - AR_CutHead, AR_CutTail, AI_CutSize, rhs, - ( bool(AO_ObjOpt) ? &AO_ObjOpt.value() : 0 ) + AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw() ); ////////////////////// }/* @@ -1599,7 +1599,7 @@ namespace ZNsMain ZCLink& AR_CutTail, TypeSize AI_CutSize, ZtCLinkList& rhs , - ZCDataOpt AO_ObjOpt + ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index 6465f56..fcc842c 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -1097,13 +1097,12 @@ namespace ZNsMain public : - void JoinAfter - (ZtCObjList& rhs, ZCLink* AP_LinkStd) + void JoinAfter(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt) { if(this == &rhs ) return; if(rhs.ml_LinkSize<1) return; - if(AP_LinkStd==0) // 맨 앞에 삽입 + if(!bool(AO_StdOpt)) // 맨 앞에 삽입 { if(ml_LinkSize==0) { @@ -1115,38 +1114,37 @@ namespace ZNsMain ZCLink* VP_TailLink = rhs.mp_HeadLink->mp_PrevLink; ZCLink::MakeRing(rhs.mp_HeadLink, mp_HeadLink->mp_PrevLink); - ZCLink::JoinLink(VP_TailLink , mp_HeadLink ); + ZCLink::JoinLink( VP_TailLink, mp_HeadLink ); mp_HeadLink = rhs.mp_HeadLink ; ml_LinkSize += rhs.ml_LinkSize ; }/* else*/ } - else // AP_LinkStd!=0 + else // bool(AO_StdOpt) { - ZCLink* VP_RhsTail=rhs.mp_HeadLink->mp_PrevLink; + ZCLink* VP_RhsTail= rhs.mp_HeadLink->mp_PrevLink ; + ZCLink* VP_LinkStd= &AO_StdOpt.value() ; + ZCLink* VP_StdNext= VP_LinkStd->mp_NextLink ; - ZCLink::JoinLink(VP_RhsTail, AP_LinkStd->mp_NextLink); - ZCLink::JoinLink(AP_LinkStd, rhs.mp_HeadLink); + ZCLink::JoinLink(VP_LinkStd, rhs.mp_HeadLink); + ZCLink::JoinLink(VP_RhsTail, VP_StdNext ); ml_LinkSize += rhs.ml_LinkSize ; }/* - else // AP_LinkStd!=0*/ + else // bool(AO_StdOpt)*/ rhs.mp_HeadLink = 0; rhs.ml_LinkSize = 0; }/* - void JoinAfter - (ZtCObjList& rhs, ZCLink* AP_LinkStd)*/ + void JoinAfter (ZtCObjList& rhs, ZCLinkOpt AO_StdOpt)*/ - - void JoinBefore - (ZtCObjList& rhs, ZCLink* AP_LinkStd) + void JoinBefore(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt) { if(this == &rhs ) return; if(rhs.ml_LinkSize<1) return; - if(AP_LinkStd==0) // 맨 뒤에 삽입 + if(!bool(AO_StdOpt)) // 맨 뒤에 삽입 { if(ml_LinkSize==0) { @@ -1165,24 +1163,24 @@ namespace ZNsMain }/* else*/ } - else // AP_LinkStd!=0 + else // bool(AO_StdOpt) { - ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink; ZCLink* VP_RhsHead = rhs.mp_HeadLink ; - ZCLink* VP_PrevStd = AP_LinkStd ->mp_PrevLink; + 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, AP_LinkStd); + ZCLink::JoinLink(VP_RhsTail, VP_LinkStd); ml_LinkSize += rhs.ml_LinkSize ; }/* - else // AP_LinkStd!=0*/ + else // bool(AO_StdOpt)*/ rhs.mp_HeadLink = 0; rhs.ml_LinkSize = 0; }/* - void JoinBefore - (ZtCObjList& rhs, ZCLink* AP_LinkStd)*/ + void JoinBefore(ZtCObjList& rhs, ZCLinkOpt AO_StdOpt)*/ /*public :*/ @@ -1289,6 +1287,88 @@ namespace ZNsMain ###############################################################################*/ + ZtCObjList& CutLinkRangeOut /*################################################*/ + ( + ZCLink* AP_CutHead , + ZCLink* AP_CutTail , + TypeSize AL_CutSize , + ZtCObjList& rhs , + ZCLink* AP_RhsStd + ) + /*#############################################################################*/ + { + // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 + // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 + // 이 범위의 링크를 AP_RhsStd 뒤에 붙인다. + // AP_RhsStd 이 0 이면, rhs 의 앞에 붙인다. + + if(this==&rhs ) return *this; + if(ml_LinkSize<1) return 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) // 잘라내려는 링크가 끝 링크를 포함할 때. + { + ZCLink::MakeRing(mp_HeadLink, AP_CutHead->mp_PrevLink); + } + else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. + { + ZCLink::JoinLink(AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink); + }/* + else*/ + + + ml_LinkSize -= AL_CutSize; + + + if(rhs.size()<1) + { + // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. + + ZCLink::MakeRing(AP_CutHead, AP_CutTail); + + rhs.mp_HeadLink = AP_CutHead ; + } + else if(AP_RhsStd==0) // 맨 앞에 삽입. + { + ZCLink* VP_RhsTail = rhs.mp_HeadLink->mp_PrevLink; + + ZCLink::JoinLink(AP_CutTail, rhs.mp_HeadLink); + ZCLink::MakeRing(AP_CutHead, VP_RhsTail ); + + rhs.mp_HeadLink = AP_CutHead; + } + else // AP_RhsStd 의 뒤에 삽입. + { + ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ; + + ZCLink::JoinLink(AP_RhsStd , AP_CutHead ); + ZCLink::JoinLink(AP_CutTail, VP_RhsStdNext); + }/* + else*/ + + rhs.ml_LinkSize += AL_CutSize; return rhs; + }/* + ZtCObjList& CutLinkRangeOut #################################################### + ( + ZCLink* AP_CutHead , + ZCLink* AP_CutTail , + TypeSize AL_CutSize , + ZtCObjList& rhs , + ZCLink* AP_RhsStd + ) + ###############################################################################*/ + + ZtCObjList& CopyLink /*########################################################*/ ( const ZCLink* AP_CopyLink , @@ -1297,29 +1377,24 @@ namespace ZNsMain ) const /*#############################################################################*/ { - // AP_CopyLink 부터 AP_CopyLink->GetNextPrevPtr(AL_FarNum) 링크까지를 복사한다. - // AL_FarNum 은 0 이거나 음수일 수 있다. - // 총 (FarNum의 절대값) + 1 개의 링크가 만들어 진다. + /*///////////////////////////////////////////////////////// - #ifdef _DEBUG + ■ AP_CopyLink 부터 AP_CopyLink->GetNextPrevPtr(AL_FarNum) + 링크까지를 복사한다. + + AL_FarNum 은 0 이거나 음수일 수 있다. + 총 (FarNum의 절대값) + 1 개의 링크가 만들어진다. + + ARR_StoreList 은 비어 있어야 한다. -- 2025-10-06 13:01 + + /////////////////////////////////////////////////////////*/ if(ARR_StoreList.IsEmpty()!=true) { - std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); - fileout<ml_LinkSize) - { - std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); - fileout<ml_LinkSize)*/ - - #endif //_DEBUG - return GetLinkPtr(AL_Index)->GetData(); }/* Type& operator[](TypeSize AL_Index)*/ const Type& operator[](TypeSize AL_Index) const { - #ifdef _DEBUG - - if(AL_Index<1 || AL_Index>ml_LinkSize) - { - std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); - fileout<ml_LinkSize)*/ - - #endif //_DEBUG - return GetLinkPtr(AL_Index)->GetData(); }/* Type& operator[](TypeSize AL_Index) const*/ @@ -1644,7 +1687,7 @@ namespace ZNsMain TypeSize Find /*##############################################################*/ ( - const ZCLink* AP_SearchLink , + const ZCLink& AR_SearchLink , TypeSize AL_FirstFindIndex =1, bool AB_DoFindFromFront=true ) const @@ -1662,8 +1705,8 @@ namespace ZNsMain { do /**/ { - if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; - if(VL_FindIndex==ml_LinkSize ) return 0 ; + if(VP_TempLink ==&AR_SearchLink) return VL_FindIndex; + if(VL_FindIndex==ml_LinkSize ) return 0 ; VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; } @@ -1673,8 +1716,8 @@ namespace ZNsMain { do /**/ { - if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; - if(VL_FindIndex==1 ) return 0 ; + if(VP_TempLink ==&AR_SearchLink) return VL_FindIndex; + if(VL_FindIndex==1 ) return 0 ; VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; } @@ -1686,7 +1729,7 @@ namespace ZNsMain }/* TypeSize Find ################################################################## ( - ZCLink* AP_SearchLink , + ZCLink& AR_SearchLink , TypeSize AL_FirstFindIndex =1 , bool AB_DoFindFromFront=true ) const @@ -1777,40 +1820,24 @@ namespace ZNsMain ZtCObjList& DeleteHeap()*/ - ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink) + ZtCObjList& DeleteLink(ZCLink& AR_DeleteLink) { - #ifdef _DEBUG - - if(Find(AP_DeleteLink)<1) - { - std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); - fileout<CutLink(AP_DeleteLink) ); + ( this->CutLink(&AR_DeleteLink) ); #else - delete this->CutLink(AP_DeleteLink); + delete this->CutLink(&AR_DeleteLink); #endif return *this; }/* - ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink)*/ + ZtCObjList& DeleteLink(ZCLink& AR_DeleteLink)*/ - ZtCObjList& Delete(ZCLink* AP_DeleteLink) + ZtCObjList& Delete(ZCLink& AR_DeleteLink) { - return DeleteLink(AP_DeleteLink); + return DeleteLink(&AR_DeleteLink); }/* - ZtCObjList& Delete(ZCLink* AP_DeleteLink)*/ + ZtCObjList& Delete(ZCLink& AR_DeleteLink)*/ ZtCObjList& Delete(TypeSize AL_DeletePos) { @@ -1855,9 +1882,8 @@ namespace ZNsMain }/* if(AL_DelSize==ml_LinkSize)*/ - ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink; - ZCLink* VP_NewHead = mp_HeadLink-> - GetNextPtr( AL_DelSize ); + ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink ; + ZCLink* VP_NewHead = &((*mp_HeadLink)+AL_DelSize); GetCFreeHeap().RecvFreeIn (AL_DelSize, mp_HeadLink, VP_NewHead->mp_PrevLink); @@ -1901,9 +1927,8 @@ namespace ZNsMain }/* if(AL_DelSize==ml_LinkSize)*/ - ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink; - ZCLink* VP_NewTail = VP_TailLink-> - GetPrevPtr( AL_DelSize ) ; + ZCLink* VP_TailLink= mp_HeadLink->mp_PrevLink ; + ZCLink* VP_NewTail = &((*VP_TailLink)-AL_DelSize); GetCFreeHeap().RecvFreeIn (AL_DelSize, VP_NewTail->mp_NextLink, VP_TailLink); @@ -1914,28 +1939,23 @@ namespace ZNsMain void DeleteTail(TypeSize AL_DelSize)*/ - ZCLink* AddDefault(TypeSize AL_DefaultSize, TypeSize AL_AddPos) + ZCLink& AddDefault(TypeSize AL_DefSize, TypeSize AL_AddPos) { - const bool CB_IsTrue = /////////////////// - ( - AL_DefaultSize< 1 || - AL_AddPos < 1 || - AL_AddPos > ml_LinkSize+1 - ); - if(CB_IsTrue) return 0; ////////////////// + if(AL_DefSize<1) AL_DefSize= 1; + if(AL_AddPos <1) AL_AddPos = 1; ZtCObjList VO_StoreList; MakeDefault - ( AL_DefaultSize, RR(VO_StoreList) ) ; + ( AL_DefSize, RR(VO_StoreList) ) ; ZCLink* VP_HeadLink= VO_StoreList.mp_HeadLink; if(AL_AddPos==1) - JoinAfter(VO_StoreList, 0 ); - else JoinAfter(VO_StoreList, GetLinkPtr(AL_AddPos-1)); + JoinAfter(VO_StoreList, ZCLinkOpt(0) ); + else JoinAfter(VO_StoreList, GetLinkOpt(AL_AddPos-1)); - return VP_HeadLink; + return *VP_HeadLink; }/* - ZCLink* AddDefault(TypeSize AL_DefaultSize, TypeSize AL_AddPos)*/ + ZCLink& AddDefault(TypeSize AL_DefSize, TypeSize AL_AddPos)*/ ZtCObjList& AddHead(TypeArg AR_Type) @@ -2014,23 +2034,23 @@ namespace ZNsMain ///////////////////////////////////////////////////////////////////*/ - ZCLink* AddHeadDef() + ZCLink& AddHeadDef() { #if(_CODE_NEW_) ZCLink* VP_NewLink = mo_FreeObjt.SendFreeOut(); #else ZCLink* VP_NewLink = new ZCLink ; #endif - JoinAfter(VP_NewLink, 0); return VP_NewLink; + JoinAfter(VP_NewLink, 0); return *VP_NewLink; } - ZCLink* AddTailDef() + ZCLink& AddTailDef() { #if(_CODE_NEW_) ZCLink* VP_NewLink = mo_FreeObjt.SendFreeOut(); #else ZCLink* VP_NewLink = new ZCLink ; #endif - JoinAfter(VP_NewLink, GetTailLinkPtr()); return VP_NewLink; + JoinAfter(VP_NewLink, GetTailLinkPtr()); return *VP_NewLink; } @@ -2044,18 +2064,18 @@ namespace ZNsMain }/* ZtCObjList& JoinHead(ZtCObjList& rhs)*/ - ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink) + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink& AR_CLink) { // rhs 의 AP_CLink 를 앞으로 연결한다. if(this==&rhs) return *this; JoinAfter - (rhs.CutLink(AP_CLink), 0); + (rhs.CutLink(&AR_CLink), 0); return *this; }/* - ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink& AR_CLink)*/ ZtCObjList& JoinTail(ZtCObjList& rhs) { @@ -2063,121 +2083,43 @@ namespace ZNsMain }/* ZtCObjList& JoinTail(ZtCObjList& rhs)*/ - ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink) + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink& AR_CLink) { - // rhs 의 AP_CLink 를 뒤로 연결한다. + // rhs 의 AR_CLink 를 뒤로 연결한다. if(this==&rhs) return *this; - JoinAfter ///////////////////////////////////// + JoinAfter ////////////////////////////////////// ( - rhs.CutLink(AP_CLink), GetTailLinkPtr() + rhs.CutLink(&AR_CLink), GetTailLinkPtr() ); - return *this; ///////////////////////////////// + return *this; ////////////////////////////////// }/* - ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink& AR_CLink)*/ ZtCObjList& JoinAfter /*######################################################*/ ( ZtCObjList& rhs , - ZCLink* AP_LinkOfRhs, - ZCLink* AP_LinkStd + ZCLink& AR_LinkOfRhs, + ZCLinkOpt AO_StdOpt ) /*#############################################################################*/ { - // rhs 의 AP_LinkOfRhs 링크를 잘라서 AP_LinkStd 앞에 붙인다. + // rhs 의 AP_LinkOfRhs 링크를 잘라서 AO_StdOpt 뒤에 붙인다. if(this==&rhs) return *this; JoinAfter( - rhs.CutLink(AP_LinkOfRhs), AP_LinkStd); + rhs.CutLink(&AR_LinkOfRhs), AO_StdOpt.Raw() ); return *this; }/* ZtCObjList& JoinAfter ########################################################## ( ZtCObjList& rhs , - ZCLink* AP_LinkOfRhs, - ZCLink* AP_LinkStd - ) - ###############################################################################*/ - - - ZtCObjList& CutLinkOut /*#####################################################*/ - ( - ZCLink* AP_CutHead , - ZCLink* AP_CutTail , - TypeSize AL_CutSize , - ZtCObjList& ARR_StoreList - ) - /*#############################################################################*/ - { - // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 - // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 - - if(this==&ARR_StoreList) return *this ; - - if(ml_LinkSize<1) return ARR_StoreList; - - 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) // 잘라내려는 링크가 끝 링크를 포함할 때. - { - ZCLink::MakeRing(mp_HeadLink, AP_CutHead->mp_PrevLink); - } - else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. - { - ZCLink::JoinLink(AP_CutHead->mp_PrevLink, AP_CutTail->mp_NextLink); - }/* - else*/ - - - ml_LinkSize -= AL_CutSize; - - /* 여기까지는 - - CutLink(ZCLink*, ZCLink*, TypeSize, ZtCObjList&) - - 와 같다. 이후에 CutLink() 에서는 ARR_StoreList 가 비어 있는 것으로 - 간주하지만, CutLinkOut() 는 ARR_StoreList 이 비어 있지 않은 경우에 - 도 대비한다. - */ - if(ARR_StoreList.ml_LinkSize<1) - { - // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. - - ZCLink::MakeRing(AP_CutHead, AP_CutTail); - - ARR_StoreList.mp_HeadLink = AP_CutHead ; - ARR_StoreList.ml_LinkSize = AL_CutSize ; - } - else - { - ZCLink::JoinLink(ARR_StoreList.mp_HeadLink->mp_PrevLink, AP_CutHead); - ZCLink::MakeRing(ARR_StoreList.mp_HeadLink , AP_CutTail); - - ARR_StoreList.ml_LinkSize += AL_CutSize ; - }/* - else*/ - - return ARR_StoreList; - }/* - ZtCObjList& CutLinkOut ######################################################### - ( - ZCLink* AP_CutHead , - ZCLink* AP_CutTail , - TypeSize AL_CutSize , - ZtCObjList& ARR_StoreList + ZCLink& AR_LinkOfRhs, + ZCLinkOpt AO_StdOpt ) ###############################################################################*/ @@ -2206,6 +2148,35 @@ namespace ZNsMain { CutLink(&AR_CutLink); rhs.JoinBefore(&AR_CutLink, 0); } + ZtCObjList& SendRangeOutAfter /////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCObjList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + { + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AO_ObjOpt 뒤에 연결한다. + + return CutLinkRangeOut + ( + &AR_CutHead, &AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw() + ); + ////////////////////// + }/* + ZtCObjList& SendRangeOutAfter ////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZtCObjList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + + operator Type&() { return AddDefault(1, ml_LinkSize+1)->GetData(); diff --git a/ZCppMainTest/ZtCBaseList_000.cpp b/ZCppMainTest/ZtCBaseList_000.cpp index 9033c0d..9400cc7 100644 --- a/ZCppMainTest/ZtCBaseList_000.cpp +++ b/ZCppMainTest/ZtCBaseList_000.cpp @@ -300,47 +300,64 @@ namespace ZNsMain typedef typename ZCBaseListEx11::ZCLink ZCLink11; - static void ShowDataInNode(const CStringBase& AR_Data) + static void ShowDataInNode(const CStringBase& AR_Data, ZTypLong& ARRI_CallCnt) { - cout<<"* Data : "< ZCLinkCStr ; typedef ZtCLinkList ZCLinkStrList; - typedef ZCLinkStrList::ZCObjOpt ZCStrLinkOpt ; + typedef ZCLinkStrList::ZCLinkOpt ZCStrLinkOpt ; public: diff --git a/ZCppMainTest/ZtCObjList_000.cpp b/ZCppMainTest/ZtCObjList_000.cpp index d7b91d0..67a470d 100644 --- a/ZCppMainTest/ZtCObjList_000.cpp +++ b/ZCppMainTest/ZtCObjList_000.cpp @@ -318,6 +318,21 @@ namespace ZNsMain VO_ListOfStr11.IterElemLink(&ShowNode1_3, ZftMCP(VI_CallCnt=0)); + VO_ListOfStr11.SendRangeOutAfter + ( + *VO_ListOfStr11.GetLinkPtr(2) + ,*VO_ListOfStr11.GetLinkPtr(3) + , 2 + , RR(VO_ListOfStr10) + , VO_ListOfStr10.GetLinkOpt(2) + ); + cout<<"# list11's 2th ~ 3th link to list10's 2th link after"<