#ifndef __ZCPPMAIN__ZTCLINKLIST_H__ #define __ZCPPMAIN__ZTCLINKLIST_H__ #include "ZCppMain/ZMainHead.H" /*////////////////////////////////////////////////////////////////////////////////////// ■ class ZtCLinkList 는 링크를 외부에서 미리 정의하고, 그 링크를 template parameter 로 받는다. 이렇게 외부에서 어떤 자료를 (주로 상속으로) 가지는 링크를 정의하면, 링크 자 체가 일종의 링크를 가진 자료이기 때문에, 자료를 다른 리스트로 이동하기가 쉽다. 그러니까 ZtCLinkList 는 자료를 다른 리스트로 이동하는 것이 쉽도록 설계되었다. -- 2025-10-06 15:22 ■ ZtCLinkList 의 링크를 주로 정의하는 ZNsIFaceEx::ZtCLink 은 operator() 을 가지는 것이 좋다. const TypeBase& operator()() const { return *static_cast(this); } 그래서 ZtCLink 가 가지고 있는, 링크 포인터 이외의 데이타에 접근할 수 있는 장치를 제공 하는 것이 좋다. -- 2025-10-07 12:23 ■ 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 //////////////////////////////////////////////////////////////////////////////////////*/ namespace ZNsMain { template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > class ZtCLinkList; /*####################################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > class ZtCLinkMoveList; /*################################################*/ namespace ZNsIFaceEx { template class ZtCLink : public TTypBase { public : template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkMoveList; /*################################*/ public : typedef ZtCLink TypeThis ; typedef TTypBase TypeBase ; typedef TChild TypeChild; typedef ZTypLong TypeSize ; protected: ZtCLink* mp_NextLink; ZtCLink* mp_PrevLink; protected: static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; AP_NextLink->mp_PrevLink=AP_PrevLink; }/* static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/ static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink) { AP_HeadLink->mp_PrevLink=AP_TailLink; AP_TailLink->mp_NextLink=AP_HeadLink; }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ /*protected:*/ public : ZtCLink() { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink()*/ ZtCLink(const ZtCLink& rhs) { mp_NextLink=0 ; mp_PrevLink=0 ; (*this) = rhs ; }/* ZtCLink(const ZtCLink& rhs)*/ ZtCLink(const TTypBase& rhs) { mp_NextLink=0 ; mp_PrevLink=0 ; (*this) = rhs ; }/* ZtCLink(const TTypBase& rhs)*/ ZtCLink& operator=(const ZtCLink& rhs) { (*this)() = rhs(); return *this; }/* ZtCLink& operator=(const ZtCLink& rhs)*/ ZtCLink& operator=(const TypeBase& AR_CBase) { (*this)() = AR_CBase; return *this; }/* ZtCLink& operator=(const TypeBase& AR_CBase)*/ ZtCLink& operator=(TypeBase& AR_CBase) { (*this)() = AR_CBase; return *this; }/* ZtCLink& operator=(TypeBase& AR_CBase)*/ /***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); } const TypeBase& operator()() const{ return *static_cast(this); } 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* 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) 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 class ZtCLink : public TTypBase */ template class ZtCLink : public TTypBase { public : template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkMoveList; /*################################*/ public : typedef ZtCLink TypeThis ; typedef TTypBase /*+++++++++++++*/ TypeBase ; typedef ZCEmpty /*+++++++++++++*/ TypeChild; typedef ZTypLong /*+++++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; ZtCLink* mp_PrevLink; public : static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; AP_NextLink->mp_PrevLink=AP_PrevLink; }/* static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/ static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink) { AP_HeadLink->mp_PrevLink=AP_TailLink; AP_TailLink->mp_NextLink=AP_HeadLink; }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ /*protected:*/ public : ZtCLink() { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink()*/ ZtCLink(const TypeThis& rhs) { mp_NextLink =0 ; mp_PrevLink =0 ; (*this)() = rhs(); }/* ZtCLink(const TypeThis& rhs)*/ TypeThis& operator=(const TypeThis& rhs) { (*this)() = rhs(); return *this; }/* TypeThis& operator=(const TypeThis& rhs)*/ TypeThis& operator=(const TypeBase& AR_CBase) { (*this)() = AR_CBase; return *this; }/* TypeThis& operator=(const TypeBase& AR_CBase)*/ TypeThis& operator=(TypeBase& AR_CBase) { (*this)() = AR_CBase; return *this; }/* TypeThis& operator=(TypeBase& AR_CBase)*/ /***/ TypeBase& operator()() { return *static_cast< TypeBase*>(this); } const TypeBase& operator()() const{ return *static_cast(this); } 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* 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) 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 class ZtCLink : public TTypBase*/ template class ZtCLink { public : public : template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkMoveList; /*################################*/ public : typedef ZtCLink TypeThis ; typedef ZCEmpty /*+++++++++++*/ TypeBase ; typedef TChild /*+++++++++++*/ TypeChild; typedef ZTypLong /*++++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; ZtCLink* mp_PrevLink; protected: static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; AP_NextLink->mp_PrevLink=AP_PrevLink; }/* static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/ static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink) { AP_HeadLink->mp_PrevLink=AP_TailLink; AP_TailLink->mp_NextLink=AP_HeadLink; }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ /*protected:*/ public : ZtCLink() { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink()*/ ZtCLink(const TypeThis& rhs) { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink(const TypeThis& rhs)*/ TypeThis& operator=(const TypeThis& rhs) { return *this; }/* TypeThis& operator=(const TypeThis& rhs)*/ /***/ TypeThis& operator()() { return *this; } const TypeThis& operator()() const{ return *this; } 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* 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) 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 class ZtCLink*/ template<> class ZtCLink { public : template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkList; /*####################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize , typename TTypeCRTP > friend class ZNsMain::ZtCLinkMoveList; /*################################*/ public : typedef ZtCLink TypeThis ; typedef ZCEmpty /*++++++++++++*/ TypeBase ; typedef ZCEmpty /*++++++++++++*/ TypeChild; typedef ZTypLong /*++++++++++++*/ TypeSize ; protected: ZtCLink* mp_NextLink; ZtCLink* mp_PrevLink; protected: static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; AP_NextLink->mp_PrevLink=AP_PrevLink; }/* static void JoinLink(ZtCLink* AP_PrevLink, ZtCLink* AP_NextLink)*/ static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink) { AP_HeadLink->mp_PrevLink=AP_TailLink; AP_TailLink->mp_NextLink=AP_HeadLink; }/* static void MakeRing(ZtCLink* AP_HeadLink, ZtCLink* AP_TailLink)*/ /*protected:*/ public : ZtCLink() { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink()*/ ZtCLink(const TypeThis& rhs) { mp_NextLink=0; mp_PrevLink=0; }/* ZtCLink(const TypeThis& rhs)*/ TypeThis& operator=(const TypeThis& rhs) { return *this; }/* TypeThis& operator=(const TypeThis& 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* 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) 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<> class ZtCLink*/ }/* namespace ZNsIFaceEx*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize = ZTypLong , typename TTypeCRTP = ZNsType::ZtCTypeCRTP > class ZtCLinkList /*#####################################################*/ { public : typedef ZtCLinkList TypeThis; public : typedef ZNsType::ZtCTypeNowCRTP /////////////////////////////////////// < TypeThis, 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* mp_HeadLink; ZCLink* mp_TailLink; TypeSize ml_LinkSize; 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) { // 맨 앞에 삽입. if(ml_LinkSize==0) { 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 if(AP_StdLink==mp_TailLink) { ZCLink::JoinLink(mp_TailLink, &AR_LinkNew) ; ZCLink::MakeRing(mp_HeadLink, &AR_LinkNew) ; mp_TailLink = &AR_LinkNew; } else { ZCLink* AP_NextStd = AP_StdLink->mp_NextLink ; 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_StdLink)*/ ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink) { // AR_LinkNew 를 AP_StdLink 앞에 삽입한다. // AL_PosStd==0 이면 맨 뒤에 삽입한다. if(AP_StdLink==0) { // 맨 뒤에 삽입. if(ml_LinkSize==0) { 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_TailLink=&AR_LinkNew; }/* else*/ } else if(AP_StdLink==mp_HeadLink) { ZCLink::JoinLink(&AR_LinkNew, mp_HeadLink); ZCLink::MakeRing(&AR_LinkNew, mp_TailLink); mp_HeadLink = &AR_LinkNew; } else { ZCLink* AP_PrevStd = AP_StdLink->mp_PrevLink ; ZCLink::JoinLink( AP_PrevStd, &AR_LinkNew); ZCLink::JoinLink(&AR_LinkNew, AP_StdLink); }/* else*/ ++ml_LinkSize; return AR_LinkNew; }/* ZCLink& JoinBefore(ZCLink& AR_LinkNew, ZCLink* AP_StdLink)*/ TypeThis& JoinAfter(TypeThis& 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 ; } else // ml_LinkSize>=1 { ZCLink::JoinLink( rhs.mp_TailLink, mp_HeadLink ); ZCLink::MakeRing( rhs.mp_HeadLink, mp_TailLink ); mp_HeadLink = rhs.mp_HeadLink ; }/* 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; }/* TypeThis& JoinAfter(TypeThis& rhs, ZCLink* AP_StdLink)*/ TypeThis& JoinBefore(TypeThis& 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 ; } else // ml_LinkSize>=1 { ZCLink::JoinLink(mp_TailLink, rhs.mp_HeadLink ); ZCLink::MakeRing(mp_HeadLink, rhs.mp_TailLink ); mp_TailLink = rhs.mp_TailLink ; }/* 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_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; }/* TypeThis& JoinBefore(TypeThis& rhs, ZCLink* AP_StdLink)*/ 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)*/ TypeThis& CutLinkRangeOut /*##########################################*/ ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , TypeThis& rhs , ZCLink* AP_RhsStd , bool AB_After=true ) /*#####################################################################*/ { /*/////////////////////////////////////////////////////////// ■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고, rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16 ■ bool AB_After=true 추가 -- 2025-10-07 09:37 AB_After==true 이면, AP_RhsStd 의 뒤에 연결. AB_After==false 이면, AP_RhsStd 의 앞에 연결. ///////////////////////////////////////////////////////////*/ 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) { ZCLink::MakeRing(&AR_CutHead, &AR_CutTail); rhs.mp_HeadLink = &AR_CutHead ; rhs.mp_TailLink = &AR_CutTail ; } else if(AB_After) // AP_RhsStd 뒤에 삽입. { if(AP_RhsStd==0) // 맨 앞에 삽입. { ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink); ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink); rhs.mp_HeadLink = &AR_CutHead; } else { 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 // !AB_After : AP_RhsStd 앞에 삽입. { if(AP_RhsStd==0) // 맨 뒤에 삽입. { ZCLink::JoinLink(rhs.mp_TailLink, &AR_CutHead); ZCLink::MakeRing(rhs.mp_HeadLink, &AR_CutTail); rhs.mp_TailLink = &AR_CutTail; } else { ZCLink* VP_RhsStdPrev = AP_RhsStd->mp_PrevLink ; ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead); ZCLink::JoinLink(&AR_CutTail , AP_RhsStd ); if(AP_RhsStd==rhs.mp_HeadLink) { rhs.mp_HeadLink = &AR_CutHead; } } }/* else // !AB_After : AP_RhsStd 앞에 삽입.*/ rhs.ml_LinkSize += AL_CutSize; return rhs; }/* TypeThis& CutLinkRangeOut ########################################### ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , TypeThis& rhs , ZCLink* AP_RhsStd , bool AB_After=true ) #######################################################################*/ /*private:*/ public : ZtCLinkList() { mp_HeadLink=0; mp_TailLink=0; ml_LinkSize=0; }/* ZtCLinkList()*/ ZtCLinkList(const ZtCLinkList& rhs) { mp_HeadLink=0; mp_TailLink=0; ml_LinkSize=0; *this = rhs ; }/* ZtCLinkList(const ZtCLinkList& rhs)*/ ~ZtCLinkList() { DeleteAll(); }/* ~ZtCLinkList()*/ TypeThis& operator=(const TypeThis& 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_CutTail = mp_HeadLink->GetNextPrevPtr(VL_MinusSize-1); ZCLink* VP_CutTailNext = VP_CutTail->mp_NextLink ; RecvFreeIn //////////////////////////////////////// ( VL_MinusSize, mp_HeadLink, VP_CutTail ); /////////////////////////////////////////////////// mp_HeadLink = VP_CutTailNext; ml_LinkSize -= VL_MinusSize ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else if(VL_MinusSize<0) { ZCLink* VP_HeadLink=0; ZCLink* VP_TailLink=0; SendFreeOut //////////////////////////////////////// ( -VL_MinusSize , RR(VP_HeadLink) , RR(VP_TailLink) ); /////////////////////////////////////////////////// if(ml_LinkSize>0) { ZCLink::JoinLink(mp_TailLink, VP_HeadLink); ZCLink::MakeRing(mp_HeadLink, VP_TailLink); mp_TailLink = VP_TailLink ; } else { mp_HeadLink = VP_HeadLink ; mp_TailLink = VP_TailLink ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* else*/ ml_LinkSize += (-VL_MinusSize); }/* else if(VL_MinusSize<0)*/ ZCLink* VP_RhsLink = rhs.mp_HeadLink ; ZCLink* VP_LhsLink = mp_HeadLink ; __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; }/* TypeThis& operator=(const TypeThis& rhs)*/ TypeSize GetSize() const{return ml_LinkSize ;} TypeSize size () const{return ml_LinkSize ;} bool IsEmpty() const{return ml_LinkSize<1;} bool empty () const{return ml_LinkSize<1;} void DeleteAll() { if(ml_LinkSize<1) return; RecvFreeIn (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink =0 ; mp_TailLink =0 ; ml_LinkSize =0 ; }/* void DeleteAll()*/ void clear(){DeleteAll();} ZCDataOpt GetHeadOpt(){ return ZCDataOpt(mp_HeadLink); } ZCDataOpt GetTailOpt(){ return ZCDataOpt(mp_TailLink); } ZCDataOpt GetObjOpt(TypeSize AI_Index) { if(ml_LinkSize<1) return ZCDataOpt(0); return ZCDataOpt( (*mp_HeadLink)+(AI_Index-1) ); }/* 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(mp_HeadLink) ); } void DeleteTail() { if(ml_LinkSize<1) return; RecvFreeIn( &CutLink(mp_TailLink) ); } void Delete(ZCLink& AR_DelLink) { RecvFreeIn( &CutLink(AR_DelLink) ); }/* void Delete(ZCLink& AR_DelLink)*/ TypeThis& JoinAfter (TypeThis& rhs, ZCLink& AR_StdLink) { return JoinAfter (rhs, &AR_StdLink); } TypeThis& JoinBefore(TypeThis& rhs, ZCLink& AR_StdLink) { return JoinBefore(rhs, &AR_StdLink); } TypeThis& JoinHead(TypeThis& rhs){ return JoinAfter (rhs, 0); } TypeThis& JoinTail(TypeThis& rhs){ return JoinBefore(rhs, 0); } void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) { // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, &AR_StdLink); }/* void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) { // AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, &AR_StdLink); }/* void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) { // AR_CutLink 를 잘라서 rhs 의 앞에 연결한다. CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, 0); } void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) { // AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다. CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, 0); }/* void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)*/ TypeThis& SendRangeOut ////////////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ { return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), AB_After ); ////////////////////// }/* TypeThis& SendRangeOutAfter ///////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ TypeThis& SendRangeOutAfter ///////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), true ); ////////////////////// } TypeThis& SendRangeOutBefore //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 앞에 연결한다. return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), false ); ////////////////////// }/* TypeThis& SendRangeOutBefore //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ template void IterElement(TFunctor AO_Functor) { ZCLink* VP_LoopLink=mp_HeadLink; __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=mp_HeadLink; __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=mp_HeadLink; __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=mp_TailLink; __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 = mp_TailLink; __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 = mp_TailLink; __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 ZtCLinkList #######################################################*/ template ////////////////////////////////////////////////////////////////// < typename TCLink , typename TTypSize = ZTypLong , typename TTypeCRTP = ZNsType::ZtCTypeCRTP > class ZtCLinkMoveList /*#################################################*/ { public : typedef ZtCLinkMoveList TypeThis; public : typedef ZNsType::ZtCTypeNowCRTP /////////////////////////////////////// < TypeThis, 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)*/ TypeThis& JoinAfter (TypeThis& 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; }/* TypeThis& JoinAfter (TypeThis& rhs, ZCLink* AP_StdLink)*/ TypeThis& JoinBefore(TypeThis& 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; }/* TypeThis& JoinBefore(TypeThis& 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)*/ TypeThis& CutLinkRangeOut /*##########################################*/ ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , TypeThis& rhs , ZCLink* AP_RhsStd , bool AB_After=true ) /*#####################################################################*/ { /*/////////////////////////////////////////////////////////// ■ AR_CutHead 는 삭제하려는 링크의 범위의 앞의 링크. AR_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크. AR_CutHead 의 앞과 AR_CutTail 의 뒤에서 연결 상태를 끊고, rhs 의 AP_RhsStd 의 뒤에 삽입한다. AP_RhsStd==0 이면 맨 앞에 삽입한다. -- 2025-10-06 09:16 ■ bool AB_After=true 추가. -- 2025-10-07 09:26 AB_After==true 이면 AP_RhsStd 의 뒤에 삽입. AB_After==false 이면 AP_RhsStd 의 앞에 삽입. ///////////////////////////////////////////////////////////*/ 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; if(AB_After) { // 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); } else { // rhs 의 AP_RhsStd 의 앞에 삽입. // AP_RhsStd==0 이면 rhs 의 맨 뒤에 삽입. if(AP_RhsStd==0) AP_RhsStd=&rhs.mo_TailFake ; ZCLink* VP_RhsStdPrev=AP_RhsStd->mp_PrevLink; ZCLink::JoinLink(VP_RhsStdPrev, &AR_CutHead); ZCLink::JoinLink(&AR_CutTail , AP_RhsStd ); } rhs.ml_LinkSize += AL_CutSize; return rhs; }/* TypeThis& CutLinkRangeOut ############################################## ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , TypeThis& rhs , ZCLink* AP_RhsStd , bool AB_After=true ) #######################################################################*/ /*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()*/ TypeThis& operator=(const TypeThis& 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; }/* TypeThis& operator=(const TypeThis& rhs)*/ TypeSize GetSize() const{return ml_LinkSize ;} TypeSize size () const{return ml_LinkSize ;} bool IsEmpty() const{return ml_LinkSize<1;} bool empty () 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)*/ TypeThis& JoinAfter (TypeThis& rhs, ZCLink& AR_StdLink) { return JoinAfter (rhs, &AR_StdLink); } TypeThis& JoinBefore(TypeThis& rhs, ZCLink& AR_StdLink) { return JoinBefore(rhs, &AR_StdLink); } TypeThis& JoinHead(TypeThis& rhs){ return JoinAfter (rhs, 0); } TypeThis& JoinTail(TypeThis& rhs){ return JoinBefore(rhs, 0); } void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) { // AR_CutLink 를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, &AR_StdLink); }/* void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink) { // AR_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, &AR_StdLink); }/* void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLink& AR_StdLink)*/ void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) { // AR_CutLink 를 잘라서 rhs 의 앞에 연결한다. CutLink(AR_CutLink); rhs.JoinAfter (AR_CutLink, 0); } void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) { // AR_CutLink 를 잘라서 rhs 의 뒤에 연결한다. CutLink(AR_CutLink); rhs.JoinBefore(AR_CutLink, 0); }/* void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs)*/ TypeThis& SendRangeOut ////////////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ { return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), AB_After ); ////////////////////// }/* TypeThis& SendRangeOut ////////////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ TypeThis& SendRangeOutAfter ///////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), true ); ////////////////////// } TypeThis& SendRangeOutBefore //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 앞에 연결한다. return CutLinkRangeOut ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), false ); ////////////////////// }/* TypeThis& SendRangeOutBefore //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& 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*/ #endif //__ZCPPMAIN__ZTCLINKLIST_H__