diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index bcbfbfb..1c81c38 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -7939,7 +7939,8 @@ namespace ZNsMain { // AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결. - ZCLinkFake VO_FakeHead; ZCLinkFake VO_FakeTail; + ZCLinkFake VO_FakeHead ; + ZCLinkFake VO_FakeTail ; ZCLink* VP_FakeHead = reinterpret_cast(&VO_FakeHead ) ; @@ -8043,12 +8044,12 @@ namespace ZNsMain { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); } - ZtCBaseList& MoveRangeIn /*////////////////////////////////////////*/ + ZtCBaseList& MoveRangeIn /*////////////////////////////////////////////*/ ( ZCLink& AR_MoveHead , ZCLink& AR_MoveTail , ZCLink& AR_StdLink , bool AB_After ) - /*#################################################################*/ + /*#####################################################################*/ { // AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다. // AR_MoveHead 이 AR_MoveTail 위에 와서는 안 된다. @@ -8067,7 +8068,8 @@ namespace ZNsMain { // AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결. - ZCLinkFake VO_FakeHead; ZCLinkFake VO_FakeTail; + ZCLinkFake VO_FakeHead ; + ZCLinkFake VO_FakeTail ; ZCLink* VP_FakeHead = reinterpret_cast(&VO_FakeHead ) ; @@ -8141,12 +8143,12 @@ namespace ZNsMain } return *this; /*::::::::::::::::::::::::::::::::*/ }/* - ZtCBaseList& MoveRangeIn //////////////////////////////////////////// + ZtCBaseList& MoveRangeIn //////////////////////////////////////////////// ( ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, ZCLink& AR_StdLink , bool AB_After ) - ###################################################################*/ + #######################################################################*/ void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 앞에 연결한다. diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 9408529..7b97e4c 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -2576,45 +2576,225 @@ namespace ZNsMain TypeThis& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/ + TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After) + { + if(size()<=1 || &AR_MoveLink==&AR_StdLink){return *this;} + + const bool CB_NeedFakeLink = //////////////////////////////////// + ( + &AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink || + &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink + ) ; + if(CB_NeedFakeLink) ///////////////////////////////////////////// + { + // AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결. + + ZCLink VO_FakeHead ; + ZCLink VO_FakeTail ; + + ZCLink* VP_FakeHead = &VO_FakeHead ; + ZCLink* VP_FakeTail = &VO_FakeTail ; + + ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; + ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; + + ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink; + ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink; + + ZCLink::JoinLink(VP_MovePrev, VP_MoveNext); + /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + AR_MoveLink 떼어 내기 완료. + :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; + ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; + + if(AB_After) + { + ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink); + ZCLink::JoinLink(&AR_MoveLink, VP_StdNext ); + } + else + { + ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink); + ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink ); + } + mp_HeadLink = VP_FakeHead->mp_NextLink; + mp_TailLink = VP_FakeTail->mp_PrevLink; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + + return *this; /***************************/ + }/* + const bool CB_NeedFakeLink = //////////////////////////////////// + ( + &AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink || + &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink + ) ; + if(CB_NeedFakeLink) ///////////////////////////////////////////*/ + + + if( AB_After && AR_MoveLink.mp_PrevLink==&AR_StdLink) + { return *this; } + if(!AB_After && AR_MoveLink.mp_NextLink==&AR_StdLink) + { return *this; } + /*:::::::::::::::::::::::::::::::::::::::::::::::::*/ + + + ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink; + ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink; + + ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ; + + ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; + ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; + + if(AB_After) + { + ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink); + ZCLink::JoinLink(&AR_MoveLink, VP_StdNext ); + } + else + { + ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink); + ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink ); + } + return *this; /*::::::::::::::::::::::::::::::::*/ + }/* + TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)*/ + + + TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After) + { + ZCLink* VP_LinkStd = AO_StdOpt.Raw(); + + if(VP_LinkStd==0) + { + if(AB_After) + { VP_LinkStd = mp_HeadLink; AB_After=false; } + else{ VP_LinkStd = mp_TailLink; AB_After=true ; } + }/* + if(VP_LinkStd==0)*/ + + return MoveLinkIn(AR_MoveLink, *VP_LinkStd, AB_After); + }/* + TypeThis& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)*/ + + TypeThis& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) - { - if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;} - - if(size()<=1){return *this;} AddLinkAfter - ( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ; - - return *this; /**************************/ - }/* - TypeThis& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/ + { return MoveLinkIn(AR_MoveLink, AO_StdOpt, true ); } TypeThis& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) + { return MoveLinkIn(AR_MoveLink, AO_StdOpt, false); } + + TypeThis& MoveLinkHead(ZCLink& AR_MoveLink) + { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), true ); } + TypeThis& MoveLinkTail(ZCLink& AR_MoveLink) + { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); } + + + TypeThis& MoveRangeIn /*///////////////////////////////////////////////*/ + ( + ZCLink& AR_MoveHead , ZCLink& AR_MoveTail , + ZCLink& AR_StdLink , bool AB_After + ) + /*#####################################################################*/ { - if(&AR_MoveLink==AO_StdOpt.Raw()){return *this;} + // AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다. + // AR_MoveHead 이 AR_MoveTail 위에 와서는 안 된다. - if(size()<=1){return *this;} AddLinkBefore - ( AO_StdOpt.Raw(), CutLink(&AR_MoveLink) ) ; + if(size() <= 1 ){return *this;} + if(&AR_MoveHead == &AR_StdLink){return *this;} + if(&AR_MoveTail == &AR_StdLink){return *this;} - return *this; /**************************/ + const bool CB_NeedFakeLink = //////////////////////////////////// + ( + &AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink || + &AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink || + &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink + ) ; + if(CB_NeedFakeLink) ///////////////////////////////////////////// + { + // AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결. + + ZCLink VO_FakeHead ; + ZCLink VO_FakeTail ; + + ZCLink* VP_FakeHead = &VO_FakeHead ; + ZCLink* VP_FakeTail = &VO_FakeTail ; + + ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; + ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; + + ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink; + ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink; + + ZCLink::JoinLink(VP_MovePrev, VP_MoveNext); + /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + AR_MoveHead~AR_MoveTail 떼어 내기 완료. + :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; + ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; + + if(AB_After) + { + ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead); + ZCLink::JoinLink(&AR_MoveTail, VP_StdNext ); + } + else + { + ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead); + ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink ); + } + mp_HeadLink = VP_FakeHead->mp_NextLink; + mp_TailLink = VP_FakeTail->mp_PrevLink; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + + return *this; /***************************/ + }/* + const bool CB_NeedFakeLink = //////////////////////////////////// + ( + &AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink || + &AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink || + &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink + ) ; + if(CB_NeedFakeLink) ///////////////////////////////////////////*/ + + + if( AB_After && AR_MoveHead.mp_PrevLink==&AR_StdLink) + { return *this; } + if(!AB_After && AR_MoveTail.mp_NextLink==&AR_StdLink) + { return *this; } + /*:::::::::::::::::::::::::::::::::::::::::::::::::*/ + + + ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink; + ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink; + + ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ; + + ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; + ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; + + if(AB_After) + { + ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead); + ZCLink::JoinLink(&AR_MoveTail, VP_StdNext ); + } + else + { + ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead); + ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink ); + } + return *this; /*::::::::::::::::::::::::::::::::*/ }/* - TypeThis& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt)*/ - - TypeThis& MoveLinkHead(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/ - { - if(&AR_MoveLink==mp_HeadLink){return *this;} - - if(size()<=1){return *this;} AddLinkAfter - ( 0, CutLink(&AR_MoveLink) ) ; - return *this; /**************************/ - }/* - TypeThis& MoveLinkHead(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/ - TypeThis& MoveLinkTail(ZCLink& AR_MoveLink) /*::::::::::::::::::::*/ - { - if(&AR_MoveLink==mp_TailLink){return *this;} - - if(size()<=1){return *this;} AddLinkBefore - ( 0, CutLink(&AR_MoveLink) ) ; - return *this; /**************************/ - }/* - TypeThis& MoveLinkTail(ZCLink& AR_MoveLink) ::::::::::::::::::::::*/ + TypeThis& MoveRangeIn /////////////////////////////////////////////////// + ( + ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, + ZCLink& AR_StdLink , bool AB_After + ) + #######################################################################*/ TypeThis& SendRangeIn /////////////////////////////////////////////////// diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index be9e3e2..f481470 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -2223,6 +2223,11 @@ namespace ZNsMain }/* void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ + 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& SwapLinkNext(ZCLink& AR_LinkPrev) { @@ -2415,10 +2420,13 @@ namespace ZNsMain { // AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결. - ZCLinkFake VO_FakeHead; ZCLinkFake VO_FakeTail; + ZCLinkFake VO_FakeHead ; + ZCLinkFake VO_FakeTail ; - ZCLink* VP_FakeHead=reinterpret_cast(&VO_FakeHead); - ZCLink* VP_FakeTail=reinterpret_cast(&VO_FakeTail); + ZCLink* VP_FakeHead = + reinterpret_cast( &VO_FakeHead) ; + ZCLink* VP_FakeTail = + reinterpret_cast( &VO_FakeTail) ; ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; @@ -2517,18 +2525,12 @@ namespace ZNsMain { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); } - 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& MoveRangeIn /*/////////////////////////////////////////*/ + ZtCObjList& MoveRangeIn /*/////////////////////////////////////////////*/ ( ZCLink& AR_MoveHead , ZCLink& AR_MoveTail , ZCLink& AR_StdLink , bool AB_After ) - /*#################################################################*/ + /*#####################################################################*/ { // AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다. // AR_MoveHead 이 AR_MoveTail 위에 와서는 안 된다. @@ -2547,10 +2549,13 @@ namespace ZNsMain { // AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결. - ZCLinkFake VO_FakeHead; ZCLinkFake VO_FakeTail; + ZCLinkFake VO_FakeHead ; + ZCLinkFake VO_FakeTail ; - ZCLink* VP_FakeHead=reinterpret_cast(&VO_FakeHead); - ZCLink* VP_FakeTail=reinterpret_cast(&VO_FakeTail); + ZCLink* VP_FakeHead = + reinterpret_cast( &VO_FakeHead) ; + ZCLink* VP_FakeTail = + reinterpret_cast( &VO_FakeTail) ; ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; @@ -2619,12 +2624,12 @@ namespace ZNsMain } return *this; /*::::::::::::::::::::::::::::::::*/ }/* - ZtCObjList& MoveRangeIn ///////////////////////////////////////////// + ZtCObjList& MoveRangeIn ///////////////////////////////////////////////// ( ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, ZCLink& AR_StdLink , bool AB_After ) - ###################################################################*/ + #######################################################################*/ diff --git a/ZCppMainTest/ZtCLinkList_001.cpp b/ZCppMainTest/ZtCLinkList_001.cpp index a992464..8305bdb 100644 --- a/ZCppMainTest/ZtCLinkList_001.cpp +++ b/ZCppMainTest/ZtCLinkList_001.cpp @@ -110,28 +110,28 @@ namespace ZNsMain static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0) { - ZTypLong VI_CallCnt = 0 ; - ZCLinkDataList VO_CDataLis1; - ZCLinkDataList VO_CDataLis2; - ZCLinkStrList VO_CStrLis20; - ZCStrLinkOpt VO_StrLinkOpt = VO_CDataLis1.GetObjOpt(1); + ZTypLong VI_CallCnt =0 ; + ZCLinkDataList VO_CDataList1; + ZCLinkDataList VO_CDataList2; + ZCLinkStrList VO_CStrLis20 ; + ZCStrLinkOpt VO_StrLinkOpt = VO_CDataList1.GetObjOpt(1); cout<<"# VO_StrLinkOpt.has_value()="<