From b714f5579c76fa6baf06842c48ddeebcba0a9c82 Mon Sep 17 00:00:00 2001 From: sauron Date: Mon, 6 Oct 2025 08:36:21 +0900 Subject: [PATCH] commit 2025-10-06 08:36 add GetNextPrevPtr() in ZtCLink : ZCppMain/ZtCLinkList.H --- ZCppMain/ZtCLinkList.H | 233 +++++++++++++++++++++++++++++++++++++-- ZCppMain/ZtCObjList.H | 10 +- ZCppMainTest/ZtCBaseList_000.cpp | 1 + ZCppMainTest/ZtCLinkList_000.cpp | 47 ++++++-- 4 files changed, 269 insertions(+), 22 deletions(-) diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index 87428ec..42ab741 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -108,7 +108,8 @@ namespace ZNsMain ZtCLink& operator=(TypeBase& AR_CBase)*/ - TypeBase& operator()(){ return *static_cast(this); } + /***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); } + const TypeBase& operator()() const{ return *static_cast(this); } ZtCLink* GetNextPtr(){return mp_NextLink;} @@ -168,6 +169,31 @@ namespace ZNsMain const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/ + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) + { + ZtCLink* VP_TmpLink=this; + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/ + + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const + { + ZtCLink* VP_TmpLink=const_cast(this); + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/ + + ZtCLink& operator+(TypeSize AL_Distance) { if(AL_Distance>=0) @@ -281,7 +307,8 @@ namespace ZNsMain TypeThis& operator=(TypeBase& AR_CBase)*/ - TypeBase& operator()(){ return *static_cast(this); } + /***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); } + const TypeBase& operator()() const{ return *static_cast(this); } ZtCLink* GetNextPtr(){return mp_NextLink;} @@ -341,6 +368,31 @@ namespace ZNsMain const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/ + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) + { + ZtCLink* VP_TmpLink=this; + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/ + + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const + { + ZtCLink* VP_TmpLink=const_cast(this); + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/ + + ZtCLink& operator+(TypeSize AL_Distance) { if(AL_Distance>=0) @@ -439,8 +491,8 @@ namespace ZNsMain TypeThis& operator=(const TypeThis& rhs)*/ - TypeThis& operator()(){ return *this; } - + /***/ TypeThis& operator()() { return *this; } + const TypeThis& operator()() const{ return *this; } ZtCLink* GetNextPtr(){return mp_NextLink;} ZtCLink* GetPrevPtr(){return mp_PrevLink;} @@ -499,6 +551,31 @@ namespace ZNsMain const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/ + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) + { + ZtCLink* VP_TmpLink=this; + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/ + + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const + { + ZtCLink* VP_TmpLink=const_cast(this); + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/ + + ZtCLink& operator+(TypeSize AL_Distance) { if(AL_Distance>=0) @@ -653,6 +730,31 @@ namespace ZNsMain const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/ + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) + { + ZtCLink* VP_TmpLink=this; + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + ZtCLink* GetNextPrevPtr(TypeSize AL_Distance)*/ + + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const + { + ZtCLink* VP_TmpLink=const_cast(this); + + if(AL_Distance>=0) + { while(--AL_Distance>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } + else{ while(++AL_Distance<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; } + + return VP_TmpLink; + }/* + const ZtCLink* GetNextPrevPtr(TypeSize AL_Distance) const*/ + + ZtCLink& operator+(TypeSize AL_Distance) { if(AL_Distance>=0) @@ -1036,6 +1138,110 @@ namespace ZNsMain ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ + ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink) + { + // AP_StdLink 의 뒤에 rhs 를 삽입. + + if(this==&rhs ) return *this; + if(rhs.size()<1) return *this; + + if(AP_StdLink==0) // 맨 앞에 삽입 + { + if(ml_LinkSize<1) + { + mp_HeadLink = rhs.mp_HeadLink ; + mp_TailLink = rhs.mp_TailLink ; + ml_LinkSize = rhs.ml_LinkSize ; + } + else // ml_LinkSize>=1 + { + ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink ); + ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink ); + + mp_HeadLink = rhs.mp_HeadLink ; + ml_LinkSize = rhs.ml_LinkSize ; + }/* + else // ml_LinkSize>=1*/ + + ml_LinkSize += rhs.ml_LinkSize; + + rhs.mp_HeadLink = 0 ; + rhs.mp_TailLink = 0 ; + rhs.ml_LinkSize = 0 ; + + return *this; + }/* + if(AP_StdLink==0)*/ + + + ZCLink* VP_StdNext=AP_StdLink->mp_NextLink; + + ZCLink::JoinLink(AP_StdLink , rhs.mp_HeadLink ); + ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext ); + + if(AP_StdLink==mp_TailLink) + { mp_TailLink=rhs.mp_TailLink; } + + rhs.mp_HeadLink =0 ; + rhs.mp_TailLink =0 ; + rhs.ml_LinkSize =0 ; + + ml_LinkSize += rhs.ml_LinkSize; return *this; + }/* + ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/ + + + ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink) + { + // AP_StdLink 의 앞에 rhs 를 삽입. + + if(this==&rhs ) return *this; + if(rhs.size()<1) return *this; + + if(AP_StdLink==0) // 맨 뒤에 삽입 + { + if(ml_LinkSize<1) + { + mp_HeadLink = rhs.mp_HeadLink ; + mp_TailLink = rhs.mp_TailLink ; + ml_LinkSize = rhs.ml_LinkSize ; + } + else // ml_LinkSize>=1 + { + ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink ); + ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink ); + + mp_TailLink = rhs.mp_TailLink ; + ml_LinkSize += rhs.ml_LinkSize ; + }/* + else // ml_LinkSize>=1*/ + + rhs.mp_HeadLink=0; + rhs.mp_TailLink=0; + rhs.ml_LinkSize=0; + + ml_LinkSize += rhs.ml_LinkSize; return *this; + }/* + if(AP_StdLink==0)*/ + + + ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink; + + ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink ); + ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink ); + + if(AP_StdLink==mp_HeadLink) + { mp_HeadLink = rhs.mp_HeadLink; } + + rhs.mp_HeadLink =0 ; + rhs.mp_TailLink =0 ; + rhs.ml_LinkSize =0 ; + + ml_LinkSize += rhs.ml_LinkSize; return *this; + }/* + ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink* AP_StdLink)*/ + + ZCLink& CutLink(ZCLink& AR_CutLink) { if(&AR_CutLink==mp_HeadLink) @@ -1084,6 +1290,8 @@ namespace ZNsMain mp_HeadLink=0; mp_TailLink=0; ml_LinkSize=0; + + *this = rhs ; }/* ZtCLinkList(const ZtCLinkList& rhs)*/ @@ -1154,7 +1362,7 @@ namespace ZNsMain __for0(TypeSize, i, rhs.size()) { - **VP_LhsLink = **VP_RhsLink ; + *VP_LhsLink = *VP_RhsLink ; VP_RhsLink = VP_RhsLink->mp_NextLink; VP_LhsLink = VP_LhsLink->mp_NextLink; @@ -1166,8 +1374,10 @@ namespace ZNsMain ZtCLinkList& operator=(const ZtCLinkList& rhs)*/ - TypeSize GetSize(){return ml_LinkSize;} - TypeSize size (){return ml_LinkSize;} + TypeSize GetSize() const{return ml_LinkSize ;} + TypeSize size () const{return ml_LinkSize ;} + + bool IsEmpty() const{return ml_LinkSize<1;} void DeleteAll() @@ -1225,6 +1435,15 @@ namespace ZNsMain void Delete(ZCLink& AR_DelLink)*/ + ZtCLinkList& JoinAfter (ZtCLinkList& rhs, ZCLink& AR_StdLink) + { return JoinAfter (rhs, &AR_StdLink); } + ZtCLinkList& JoinBefore(ZtCLinkList& rhs, ZCLink& AR_StdLink) + { return JoinBefore(rhs, &AR_StdLink); } + + ZtCLinkList& JoinHead(ZtCLinkList& rhs){ return JoinAfter (rhs, 0); } + ZtCLinkList& JoinTail(ZtCLinkList& rhs){ return JoinBefore(rhs, 0); } + + void SendOutAfter (ZCLink& AR_CutLink, ZtCLinkList& rhs, ZCLink& AR_StdLink) { // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index e1fc0ce..6a4f19f 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -1221,9 +1221,8 @@ namespace ZNsMain ) /*#############################################################################*/ { - // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치 - // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치 - // 따라서 AL_CutHeadPos <= AL_CutTailPos + // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 + // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 if(this==&ARR_StoreList) return *this ; @@ -2103,9 +2102,8 @@ namespace ZNsMain ) /*#############################################################################*/ { - // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치 - // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치 - // 따라서 AL_CutHeadPos <= AL_CutTailPos + // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크 + // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크 if(this==&ARR_StoreList) return *this ; diff --git a/ZCppMainTest/ZtCBaseList_000.cpp b/ZCppMainTest/ZtCBaseList_000.cpp index be724dc..9033c0d 100644 --- a/ZCppMainTest/ZtCBaseList_000.cpp +++ b/ZCppMainTest/ZtCBaseList_000.cpp @@ -458,6 +458,7 @@ namespace ZNsMain cout<