From 1cb7045ad819e759d444e52cd2a5901ef4f9e901 Mon Sep 17 00:00:00 2001 From: sauron Date: Sun, 5 Oct 2025 14:36:50 +0900 Subject: [PATCH] commit 2025-10-05 14:36 edit ZCppMain/ZtCLinkList.H --- ZCppMain/ZtCLinkList.H | 396 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 370 insertions(+), 26 deletions(-) diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index a786b42..c486f04 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -1,7 +1,10 @@ + + +// is editing -#ifndef __ZCPPMAIN__ZMAINHEAD_H__ -#define __ZCPPMAIN__ZMAINHEAD_H__ +#ifndef __ZCPPMAIN__ZTCLINKLIST_H__ +#define __ZCPPMAIN__ZTCLINKLIST_H__ #include "ZCppMain/ZMainHead.H" @@ -32,9 +35,6 @@ namespace ZNsMain ZtCLink* mp_PrevLink; protected: - ZtCLink* GetNextLinkPtr(){return mp_NextLink;} - ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;} - void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; @@ -77,6 +77,97 @@ namespace ZNsMain }/* ZtCLink& operator=(const ZtCLink& rhs)*/ + + ZtCLink* GetNextPtr(){return mp_NextLink;} + ZtCLink* GetPrevPtr(){return mp_PrevLink;} + + const ZtCLink* GetNextPtr() const{return mp_NextLink;} + const ZtCLink* GetPrevPtr() const{return mp_PrevLink;} + + + ZtCLink* GetNextPtr(TypeSize AL_Distance) + { + TypeSize VL_LoopIndex=0 ; + ZtCLink* VP_TmpLink =this; + + while(VL_LoopIndex++ < AL_Distance) + VP_TmpLink = VP_TmpLink->mp_NextLink ; + + return VP_TmpLink; + }/* + ZtCLink* GetNextPtr(TypeSize AL_Distance)*/ + + ZtCLink* GetPrevPtr(TypeSize AL_Distance) + { + TypeSize VL_LoopIndex=0 ; + ZtCLink* VP_TmpLink =this; + + while(VL_LoopIndex++ < AL_Distance) + VP_TmpLink = VP_TmpLink->mp_PrevLink ; + + return VP_TmpLink; + }/* + ZtCLink* GetPrevPtr(TypeSize AL_Distance)*/ + + + const ZtCLink* GetNextPtr(TypeSize AL_Distance) const + { + TypeSize VL_LoopIndex=0 ; + ZtCLink* VP_TmpLink =const_cast(this); + + while(VL_LoopIndex++ < AL_Distance) + VP_TmpLink = VP_TmpLink->mp_NextLink ; + + return VP_TmpLink; + }/* + const ZtCLink* GetNextPtr(TypeSize AL_Distance) const*/ + + const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const + { + TypeSize VL_LoopIndex=0 ; + ZtCLink* VP_TmpLink = const_cast(this) ; + + while(VL_LoopIndex++ < AL_Distance) + VP_TmpLink = VP_TmpLink->mp_PrevLink ; + + return VP_TmpLink; + }/* + const ZtCLink* GetPrevPtr(TypeSize AL_Distance) const*/ + + + ZtCLink& operator+(TypeSize AL_Distance) + { + if(AL_Distance>=0) + return *GetNextPtr(AL_Distance); + else return *GetPrevPtr(AL_Distance); + }/* + ZtCLink& operator+(TypeSize AL_Distance)*/ + + ZtCLink& operator-(TypeSize AL_Distance) + { + if(AL_Distance>=0) + return *GetPrevPtr(AL_Distance); + else return *GetNextPtr(AL_Distance); + }/* + ZtCLink& operator-(TypeSize AL_Distance)*/ + + + const ZtCLink& operator+(TypeSize AL_Distance) const + { + if(AL_Distance>=0) + return *GetNextPtr(AL_Distance); + else return *GetPrevPtr(AL_Distance); + }/* + const ZtCLink& operator+(TypeSize AL_Distance) const*/ + + const ZtCLink& operator-(TypeSize AL_Distance) const + { + if(AL_Distance>=0) + return *GetPrevPtr(AL_Distance); + else return *GetNextPtr(AL_Distance); + }/* + const ZtCLink& operator-(TypeSize AL_Distance) const*/ + public : };/* template @@ -100,8 +191,8 @@ namespace ZNsMain ZtCLink* mp_PrevLink; public : - ZtCLink* GetNextLinkPtr(){return mp_NextLink;} - ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;} + ZtCLink* GetNextPtr(){return mp_NextLink;} + ZtCLink* GetPrevPtr(){return mp_PrevLink;} void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { @@ -166,8 +257,8 @@ namespace ZNsMain ZtCLink* mp_PrevLink; protected: - ZtCLink* GetNextLinkPtr(){return mp_NextLink;} - ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;} + ZtCLink* GetNextPtr(){return mp_NextLink;} + ZtCLink* GetPrevPtr(){return mp_PrevLink;} void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { @@ -226,8 +317,8 @@ namespace ZNsMain ZtCLink* mp_PrevLink; protected: - ZtCLink* GetNextLinkPtr(){return mp_NextLink;} - ZtCLink* GetPrevLinkPtr(){return mp_PrevLink;} + ZtCLink* GetNextPtr(){return mp_NextLink;} + ZtCLink* GetPrevPtr(){return mp_PrevLink;} void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { @@ -272,11 +363,26 @@ namespace ZNsMain - template - - class ZtCLinkList + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize = ZTypLong + , typename TTypeCRTP = + ZNsType::ZtCTypeCRTP + > + class ZtCLinkList /*#####################################################*/ { public : + + typedef ZNsType::ZtCTypeNowCRTP /////////////////////////////////////// + < + ZtCLinkList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP + > + ZCTypeNowCRTP ; /////////////////////////////////////////////////////// + + typedef typename ZCTypeNowCRTP::TypeData TypeChild; + + public : typedef TCLink ZCLink ; typedef TCLink TypeData; typedef TTypSize TypeSize; @@ -286,28 +392,266 @@ namespace ZNsMain TypeSize ml_LinkSize; private: + TypeChild& GetChildObj() + { + return *static_cast(this); + }/* + TypeChild& GetChildObj()*/ + + private: + + _VT_ ZCLink* NewLink() + { + if(TTypeCRTP::ZEUseCRTP<1) + { return new ZCLink; } + + return GetChildObj().NewLink(); + }/* + _VT_ ZCLink* NewLink()*/ + + _VT_ void DelLink(ZCLink* AP_DelLink) + { + if(TTypeCRTP::ZEUseCRTP<1) + { return delete ZCLink; } + + return GetChildObj().DelLink(AP_DelLink); + }/* + _VT_ void DelLink(ZCLink* AP_DelLink)*/ + + private: + + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd) + { + // AR_LinkNew 를 AP_LinkStd 뒤에 삽입한다. + // AL_PosStd==0 이면 맨 앞에 삽입한다. + + if(AP_LinkStd==0) + { + // 맨 앞에 삽입. + + if(++ml_LinkSize==1) + { + mp_HeadLink = &AR_LinkNew ; + mp_TailLink = &AR_LinkNew ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + } + else + { + ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink); + ZCLink::MakeRing(&AR_LinkNew, mp_TailLink); + + mp_HeadLink=&AR_LinkNew; + }/* + else*/ + } + else + { + ++ml_LinkSize; + + ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ; + + ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew); + ZCLink::JoinLink(&AR_LinkNew, AP_NextStd ); + }/* + else*/ + + return AR_LinkNew; + }/* + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ + + + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd) + { + // AR_LinkNew 를 AP_LinkStd 앞에 삽입한다. + // AL_PosStd==0 이면 맨 뒤에 삽입한다. + + if(AP_LinkStd==0) + { + // 맨 뒤에 삽입. + + if(++ml_LinkSize==1) + { + mp_HeadLink = &AR_LinkNew ; + mp_TailLink = &AR_LinkNew ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); + } + else + { + ZCLink::JoinLink(mp_TailLink, &AR_LinkNew); + ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew); + + mp_HeadLink=&AR_LinkNew; + }/* + else*/ + } + else + { + ++ml_LinkSize; + + ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ; + + ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew); + ZCLink::JoinLink(&AR_LinkNew, AP_LinkStd); + }/* + else*/ + + return AR_LinkNew; + }/* + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ + + + ZCLink& CutLink(ZCLink& AR_CutLink) + { + if(&AR_CutLink==mp_HeadLink) + { + if(mp_HeadLink==mp_TailLink) + mp_HeadLink=0; + else + { + ZCLink::MakeRing //////////////////////////// + ( + mp_HeadLink=mp_HeadLink->mp_NextLink, + AR_CutLink.mp_PrevLink + ); + ///////////////////////////////////////////// + }/* + else*/ + } + else if(&AR_CutLink==mp_TailLink) + { + ZCLink* VP_NewTail=AR_CutLink.mp_PrevLink; + + ZCLink::MakeRing(mp_HeadLink, VP_NewTail); + + mp_TailLink = VP_NewTail ; + } + else ZCLink::JoinLink(AR_CutLink. mp_PrevLink, AR_CutLink.mp_NextLink); + + return (--ml_LinkSize, AR_CutLink); + }/* + ZCLink& CutLink(ZCLink& AR_CutLink)*/ + + public : - ZtCLinkList() - { - mp_HeadLink=0; - mp_TailLink=0; - ml_LinkSize=0; - }/* - ZtCLinkList()*/ + ZtCLinkList() + { + mp_HeadLink=0; + mp_TailLink=0; + ml_LinkSize=0; + }/* + ZtCLinkList()*/ + + ZtCLinkList(const ZtCLinkList& rhs) + { + mp_HeadLink=0; + mp_TailLink=0; + ml_LinkSize=0; + }/* + ZtCLinkList(const ZtCLinkList& rhs)*/ + + ~ZtCLinkList() + { + DeleteAll(); + }/* + ~ZtCLinkList()*/ - // is adding codes + ZtCLinkList& operator=(const ZtCLinkList& rhs) + { + return *this; + }/* + ZtCLinkList& operator=(const ZtCLinkList& rhs)*/ + + + void DeleteAll() + { + if(ml_LinkSize<1) return; + + ZCLink VP_DelLink = mp_HeadLink; + + __for0(TypeSize, i, ml_LinkSize) + { + mp_HeadLink = mp_HeadLink->mp_NextLink; + + DelLink(VP_DelLink); VP_DelLink = mp_HeadLink; + }/* + __for0(TypeSize, i, ml_LinkSize)*/ + + mp_HeadLink=0; + mp_TailLink=0; + ml_LinkSize=0; + }/* + void DeleteAll()*/ + + void clear(){DeleteAll();} + + + ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); } + ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); } + + void DelHead() + { if(ml_LinkSize<1) return; DelLink( CutLink(mp_HeadLink) ); } + void DelTail() + { if(ml_LinkSize<1) return; DelLink( CutLink(mp_TailLink) ); } + + + void Delete(ZCLink& AR_DelLink) + { + DelLink( &CutLink(AR_DelLink) ); + }/* + void Delete(ZCLink& AR_DelLink)*/ + + + void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink) + { + // AR_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다. + // AP_StdLink==0 이면, rhs 의 앞에 삽입한다. + + CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, AP_StdLink); + }/* + void SendOutAfter (ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/ + + void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink) + { + // AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. + // AP_StdLink==0 이면, rhs 의 뒤에 삽입한다. + + CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, AP_StdLink); + }/* + void SendOutBefore(ZCLink& AR_CutLink, ZtCObjList& rhs, ZCLink* AP_StdLink)*/ + + + void SendOutHead(ZCLink& AR_CutLink, ZtCObjList& rhs) + { + // AR_CutLink 를 잘라서 rhs 의 앞에 연결한다. + + SendOutAfter (AR_CutLink, rhs, 0); + } + void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs) + { + // AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다. + + SendOutBefore(AR_CutLink, rhs, 0); + }/* + void SendOutTail(ZCLink& AR_CutLink, ZtCObjList& rhs)*/ public : };/* - template - - class ZtCLinkList*/ + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize = ZTypLong + , typename TTypeCRTP = + ZNsType::ZtCTypeCRTP + > + class ZtCLinkList #######################################################*/ }/* namespace ZNsMain*/ -#endif //__ZCPPMAIN__ZMAINHEAD_H__ +#endif //__ZCPPMAIN__ZTCLINKLIST_H__