From cd4e81a89a7ac2c5a2fc27cdfa8d96ff27a0d1ed Mon Sep 17 00:00:00 2001 From: sauron Date: Mon, 6 Oct 2025 22:53:19 +0900 Subject: [PATCH] commit 2025-10-06 22:53 add ZtCLinkMoveList : ZCppMain/ZtCLinkList.H --- ZCppMain/ZMainHead.H | 31 +- ZCppMain/ZtCLinkList.H | 940 ++++++++++++++++++++++++++++++++++- ZCppMain/ZtCTreeData.H | 8 +- ZCppMainTest/ZtCBaseList_000.cpp | 10 + ZCppMainTest/ZtCLinkMoveList_000.cpp | 233 +++++++++ 5 files changed, 1177 insertions(+), 45 deletions(-) create mode 100644 ZCppMainTest/ZtCLinkMoveList_000.cpp diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index 362e2fd..26367a7 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -5950,15 +5950,20 @@ namespace ZNsMain if (VL_MinusSize>0) { + ZCLink* VP_CutTail = + mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1); + ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ; + RecvFreeIn //////////////////////////////////////// ( - VL_MinusSize, - mp_HeadLink , - mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1) + VL_MinusSize, mp_HeadLink, VP_CutTail ); /////////////////////////////////////////////////// - ml_LinkSize -= VL_MinusSize; + mp_HeadLink = VP_CutTailNext; + ml_LinkSize -= VL_MinusSize ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else if(VL_MinusSize<0) { @@ -5985,7 +5990,7 @@ namespace ZNsMain mp_HeadLink = VP_HeadLink ; mp_TailLink = VP_TailLink ; - ZCLink::MakeRing(mp_HeadLink, VP_TailLink); + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* else*/ @@ -6207,7 +6212,6 @@ namespace ZNsMain { mp_HeadLink = rhs.mp_HeadLink ; mp_TailLink = rhs.mp_TailLink ; - ml_LinkSize = rhs.ml_LinkSize ; } else // ml_LinkSize>=1 { @@ -6215,7 +6219,6 @@ namespace ZNsMain ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink ); mp_HeadLink = rhs.mp_HeadLink ; - ml_LinkSize = rhs.ml_LinkSize ; }/* else // ml_LinkSize>=1*/ @@ -6225,7 +6228,7 @@ namespace ZNsMain rhs.mp_TailLink = 0 ; rhs.ml_LinkSize = 0 ; - return *this; + return *this; ///////////////// }/* if(VP_StdLink==0)*/ @@ -6261,7 +6264,6 @@ namespace ZNsMain { mp_HeadLink = rhs.mp_HeadLink ; mp_TailLink = rhs.mp_TailLink ; - ml_LinkSize = rhs.ml_LinkSize ; } else // ml_LinkSize>=1 { @@ -6269,15 +6271,16 @@ namespace ZNsMain 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; - ml_LinkSize += rhs.ml_LinkSize; return *this; + rhs.mp_HeadLink = 0 ; + rhs.mp_TailLink = 0 ; + rhs.ml_LinkSize = 0 ; + + return *this; ///////////////// }/* if(VP_StdLink==0)*/ diff --git a/ZCppMain/ZtCLinkList.H b/ZCppMain/ZtCLinkList.H index dfde801..16809ed 100644 --- a/ZCppMain/ZtCLinkList.H +++ b/ZCppMain/ZtCLinkList.H @@ -17,6 +17,24 @@ -- 2025-10-06 15:22 +■ class ZtCLinkMoveList 은 고정적으로 맨 앞과 맨 뒤를 가상으로 표시하는 링크 객체를 멤 + 버로 가지고 있다. 그래서 중간에서 링크 자료를 떼어 내어 다른 리스트로 옮길 때, 그 링 + 크가 리스트의 앞이나 뒤가 아닌, 무조건 중간에 존재한다고 가정하고 빠르게 삭제할 수 있 + 도록 했다. 이렇지 않다면 떼어 내려는 링크가 처음 링크인지 마지막 링크인지를 판단하는 + 코드를 집어 넣었어야 한다. 그러니까 ZtCLinkList 보다 좀 더 빠르게 리스트간 자료 이동 + 이 가능하게 설계한 것이다. + + ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체 + ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체 + + 실제 사용되는 링크의 머리는 mo_HeadFake.mp_NextLink 이고 + 실제 사용되는 링크의 꼬리는 mo_TailFake.mp_PrevLink 이다. + + 물론 이동하려는 링크가 mo_HeadFake 이나 mo_TailFake 을 가리키지 않도록 조심할 필요는 + 있다. + + -- 2025-10-06 22:18 + //////////////////////////////////////////////////////////////////////////////////////*/ @@ -32,6 +50,15 @@ namespace ZNsMain class ZtCLinkList; /*####################################################*/ + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize + , typename TTypeCRTP + > + class ZtCLinkMoveList; /*################################################*/ + + namespace ZNsIFaceEx { @@ -49,6 +76,14 @@ namespace ZNsMain > friend class ZNsMain::ZtCLinkList; /*####################################*/ + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize + , typename TTypeCRTP + > + friend class ZNsMain::ZtCLinkMoveList; /*################################*/ + public : typedef ZtCLink TypeThis ; typedef TTypBase TypeBase ; @@ -251,6 +286,7 @@ namespace ZNsMain class ZtCLink : public TTypBase { public : + template ////////////////////////////////////////////////////////////////// < typename TCLink @@ -258,6 +294,15 @@ namespace ZNsMain , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ + + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize + , typename TTypeCRTP + > + friend class ZNsMain::ZtCLinkMoveList; /*################################*/ + public : typedef ZtCLink TypeThis ; typedef TTypBase /*+++++++++++++*/ TypeBase ; @@ -449,6 +494,7 @@ namespace ZNsMain { public : public : + template ////////////////////////////////////////////////////////////////// < typename TCLink @@ -456,6 +502,15 @@ namespace ZNsMain , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ + + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize + , typename TTypeCRTP + > + friend class ZNsMain::ZtCLinkMoveList; /*################################*/ + public : typedef ZtCLink TypeThis ; typedef ZCEmpty /*+++++++++++*/ TypeBase ; @@ -630,7 +685,7 @@ namespace ZNsMain template<> class ZtCLink { public : - public : + template ////////////////////////////////////////////////////////////////// < typename TCLink @@ -638,6 +693,15 @@ namespace ZNsMain , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ + + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize + , typename TTypeCRTP + > + friend class ZNsMain::ZtCLinkMoveList; /*################################*/ + public : typedef ZtCLink TypeThis ; typedef ZCEmpty /*++++++++++++*/ TypeBase ; @@ -1070,12 +1134,12 @@ namespace ZNsMain /*private:*/ private: - ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd) + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink) { - // AR_LinkNew 를 AP_LinkStd 뒤에 삽입한다. + // AR_LinkNew 를 AP_StdLink 뒤에 삽입한다. // AL_PosStd==0 이면 맨 앞에 삽입한다. - if(AP_LinkStd==0) + if(AP_StdLink==0) { // 맨 앞에 삽입. @@ -1095,7 +1159,7 @@ namespace ZNsMain }/* else*/ } - else if(AP_LinkStd==mp_TailLink) + else if(AP_StdLink==mp_TailLink) { ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ; ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ; @@ -1104,24 +1168,24 @@ namespace ZNsMain } else { - ZCLink* AP_NextStd = AP_LinkStd->mp_NextLink ; + ZCLink* AP_NextStd = AP_StdLink->mp_NextLink ; - ZCLink::JoinLink(AP_LinkStd , &AR_LinkNew); + ZCLink::JoinLink(AP_StdLink , &AR_LinkNew); ZCLink::JoinLink(&AR_LinkNew, AP_NextStd ); }/* else*/ ++ml_LinkSize; return AR_LinkNew; }/* - ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/ - ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd) + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink) { - // AR_LinkNew 를 AP_LinkStd 앞에 삽입한다. + // AR_LinkNew 를 AP_StdLink 앞에 삽입한다. // AL_PosStd==0 이면 맨 뒤에 삽입한다. - if(AP_LinkStd==0) + if(AP_StdLink==0) { // 맨 뒤에 삽입. @@ -1141,7 +1205,7 @@ namespace ZNsMain }/* else*/ } - else if(AP_LinkStd==mp_HeadLink) + else if(AP_StdLink==mp_HeadLink) { ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink); ZCLink::MakeRing(&AR_LinkNew, mp_TailLink); @@ -1150,16 +1214,16 @@ namespace ZNsMain } else { - ZCLink* AP_PrevStd = AP_LinkStd->mp_PrevLink ; + ZCLink* AP_PrevStd = AP_StdLink->mp_PrevLink ; ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew); - ZCLink::JoinLink(&AR_LinkNew, AP_LinkStd); + ZCLink::JoinLink(&AR_LinkNew, AP_StdLink); }/* else*/ ++ml_LinkSize; return AR_LinkNew; }/* - ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_LinkStd)*/ + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/ ZtCLinkList& JoinAfter(ZtCLinkList& rhs, ZCLink* AP_StdLink) @@ -1175,7 +1239,6 @@ namespace ZNsMain { mp_HeadLink = rhs.mp_HeadLink ; mp_TailLink = rhs.mp_TailLink ; - ml_LinkSize = rhs.ml_LinkSize ; } else // ml_LinkSize>=1 { @@ -1183,7 +1246,6 @@ namespace ZNsMain ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink ); mp_HeadLink = rhs.mp_HeadLink ; - ml_LinkSize = rhs.ml_LinkSize ; }/* else // ml_LinkSize>=1*/ @@ -1193,7 +1255,7 @@ namespace ZNsMain rhs.mp_TailLink = 0 ; rhs.ml_LinkSize = 0 ; - return *this; + return *this; ///////////////// }/* if(AP_StdLink==0)*/ @@ -1228,7 +1290,6 @@ namespace ZNsMain { mp_HeadLink = rhs.mp_HeadLink ; mp_TailLink = rhs.mp_TailLink ; - ml_LinkSize = rhs.ml_LinkSize ; } else // ml_LinkSize>=1 { @@ -1236,15 +1297,16 @@ namespace ZNsMain ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink ); mp_TailLink = rhs.mp_TailLink ; - 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; - ml_LinkSize += rhs.ml_LinkSize; return *this; + return *this; ///////////////// }/* if(AP_StdLink==0)*/ @@ -1255,7 +1317,7 @@ namespace ZNsMain ZCLink::JoinLink(rhs.mp_TailLink, AP_StdLink ); if(AP_StdLink==mp_HeadLink) - { mp_HeadLink = rhs.mp_HeadLink; } + { mp_HeadLink = rhs.mp_HeadLink; } rhs.mp_HeadLink =0 ; rhs.mp_TailLink =0 ; @@ -1425,15 +1487,20 @@ namespace ZNsMain if (VL_MinusSize>0) { + ZCLink* VP_CutTail = + mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1); + ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ; + RecvFreeIn //////////////////////////////////////// ( - VL_MinusSize, - mp_HeadLink , - mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1) + VL_MinusSize, mp_HeadLink, VP_CutTail ); /////////////////////////////////////////////////// - ml_LinkSize -= VL_MinusSize; + mp_HeadLink = VP_CutTailNext; + ml_LinkSize -= VL_MinusSize ; + + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else if(VL_MinusSize<0) { @@ -1460,7 +1527,7 @@ namespace ZNsMain mp_HeadLink = VP_HeadLink ; mp_TailLink = VP_TailLink ; - ZCLink::MakeRing(mp_HeadLink, VP_TailLink); + ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* else*/ @@ -1753,6 +1820,7 @@ namespace ZNsMain ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) ###############################################################################*/ + public : };/* template ////////////////////////////////////////////////////////////////// @@ -1764,6 +1832,824 @@ namespace ZNsMain > class ZtCLinkList #######################################################*/ + + + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize = ZTypLong + , typename TTypeCRTP = + ZNsType::ZtCTypeCRTP + > + class ZtCLinkMoveList /*#################################################*/ + { + public : + typedef ZtCLinkMoveList ZCMoveList; + public : + typedef ZNsType::ZtCTypeNowCRTP /////////////////////////////////////// + < + ZCMoveList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP + > + ZCTypeNowCRTP ; /////////////////////////////////////////////////////// + + typedef typename ZCTypeNowCRTP::TypeData TypeChild; + public : + typedef ZtCObjOpt ZCDataOpt; + typedef ZtCObjOpt ZCLinkOpt; + public : + typedef TCLink ZCLink ; + typedef TCLink TypeData; + typedef TTypSize TypeSize; + private: + ZCLink mo_HeadFake; // 고정된 가상의 맨 앞 링크 객체 + ZCLink mo_TailFake; // 고정된 가상의 맨 뒤 링크 객체 + TypeSize ml_LinkSize; + ////////////////////////////////////////////////////////// + // 실제 맨 앞 링크는 mo_HeadFake.mp_NextLink + // 실제 맨 뒤 링크는 mo_TailFake.mp_PrevLink + private: + + TypeChild& GetChildObj() + { + return *static_cast(this); + }/* + TypeChild& GetChildObj()*/ + + private: + + ZCLink* NewLink() + { + return new ZCLink; + }/* + ZCLink* NewLink()*/ + + ZCLink* NewLink( ZCLink& AR_ArgData) + { return new ZCLink(AR_ArgData); } + + ZCLink* NewLink(const ZCLink& AR_ArgData) + { return new ZCLink(AR_ArgData); } + + void NewLink //////////////////////////////////////// + ( + TypeSize AL_NeedCnt , + ZCLink*& APR_HeadLink , + ZCLink*& APR_TailLink + ) + ///////////////////////////////////////////////////// + { + APR_HeadLink = new ZCLink; + + ZCLink* VP_MakeLink = 0 ; + ZCLink* VP_TailLink = APR_HeadLink; + + while(--AL_NeedCnt>0) // AL_NeedCnt - 1 번 순환 + { + // AL_NeedCnt - 1 번 순환 + + VP_MakeLink = new ZCLink; + + ZCLink::JoinLink + (VP_TailLink, VP_MakeLink); + VP_TailLink = VP_MakeLink ; + }/* + while(--AL_NeedCnt>0)*/ + + APR_TailLink = VP_TailLink; + }/* + void NewLink //////////////////////////////////////// + ( + TypeSize AL_NeedCnt , + ZCLink*& APR_HeadLink , + ZCLink*& APR_TailLink + ) + ///////////////////////////////////////////////////*/ + + + void NewLinkCopy ////////////////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// + { + // 총 AL_FarNum+1 개의 링크가 만들어짊 + + ZCLink* VP_MakeLink = 0 ; + ZCLink* VP_TailLink = 0 ; + + VP_TailLink = VP_MakeLink = + new ZCLink(**AP_LinkOrgin) ; + + APR_HeadCopy = VP_MakeLink; + + while(--AL_FarNum >= 0) + { + AP_LinkOrgin= AP_LinkOrgin->GetNextPtr(); + VP_MakeLink = new ZCLink(**AP_LinkOrgin); + + ZCLink::JoinLink + (VP_TailLink, VP_MakeLink); + + VP_TailLink = VP_MakeLink; + }/* + while(--AL_FarNum >= 0)*/ + + APR_TailCopy=VP_TailLink; + }/* + void NewLinkCopy ////////////////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////*/ + + + void DelLink(ZCLink* AP_DelLink) + { + delete AP_DelLink; + }/* + void DelLink(ZCLink* AP_DelLink)*/ + + void DelLink ////////////////////////////////////////// + ( + TypeSize AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////// + { + ZCLink* VP_DelLink = AP_CutHead; + + __for0(TypeSize, i, AL_CutCnt) + { + AP_CutHead = AP_CutHead->GetNextPtr() ; + + delete VP_DelLink; VP_DelLink=AP_CutHead; + }/* + __for0(TypeSize, i, AL_CutCnt)*/ + } + /////////////////////////////////////////////////////// + + /*private:*/ + private: + + _VT_ ZCLink* SendFreeOut() + { + if(TTypeCRTP::ZEUseCRTP<1) return NewLink(); + + return GetChildObj().SendFreeOut(); + }/* + _VT_ ZCLink* SendFreeOut()*/ + + _VT_ ZCLink* SendFreeOut(ZCLink& AR_ArgData) + { + if(TTypeCRTP::ZEUseCRTP<1) + { return NewLink(AR_ArgData); } + + return GetChildObj().SendFreeOut(AR_ArgData); + }/* + _VT_ ZCLink* SendFreeOut(ZCLink& AR_ArgData)*/ + + _VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData) + { + if(TTypeCRTP::ZEUseCRTP<1) + { return NewLink(AR_ArgData); } + + return GetChildObj().SendFreeOut(AR_ArgData); + }/* + _VT_ ZCLink* SendFreeOut(const ZCLink& AR_ArgData)*/ + + _VT_ void SendFreeOut + (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) + { + if(TTypeCRTP::ZEUseCRTP<1) + { + NewLink(AL_NeedCnt, APR_HeadLink, APR_TailLink); return; + }/* + if(TTypeCRTP::ZEUseCRTP<1)*/ + + return GetChildObj().SendFreeOut + (AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink)); + }/* + _VT_ void SendFreeOut + (TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink) + */ + + _VT_ void SendFreeOutCopy /*///////////////////////*/ + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////// + { + // 총 AL_FarNum+1 개의 링크가 만들어짊 + + if(TTypeCRTP::ZEUseCRTP<1) + { + NewLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); return; + }/* + if(TTypeCRTP::ZEUseCRTP<1)*/ + + return GetChildObj().SendFreeOutCopy + (AP_LinkOrgin, AL_FarNum, RR(APR_HeadCopy), RR(APR_TailCopy)); + }/* + _VT_ void SendFreeOutCopy ///////////////////////// + ( + ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , + ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy + ) + ///////////////////////////////////////////////////*/ + + + _VT_ void RecvFreeIn(ZCLink* AP_DelLink) + { + if(TTypeCRTP::ZEUseCRTP<1) + { DelLink(AP_DelLink); return; } + + GetChildObj().RecvFreeIn(AP_DelLink); + }/* + _VT_ void RecvFreeIn(ZCLink* AP_DelLink)*/ + + _VT_ void RecvFreeIn ////////////////////////////////// + ( + TypeSize AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////// + { + if(TTypeCRTP::ZEUseCRTP<1) + { + DelLink + (AL_CutCnt, AP_CutHead, AP_CutTail); + return; + }/* + if(TTypeCRTP::ZEUseCRTP<1)*/ + + GetChildObj().RecvFreeIn(AL_CutCnt, AP_CutHead, AP_CutTail); + }/* + _VT_ void RecvFreeIn ////////////////////////////////// + ( + TypeSize AL_CutCnt , + ZCLink* AP_CutHead, + ZCLink* AP_CutTail + ) + /////////////////////////////////////////////////////*/ + + /*private:*/ + private: + + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink) + { + // AR_LinkNew 를 AP_StdLink 뒤에 삽입한다. + // AL_PosStd==0 이면 맨 앞에 삽입한다. + + if(AP_StdLink==0) AP_StdLink=&mo_HeadFake ; + + ZCLink* AP_NextStd = AP_StdLink->mp_NextLink; + + ZCLink::JoinLink(AP_StdLink , &AR_LinkNew); + ZCLink::JoinLink(&AR_LinkNew, AP_NextStd ); + + ++ml_LinkSize; return AR_LinkNew; + }/* + ZCLink& JoinAfter(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/ + + + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink) + { + // AR_LinkNew 를 AP_StdLink 앞에 삽입한다. + // AL_PosStd==0 이면 맨 뒤에 삽입한다. + + if(AP_StdLink==0) AP_StdLink= &mo_TailFake; + + ZCLink* AP_PrevStd = AP_StdLink->mp_PrevLink ; + + ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew); + ZCLink::JoinLink(&AR_LinkNew, AP_StdLink); + + ++ml_LinkSize; return AR_LinkNew; + }/* + ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/ + + + ZCMoveList& JoinAfter (ZCMoveList& rhs, ZCLink* AP_StdLink) + { + // AP_StdLink 의 뒤에 rhs 를 삽입. + // AP_StdLink==0 이면 맨 앞에 삽입. + + if(this==&rhs ) return *this; + if(rhs.size()<1) return *this; + + if(AP_StdLink==0) AP_StdLink=&mo_HeadFake ; + + ZCLink* VP_RhsHead = rhs.mo_HeadFake.mp_NextLink; + ZCLink* VP_RhsTail = rhs.mo_TailFake.mp_PrevLink; + ZCLink* VP_StdNext = AP_StdLink-> mp_NextLink; + + ZCLink::JoinLink(AP_StdLink, VP_RhsHead); + ZCLink::JoinLink(VP_RhsTail, VP_StdNext); + + this->ml_LinkSize += rhs.ml_LinkSize; + rhs. ml_LinkSize =0 ; + + ZCLink::JoinLink + (&rhs.mo_HeadFake, &rhs.mo_TailFake); + + return *this; + }/* + ZCMoveList& JoinAfter (ZCMoveList& rhs, ZCLink* AP_StdLink)*/ + + + ZCMoveList& JoinBefore(ZCMoveList& rhs, ZCLink* AP_StdLink) + { + // AP_StdLink 의 앞에 rhs 를 삽입. + // AP_StdLink==0 이면 맨 뒤에 삽입. + + if(this==&rhs ) return *this; + if(rhs.size()<1) return *this; + + if(AP_StdLink==0) AP_StdLink=&mo_TailFake ; + + ZCLink* VP_RhsHead = rhs.mo_HeadFake.mp_NextLink; + ZCLink* VP_RhsTail = rhs.mo_TailFake.mp_PrevLink; + ZCLink* VP_StdPrev = AP_StdLink-> mp_PrevLink; + + ZCLink::JoinLink(VP_StdPrev, VP_RhsHead); + ZCLink::JoinLink(VP_RhsTail, AP_StdLink); + + this->ml_LinkSize += rhs.ml_LinkSize; + rhs. ml_LinkSize = 0 ; + + ZCLink::JoinLink + (&rhs.mo_HeadFake, &rhs.mo_TailFake); + + return *this; + }/* + ZCMoveList& JoinBefore(ZCMoveList& rhs, ZCLink* AP_StdLink)*/ + + + ZCLink& CutLink(ZCLink& AR_CutLink) + { + ZCLink::JoinLink + (AR_CutLink->mp_PrevLink, AR_CutLink->mp_NextLink); + + return (--ml_LinkSize, AR_CutLink); + }/* + ZCLink& CutLink(ZCLink& AR_CutLink)*/ + + + ZCMoveList& CutLinkRangeOut /*########################################*/ + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZCMoveList& 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; + + ZCLink* VP_CutHeadPrev = AR_CutHead.mp_PrevLink; + ZCLink* VP_CutTailNext = AR_CutTail.mp_NextLink; + + ZCLink::JoinLink(VP_CutHeadPrev, VP_CutTailNext); + + ml_LinkSize -= AL_CutSize; + + + // rhs 의 AP_RhsStd 의 뒤에 삽입. + // AP_RhsStd==0 이면 rhs 의 맨 앞에 삽입. + + if(AP_RhsStd==0) AP_RhsStd=&rhs.mo_HeadFake ; + + ZCLink* VP_RhsStdNext = AP_RhsStd->mp_NextLink ; + + ZCLink::JoinLink(AP_RhsStd , &AR_CutHead ); + ZCLink::JoinLink(&AR_CutTail, VP_RhsStdNext); + + rhs.ml_LinkSize += AL_CutSize; return rhs; + }/* + ZCMoveList& CutLinkRangeOut ############################################ + ( + ZCLink& AR_CutHead , + ZCLink& AR_CutTail , + TypeSize AL_CutSize , + ZCMoveList& rhs , + ZCLink* AP_RhsStd + ) + #######################################################################*/ + + + /*private:*/ + public : + + ZtCLinkMoveList() + { + ZCLink::JoinLink(&mo_HeadFake, &mo_TailFake); + ZCLink::MakeRing(&mo_HeadFake, &mo_TailFake); + + ml_LinkSize=0; + }/* + ZtCLinkMoveList()*/ + + ZtCLinkMoveList(const ZtCLinkMoveList& rhs) + { + ZCLink::JoinLink(&mo_HeadFake, &mo_TailFake); + ZCLink::MakeRing(&mo_HeadFake, &mo_TailFake); + + ml_LinkSize=0; *this = rhs ; + }/* + ZtCLinkMoveList(const ZtCLinkMoveList& rhs)*/ + + ~ZtCLinkMoveList() + { + DeleteAll(); + }/* + ~ZtCLinkMoveList()*/ + + + ZCMoveList& operator=(const ZCMoveList& rhs) + { + if(this==&rhs) return *this; + + if(rhs.size()<1) + { this->DeleteAll(); return *this; } + + TypeSize VL_MinusSize = this->size() - rhs.size() ; + + if (VL_MinusSize>0) + { + ZCLink* VP_CutHead = mo_HeadFake.mp_NextLink ; + ZCLink* VP_CutTail = + VP_CutHead->GetNextPrevPtr( VL_MinusSize-1 ) ; + ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ; + + RecvFreeIn //////////////////////////////////////// + ( + VL_MinusSize, VP_CutHead, VP_CutTail + ); + /////////////////////////////////////////////////// + + ml_LinkSize -= VL_MinusSize ; + + ZCLink::JoinLink(&mo_HeadFake, VP_CutTailNext); + } + else if(VL_MinusSize<0) + { + ZCLink* VP_HeadLink=0; + ZCLink* VP_TailLink=0; + + SendFreeOut //////////////////////////////////////// + ( + -VL_MinusSize , + RR(VP_HeadLink) , + RR(VP_TailLink) + ); + /////////////////////////////////////////////////// + + ZCLink* VP_CurrTail = mo_TailFake.mp_PrevLink ; + + ZCLink::JoinLink(VP_CurrTail, VP_HeadLink); + ZCLink::JoinLink(VP_TailLink, &mo_TailFake); + + ml_LinkSize += (-VL_MinusSize); + }/* + else if(VL_MinusSize<0)*/ + + + ZCLink* VP_RhsLink = rhs.mo_HeadFake.mp_NextLink ; + ZCLink* VP_LhsLink = mo_HeadFake.mp_NextLink ; + + __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; + }/* + ZCMoveList& operator=(const ZCMoveList& rhs)*/ + + + TypeSize GetSize() const{return ml_LinkSize ;} + TypeSize size () const{return ml_LinkSize ;} + + bool IsEmpty() const{return ml_LinkSize<1;} + + + void DeleteAll() + { + if(ml_LinkSize<1) return; + + RecvFreeIn ///////////////////////// + ( + ml_LinkSize , + mo_HeadFake.mp_NextLink , + mo_TailFake.mp_PrevLink + ); + //////////////////////////////////// + + ZCLink::JoinLink + (&mo_HeadFake, &mo_TailFake); + + ml_LinkSize =0 ; + }/* + void DeleteAll()*/ + + void clear(){DeleteAll();} + + + ZCDataOpt GetHeadOpt() + { + return size()<1 ? ZCDataOpt(0) : + ZCDataOpt(mo_HeadFake.mp_NextLink); + } + ZCDataOpt GetTailOpt() + { + return size()<1 ? ZCDataOpt(0) : + ZCDataOpt(mo_TailFake.mp_PrevLink); + } + + ZCDataOpt GetObjOpt(TypeSize AI_Index) + { + if(ml_LinkSize<1 || AI_Index<1 || AI_Index>ml_LinkSize) + return ZCDataOpt(0); + /*+++++++++++++++++++++++++++++++++++++++++++++++++++*/ + + return ZCDataOpt( mo_HeadFake+AI_Index ); + }/* + ZCDataOpt GetObjOpt(TypeSize AI_Index)*/ + + + ZCLink& AddHead(){ return JoinAfter (*NewLink(), 0); } + ZCLink& AddTail(){ return JoinBefore(*NewLink(), 0); } + + ZCLink& AddHead(const ZCLink& AR_CLink) + { return JoinAfter (*NewLink(AR_CLink), 0); } + ZCLink& AddTail(const ZCLink& AR_CLink) + { return JoinBefore(*NewLink(AR_CLink), 0); } + + ZCLink& AddHead(ZCLink& AR_CLink) + { return JoinAfter (*NewLink(AR_CLink), 0); } + ZCLink& AddTail(ZCLink& AR_CLink) + { return JoinBefore(*NewLink(AR_CLink), 0); } + + + void DeleteHead() + { + if(ml_LinkSize<1) return; RecvFreeIn + ( &CutLink(mo_HeadFake.mp_NextLink) ); + } + void DeleteTail() + { + if(ml_LinkSize<1) return; RecvFreeIn + ( &CutLink(mo_TailFake.mp_PrevLink) ); + } + + + void Delete(ZCLink& AR_DelLink) + { + RecvFreeIn( &CutLink(AR_DelLink) ); + }/* + void Delete(ZCLink& AR_DelLink)*/ + + + ZCMoveList& JoinAfter (ZCMoveList& rhs, ZCLink& AR_StdLink) + { return JoinAfter (rhs, &AR_StdLink); } + ZCMoveList& JoinBefore(ZCMoveList& rhs, ZCLink& AR_StdLink) + { return JoinBefore(rhs, &AR_StdLink); } + + ZCMoveList& JoinHead(ZCMoveList& rhs){ return JoinAfter (rhs, 0); } + ZCMoveList& JoinTail(ZCMoveList& rhs){ return JoinBefore(rhs, 0); } + + + void SendOutAfter (ZCLink& AR_CutLink, ZCMoveList& rhs, ZCLink& AR_StdLink) + { + // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, &AR_StdLink); + }/* + void SendOutAfter (ZCLink& AR_CutLink, ZCMoveList& rhs, ZCLink& AR_StdLink)*/ + + void SendOutBefore(ZCLink& AR_CutLink, ZCMoveList& rhs, ZCLink& AR_StdLink) + { + // AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. + + CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, &AR_StdLink); + }/* + void SendOutBefore(ZCLink& AR_CutLink, ZCMoveList& rhs, ZCLink& AR_StdLink)*/ + + + void SendOutHead(ZCLink& AR_CutLink, ZCMoveList& rhs) + { + // AR_CutLink 를 잘라서 rhs 의 앞에 연결한다. + + CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, 0); + } + void SendOutTail(ZCLink& AR_CutLink, ZCMoveList& rhs) + { + // AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다. + + CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, 0); + }/* + void SendOutTail(ZCLink& AR_CutLink, ZCMoveList& rhs)*/ + + + ZCMoveList& SendRangeOutAfter /////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZCMoveList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + { + // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. + + return CutLinkRangeOut + ( + AR_CutHead, AR_CutTail, AI_CutSize, rhs, AO_LinkOpt.Raw() + ); + ////////////////////// + }/* + ZCMoveList& SendRangeOutAfter /////////////////////////////////////////// + ( + ZCLink& AR_CutHead, + ZCLink& AR_CutTail, + TypeSize AI_CutSize, + ZCMoveList& rhs , + ZCLinkOpt AO_LinkOpt + ) + /*#####################################################################*/ + + + template void IterElement(TFunctor AO_Functor) + { + ZCLink* VP_LoopLink=mo_HeadFake.mp_NextLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData:: + GetObjRef(AO_Functor)( *VP_LoopLink ); + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(TypeSize, i, ml_LinkSize)*/ + }/* + template void IterElement(TFunctor AO_Functor) */ + + + template + void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain:: + ZtCCheckRef ZCCheckRef; + + ZCLink* VP_LoopLink=mo_HeadFake.mp_NextLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData::GetObjRef(AO_Functor) + ( + *VP_LoopLink, ZCCheckRef::PassData(AO_TypeHelp) + ); + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __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=mo_HeadFake.mp_NextLink; + + __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_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=mo_TailFake.mp_PrevLink; + + __for0(TypeSize, i, ml_LinkSize) + { + ZtCTypeData:: + GetObjRef(AO_Functor)(*VP_LoopLink); + + VP_LoopLink = VP_LoopLink->mp_PrevLink ; + }/* + __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=mo_TailFake.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_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=mo_TailFake.mp_PrevLink; + + __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_Size)*/ + }/* + template + < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > + void IterElemRev + ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) + ###############################################################################*/ + + + public: + };/* + template ////////////////////////////////////////////////////////////////// + < + typename TCLink + , typename TTypSize = ZTypLong + , typename TTypeCRTP = + ZNsType::ZtCTypeCRTP + > + class ZtCLinkMoveList ###################################################*/ + + }/* namespace ZNsMain*/ diff --git a/ZCppMain/ZtCTreeData.H b/ZCppMain/ZtCTreeData.H index da5d920..24e558b 100644 --- a/ZCppMain/ZtCTreeData.H +++ b/ZCppMain/ZtCTreeData.H @@ -183,7 +183,7 @@ namespace ZNsMain ZCNode& AddSubNode() { - ZCNode* VP_CNode=(ZCNode*)&(**mo_CNodeList.AddTailDef()); + ZCNode* VP_CNode=(ZCNode*)&(*mo_CNodeList.AddTailDef()); VP_CNode->mp_HighNode=(ZCNode*)this; return *VP_CNode ; }/* @@ -360,7 +360,7 @@ namespace ZNsMain ZCNode& AddSubNode() { - ZCNode* VP_CNode=(ZCNode*)&(**mo_CNodeList.AddTailDef()); + ZCNode* VP_CNode=(ZCNode*)&(*mo_CNodeList.AddTailDef()); VP_CNode->mp_HighNode=(ZCNode*)this; return *VP_CNode ; }/* @@ -635,7 +635,7 @@ namespace ZNsMain ZCNode& AddSubNode() { - ZCNode* VP_CNode=(ZCNode*)&(**mo_CNodeList.AddTailDef()); + ZCNode* VP_CNode=(ZCNode*)&(*mo_CNodeList.AddTailDef()); VP_CNode->mp_HighNode=(ZCNode*)this; return *VP_CNode ; }/* @@ -858,7 +858,7 @@ namespace ZNsMain ZCNode& AddSubNode() { ZCNode* VP_CNode=(ZCNode*)& - ( **mo_CNodeList.AddTailDef() ); + ( *mo_CNodeList.AddTailDef() ); VP_CNode->mp_HighNode=(ZCNode*)this; return *VP_CNode; }/* diff --git a/ZCppMainTest/ZtCBaseList_000.cpp b/ZCppMainTest/ZtCBaseList_000.cpp index 85bab29..4e51f64 100644 --- a/ZCppMainTest/ZtCBaseList_000.cpp +++ b/ZCppMainTest/ZtCBaseList_000.cpp @@ -514,6 +514,16 @@ namespace ZNsMain cout<<"*****************************************************"< +#include +#include "ZCppMain/ZtCLinkList.H" + + +using namespace std ; +using namespace ZNsMain ; + + +namespace ZNsMain +{ + + namespace ZNsExam + { + + template class ZtCExamCLinkList + { + public: + typedef ZNsIFaceEx::ZtCLink ZCLinkCStr ; + typedef ZtCLinkMoveList ZCLinkStrList; + typedef ZCLinkStrList::ZCLinkOpt ZCStrLinkOpt ; + public: + + + static void ShowNode0(ZCLinkCStr& AR_CLink, ZTypLong& ARRI_CallCnt) + { + ++ARRI_CallCnt; cout< class ZtCExamCLinkList*/ + + }/* + namespace ZNsExam*/ + +}/* +namespace ZNsMain*/ + + +int main(int AI_ArgCnt, char* APP_ArgVal[]) +{ + return ZNsMain::ZNsExam:: + + ZtCExamCLinkList<>::Main(AI_ArgCnt, APP_ArgVal); +}/* +int main(int AI_ArgCnt, char* APP_ArgVal[])*/ + + +/*//////////////////////////////////////////////////////////////////////////////////////// + + cygwin + + // g++ -mno-cygwin -o ZtCLinkMoveList_000.exe ZtCLinkMoveList_000.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 + // g++ -mno-cygwin -o ZtCLinkMoveList_000_D.exe ZtCLinkMoveList_000.cpp -I../../my_CPP/CPP_Main/ -I../../my_CPP/CPP_Std/ -D__CYGWIN32__ -D__VISUAL_CPP_VER__=200300 -D_DEBUG + + mingw + + g++.exe -o ZtCLinkMoveList_000_mw.exe ZtCLinkMoveList_000.cpp -I../ -lWs2_32 + g++.exe -o ZtCLinkMoveList_000_mw_D.exe ZtCLinkMoveList_000.cpp -I../ -lWs2_32 -D_DEBUG + + ./ZtCLinkMoveList_000_mw.exe + ./ZtCLinkMoveList_000_mw_D.exe + + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # date + Sun Aug 24 10:47:09 KST 2025 + + Administrator@q381-2673 UCRT64 /e/my_CPP/ZCpp/ZCppMainTest + # g++ --version + g++.exe (Rev2, Built by MSYS2 project) 13.2.0 + Copyright (C) 2023 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + Linux + + g++ -std=c++98 -o ZtCLinkMoveList_000.exe ZtCLinkMoveList_000.cpp -I../ + g++ -std=c++98 -o ZtCLinkMoveList_000_D.exe ZtCLinkMoveList_000.cpp -I../ -D_DEBUG + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ gcc --version + gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0 + Copyright (C) 2019 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ date + Sun Aug 24 00:05:51 DST 2025 + + sauron@q381-2673:/mnt/e/my_CPP/ZCpp/ZCppMainTest$ cat /etc/os-release + NAME="Ubuntu" + VERSION="20.04.6 LTS (Focal Fossa)" + ID=ubuntu + ID_LIKE=debian + PRETTY_NAME="Ubuntu 20.04.6 LTS" + VERSION_ID="20.04" + HOME_URL="https://www.ubuntu.com/" + SUPPORT_URL="https://help.ubuntu.com/" + BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" + PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" + VERSION_CODENAME=focal + UBUNTU_CODENAME=focal + + + [sauron@q381-2657 ZCppMainTest]$ cat /etc/centos-release + CentOS Linux release 7.9.2009 (Core) + + [sauron@q381-2657 ZCppMainTest]$ g++ --version + g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) + Copyright (C) 2015 Free Software Foundation, Inc. + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + + + ./ZtCLinkMoveList_000.exe + ./ZtCLinkMoveList_000_D.exe + +////////////////////////////////////////////////////////////////////////////////////////*/