#ifndef __ZCPPMAIN__ZTCOBJLIST_H__ #define __ZCPPMAIN__ZTCOBJLIST_H__ #include "ZCppMain/ZMainHead.H" namespace ZNsMain { template ////////////////////////////////////////////////////// < typename TType , typename TTypArgu , typename TTypCAlloc , typename TTypeInit , typename TTypSize , typename TMoveObj , typename TFeeeHeap > class ZtCObjList; ///////////////////////////////////////////// namespace ZNsIFaceEx { template<> class ZtCFreeHeapCDL< ZNsConst::CI_ListKind_Double > { public: template class ZtCBody { public : typedef typename TObjList::TypeSize TypeSize; typedef typename TObjList::TypeInit TypeInit; typedef typename TObjList::ZCLink ZCLink ; public : template ////////////////////////////////////////////////////// < typename TType , typename TTypArgu , typename TTypCAlloc , typename TTypeInit , typename TTypSize , typename TMoveObj , typename TFeeeHeap > friend class ZNsMain::ZtCObjList; ///////////////////////////// private: TypeSize ml_UseSize ; ZCLink* mp_NoUseHead ; ZCLink* mp_NoUseTail ; private: ZCLink* SendFreeOut() { if(ml_UseSize==0) { ZCLink* VP_TempLink = new ZCLink ; if(TypeInit::ZEUseInit>0) TypeInit::OnInit(*VP_TempLink, *this); return VP_TempLink; }/* if(ml_UseSize==0)*/ ZCLink* VP_TempLink=mp_NoUseHead; if(VP_TempLink==mp_NoUseTail) { mp_NoUseHead=0; mp_NoUseTail=0; } else { mp_NoUseHead = mp_NoUseHead->GetNextPtr(); } //else --ml_UseSize; return VP_TempLink; }/* ZCLink* SendFreeOut()*/ void SendFreeOut /*#####################################################*/ ( TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ) /*######################################################################*/ { if(mp_NoUseHead==0) { MakeLink(AL_NeedCnt, RR(APR_HeadLink), RR(APR_TailLink)); } else if(AL_NeedCnt==ml_UseSize) { ZCLink* VP_Temp = mp_NoUseHead; while(true) { if(TypeInit::ZEUseInit>0) TypeInit::OnInit(**VP_Temp, *this); if(VP_Temp==mp_NoUseTail) { break; } VP_Temp = VP_Temp->GetNextPtr(); }/* while(true)*/ APR_HeadLink = mp_NoUseHead ; APR_TailLink = mp_NoUseTail ; mp_NoUseHead =0 ; mp_NoUseTail =0 ; ml_UseSize =0 ; } else if(AL_NeedCnt0) TypeInit::OnInit(**mp_NoUseHead, *this); for(TypeSize VL_Count=2; VL_Count<=AL_NeedCnt; ++VL_Count) { // VL_Count 가 2 부터 시작함으로 AL_NeedCnt-1 번 순환한다. // 그래야지 AL_NeedCnt 개의 링크를 자를 수 있다. mp_NoUseHead = mp_NoUseHead->GetNextPtr(); if(TypeInit::ZEUseInit>0) TypeInit::OnInit(**mp_NoUseHead, *this); }/* for(TypeSize VL_Count=2; VL_Count<=AL_NeedCnt; ++VL_Count)*/ APR_TailLink = mp_NoUseHead ; mp_NoUseHead = mp_NoUseHead->GetNextPtr(); ml_UseSize -= AL_NeedCnt ; } else // AL_NeedCnt > ml_UseSize { ZCLink* VP_Temp=mp_NoUseHead; while(true) { if(VP_Temp==mp_NoUseTail) { break; } VP_Temp=VP_Temp->GetNextPtr() ; }/* while(true)*/ APR_HeadLink = mp_NoUseHead; // MakeLink() 에서 TypeInit::OnInit() 가 호출됨. MakeLink /////////////////////////////////////// ( AL_NeedCnt - ml_UseSize , RR(mp_NoUseTail->mp_NextLink) , RR(APR_TailLink) ); //////////////////////////////////////////////// mp_NoUseHead= 0 ; mp_NoUseTail= 0 ; ml_UseSize = 0 ; }/* else // AL_NeedCnt > ml_UseSize*/ }/* void SendFreeOut ######################################################## ( TypeSize AL_NeedCnt, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ) ########################################################################*/ void SendFreeOutCopy /*////////////////////////////*/ ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy ) /*/////////////////////////////////////////////////*/ { /*////////////////////////////////////////////////////////////////////// ■ AL_FarNum > 0 AP_LinkOrgin 링크부터, AP_LinkOrgin 에서 AL_FarNum 만큼 떨어진 링크까 지를 복사하여 복사 생성된 처음 링크 포인터를 APR_HeadCopy 에, 마지막 링크 포인터를 APR_TailCopy 에 대입한다. AP_LinkOrgin 링크에서 그 다음 링크로 접근하면서 링크를 복사 할 것이다. 따라서 총 AL_FarNum + 1 개의 링크가 만들어진다. 이 함수는 각 링크를 새로 생성하는 MakeLinkCopy() 함수와는 달리, 기존 에 있는 ml_UseSize 개의 링크를 먼저 사용한다. //////////////////////////////////////////////////////////////////////*/ if(mp_NoUseHead==0) { MakeLinkCopy ///////////////////////////// ( AP_LinkOrgin , AL_FarNum , RR(APR_HeadCopy), RR(APR_TailCopy) ); ////////////////////////////////////////// } else if( AL_FarNum < ml_UseSize) // ( (AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 <= ml_UseSize) { ml_UseSize -= AL_FarNum+1 ; **mp_NoUseHead = **AP_LinkOrgin ; APR_HeadCopy = mp_NoUseHead ; while(--AL_FarNum>=0) { mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; AP_LinkOrgin = AP_LinkOrgin->GetNextPtr() ; **mp_NoUseHead = **AP_LinkOrgin ; } //while(--AL_FarNum>=0) APR_TailCopy = mp_NoUseHead ; // 이 부분에서 mp_NoUseHead 는 잘려나가는 마지막 링크가 된다. // 그러므로 다시 다음 링크로 초기화한다. mp_NoUseHead = mp_NoUseHead->GetNextPtr(); if(mp_NoUseHead==0) { mp_NoUseTail=0; // mp_NoUseHead == 0 인데 mp_NoUseTail !=0 이라면 // 나중에 자칫 무한루프에 빠질 수 있다. // 따라서 위 코드를 두었다. }/* if(mp_NoUseHead==0)*/ } else // AL_FarNum > ml_UseSize { **mp_NoUseHead = **AP_LinkOrgin ; APR_HeadCopy = mp_NoUseHead ; while(mp_NoUseHead!=mp_NoUseTail) { mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; AP_LinkOrgin = AP_LinkOrgin->GetNextPtr() ; **mp_NoUseHead = **AP_LinkOrgin ; }/* while(mp_NoUseHead!=mp_NoUseTail)*/ MakeLinkCopy /*++++++++++++++++++++++++++++++++++++++++++++*/ ( AP_LinkOrgin->GetNextPtr() , AL_FarNum-ml_UseSize, RR(mp_NoUseTail->mp_NextLink), RR(APR_TailCopy) ); /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ mp_NoUseHead = mp_NoUseTail = 0; ml_UseSize = 0; } //else // AL_FarNum > ml_UseSize }/* void SendFreeOutCopy //////////////////////////////// ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy ) ///////////////////////////////////////////////////*/ void MakeLink /////////////////////////////////////// ( TypeSize AL_MakeSize , ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ) const ///////////////////////////////////////////////////*/ { APR_HeadLink = new ZCLink; if(APR_HeadLink==0) { // add codes for memory over return; }/* if(APR_HeadLink==0)*/ if(TypeInit::ZEUseInit>0) TypeInit::OnInit(**APR_HeadLink, *this); ZCLink* VP_MakeLink = 0 ; ZCLink* VP_TempLink = APR_HeadLink; bool VB_IsHeapOver= false ; /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ■ bool VB_IsHeapOver 은 new 연산자가 NULL 포인터를 반환했을 때 true 를 대입받는다. 이 값을 조사함으로써 heap overflow 를 처리한다. bool VB_IsHeapOver 변수를 두지 않고 아래 for 문에서 직접 메모리 처리 를 하는 코드를 둘 수 있으나, for 문 안에 if 문 속에서 또 for 문을 써 야 함으로 가독성이 떨어질 수가 있다. 그래서 heap over 에 대한 예외처 리 코드를 for 문 바깥으로 빼려는 것이다. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ while(--AL_MakeSize>0) // AL_MakeSize - 1 번 순환 { // AL_MakeSize - 1 번 순환 VP_MakeLink = new ZCLink; if(VP_MakeLink==0) { VB_IsHeapOver = true; break; }/* if(VP_MakeLink==0)*/ if(TypeInit::ZEUseInit>0) TypeInit::OnInit(**VP_MakeLink, *this); ZCLink::JoinLink (VP_TempLink, VP_MakeLink); VP_TempLink = VP_MakeLink ; }/* while(--AL_MakeSize>0)*/ APR_TailLink = VP_TempLink; // 메모리를 더 이상 할당할 수 없었다면 // 이미 만들어진 VL_Count 개의 비원형 이중 링크를 지운다. if(VB_IsHeapOver==true) { VP_TempLink=APR_HeadLink; // 이 시점에서 최소한 APR_HeadLink 하나는 // heap 에 생성되어 있다. do ////// { delete VP_TempLink; if(VP_TempLink==APR_TailLink) { // Add extra codes for memory over return; }/* if(VP_TempLink==APR_TailLink)*/ APR_HeadLink=APR_HeadLink->GetNextPtr(); } while(true); }/* if(VB_IsHeapOver==true)*/ }/* void MakeLink /////////////////////////////////////// ( TypeSize AL_MakeSize , ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ) const ///////////////////////////////////////////////////*/ void MakeLinkCopy /////////////////////////////////// ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy ) const ///////////////////////////////////////////////////*/ { /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ■ AP_LinkOrgin 링크부터, AP_LinkOrgin 에서 AL_FarNum 만큼 떨어진 링크까 지를 복사하여, 복사 생성된 처음 링크 포인터를 APR_HeadCopy 에, 마지막 링크 포인터를 APR_TailCopy 에 대입한다. AL_FarNum > 0 , 총 AL_FarNum + 1 개의 링크가 만들어진다. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ ZCLink* VP_MakeLink = 0 ; ZCLink* VP_TailLink = 0 ; bool VB_IsHeapOver= false; VP_TailLink = VP_MakeLink = new ZCLink(**AP_LinkOrgin) ; if(VP_MakeLink==0) { //add codes for memory over DeleteHeap(); return ; }/* if(VP_MakeLink==0)*/ APR_HeadCopy = VP_MakeLink; while(--AL_FarNum >= 0) { AP_LinkOrgin= AP_LinkOrgin->GetNextPtr() ; VP_MakeLink = new ZCLink(**AP_LinkOrgin) ; if(VP_MakeLink==0) { APR_TailCopy = VP_TailLink ; VB_IsHeapOver= true ; break; }/* if(VP_MakeLink==0)*/ ZCLink::JoinLink (VP_TailLink, VP_MakeLink); VP_TailLink = VP_MakeLink; }/* while(--AL_FarNum >= 0)*/ APR_TailCopy=VP_TailLink; // 메모리를 더 이상 할당할 수 없었다면 // 이미 만들어진 비원형 이중 링크를 지운다. if(VB_IsHeapOver==true) { do ////// { delete APR_HeadCopy; if(APR_HeadCopy==APR_TailCopy) { DeleteHeap(); return; }/* if(APR_HeadCopy==APR_TailCopy)*/ APR_HeadCopy = APR_HeadCopy->mp_NextLink; } while(true); }/* if(VB_IsHeapOver==true)*/ }/* void MakeLinkCopy /////////////////////////////////// ( ZCLink* AP_LinkOrgin, TypeSize AL_FarNum, ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy ) const ///////////////////////////////////////////////////*/ void RecvFreeIn(ZCLink* AP_CutLink) { if(++ml_UseSize==1) // ml_UseSize 이 0 일때 { mp_NoUseHead = mp_NoUseTail = AP_CutLink ; } else { // 새로운 링크는 mp_NoUseTail 다음에 붙인다. ZCLink::JoinLink (mp_NoUseTail, AP_CutLink); mp_NoUseTail = AP_CutLink; } //else if(TypeInit::ZEUseFini>0) TypeInit::OnFini(**AP_CutLink, *this); }/* void RecvFreeIn(ZCLink* AP_Link)*/ void RecvFreeIn /////////////////////////////////////////////////// ( TypeSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink ) /////////////////////////////////////////////////////////////////// { if(TypeInit::ZEUseFini>0) { ZCLink* VP_NowLink = AP_HeadLink; __for1(TypeSize, i, AL_Count) { TypeInit::OnFini(**VP_NowLink, *this) ; VP_NowLink = VP_NowLink->GetNextPtr() ; } /*=========================*/ }/* if(TypeInit::ZEUseFini>0)*/ if(ml_UseSize==0) { mp_NoUseHead = AP_HeadLink ; mp_NoUseTail = AP_TailLink ; } else { // 새로운 링크는 mp_NoUseTail 다음에 붙인다. ZCLink::JoinLink (mp_NoUseTail, AP_HeadLink); mp_NoUseTail = AP_TailLink; } //else ml_UseSize += AL_Count ; }/* void RecvFreeIn /////////////////////////////////////////////////// ( TypeSize AL_Count, ZCLink* AP_HeadLink, ZCLink* AP_TailLink ) /////////////////////////////////////////////////////////////////*/ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ private : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ public : ZtCBody() { ml_UseSize = 0 ; mp_NoUseHead = mp_NoUseTail = 0 ; }/* ZtCBody()*/ ~ZtCBody() { DeleteHeap(); }/* ~ZtCBody()*/ ZtCBody(const ZtCBody& rhs) { ml_UseSize = 0 ; mp_NoUseHead = mp_NoUseTail = 0 ; }/* ZtCBody(const ZtCBody& rhs)*/ ZtCBody& operator=(const ZtCBody& rhs) { return *this; }/* ZtCBody& operator=(const ZtCBody& rhs)*/ void DeleteHeap() { if(ml_UseSize<1) return ; ZCLink* VP_DelLink = mp_NoUseHead; TypeSize VI_UseSize = ml_UseSize ; do /*++++++++++++++++++++++++++++*/ { mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; delete VP_DelLink; VP_DelLink = mp_NoUseHead ; } while(--VI_UseSize>0); /*++++++++*/ ml_UseSize = 0 ; mp_NoUseHead = mp_NoUseTail = 0 ; }/* void DeleteHeap()*/ TypeSize DeleteHeap(TypeSize AI_DelCnt) { if(ml_UseSize<1) return 0; if(AI_DelCnt <1) return 0; if(AI_DelCnt >= size()) { AI_DelCnt=size(); DeleteHeap(); return AI_DelCnt; }/* if(AI_DelCnt >= size())*/ TypeSize VI_DelCntCopy = AI_DelCnt ; ZCLink* VP_DelLink = mp_NoUseHead ; do /*+++++++++++++++++++++++++++*/ { mp_NoUseHead = mp_NoUseHead->GetNextPtr() ; delete VP_DelLink; VP_DelLink = mp_NoUseHead ; } while(--VI_DelCntCopy>0); /*++++*/ ml_UseSize -= AI_DelCnt; return AI_DelCnt; }/* TypeSize DeleteHeap(TypeSize AI_DelCnt)*/ void AddHeap(TypeSize AI_AddCnt) { if(AI_AddCnt<1) return; if(size() < 1) { MakeLink (AI_AddCnt, RR(mp_NoUseHead), RR(mp_NoUseTail)); } else { ZCLink* VP_MakeHead = 0; ZCLink* VP_MakeTail = 0; MakeLink (AI_AddCnt, RR(VP_MakeHead), RR(VP_MakeTail)); ZCLink::JoinLink(mp_NoUseTail, VP_MakeHead); mp_NoUseTail = VP_MakeTail ; }/* else*/ ml_UseSize += AI_AddCnt; }/* void AddHeap(TypeSize AI_AddCnt)*/ void Fetch(ZtCBody& rhs) { if(this==&rhs ) return; if(rhs.size()<1) return; if(this->size()<1) this->mp_NoUseHead = rhs.mp_NoUseHead; else { ZCLink::JoinLink (this->mp_NoUseTail, rhs.mp_NoUseHead); } this->mp_NoUseTail = rhs.mp_NoUseTail; this->ml_UseSize += rhs.ml_UseSize ; rhs.ml_UseSize = 0 ; rhs.mp_NoUseHead = 0 ; rhs.mp_NoUseTail = 0 ; }/* void Fetch(ZtCBody& rhs)*/ TypeSize Fetch(ZtCBody& rhs, TypeSize AI_FetchSize) { // rhs 의 앞에서 AI_FetchSize 개를 가져온다. if(this==&rhs ) return 0; if(AI_FetchSize<1 ) return 0; if(rhs.size() <1 ) return 0; if(AI_FetchSize>= rhs.size()) { AI_FetchSize = rhs.size(); Fetch(rhs); return AI_FetchSize; }/* if(AI_FetchSize>= rhs.size())*/ ZCLink* VP_RhsCutTail = rhs.mp_NoUseHead->GetNextPtr( AI_FetchSize-1 ) ; ZCLink* VP_RhsNewHead = VP_RhsCutTail->GetNextPtr( ); if(ml_UseSize<1) { // mp_NoUseHead, mp_NoUseTail 이 0 this->mp_NoUseHead = rhs.mp_NoUseHead ; } else { // mp_NoUseHead 고정. ZCLink::JoinLink (this->mp_NoUseTail, rhs.mp_NoUseHead); } this->ml_UseSize += AI_FetchSize ; this->mp_NoUseTail = VP_RhsCutTail; rhs. ml_UseSize -= AI_FetchSize ; rhs. mp_NoUseHead = VP_RhsNewHead; return AI_FetchSize; }/* TypeSize Fetch(ZtCBody& rhs, TypeSize AI_FetchSize)*/ void MakeEqual(ZtCBody& rhs) { // 갯수만 맞춘다. if(this==&rhs) return; if(this->size() > rhs.size()) DeleteHeap( this->size() - rhs. size() ); else AddHeap ( rhs. size() - this->size() ); }/* void MakeEqual(ZtCBody& rhs)*/ TypeSize GetUseHeapSize() const { return ml_UseSize; }/* TypeSize GetUseHeapSize() const*/ TypeSize size() const { return ml_UseSize; }/* TypeSize size() const*/ public: };/* template class ZtCBody*/ public: };/* template<> class ZtCFreeHeapCDL< ZNsConst::CI_ListKind_Double >*/ }/* namespace ZNsIFaceEx*/ /*///////////////////////////////////////////////////////////////// ■ typename TTypeInit 는 별다른 역할을 하지 않고 있다. 다른 리스트 클래스와 템플릿 인수를 비슷하게 맞추기 위해, 그리고 차후의 설계 를 위해 일단 이대로 두자. ■ typename ZtCInit 가 필요한지 모르겠다. 일단 주석으로 막는다. -- 2025-08-11 14:47 ZtCTreeData.H 에서 ZtCObjList<> 에서 TTypeInit 자리에 형을 지정 하고 있다. 쓰긴 쓰니까 주석을 해제하자. -- 2025-08-14 13:43 아, 일종의 TType 생성자의 다형성을 위해서 필요하겠네. 생성자에는 가상 함수가 없으니까. -- 2025-10-03 19:15 /////////////////////////////////////////////////////////////////*/ template class ZtCSortObjList; template< typename TType /////////////////////////////////////////////////// , typename TTypArgu = const TType& , typename TTypCAlloc = ZCAllocator , typename TTypeInit = ZtCInit , typename TTypSize = ZTypLong , typename TMoveObj = ZtCMoveObj , typename TFeeeHeap = ZNsIFaceEx:: ZtCFreeHeapCDL< ZNsConst::CI_ListKind_Double > > class ZtCObjList ////////////////////////////////////////////////////////////// { public: class ZCLink ; class ZCNodePoint ; class ZCNodePointN ; public: template friend class ZtCSortObjList; /*********************************************************************/ typedef ZtCObjOpt ZCLinkOpt ; typedef ZtCObjOpt ZCDataOpt ; /*********************************************************************/ typedef TType Type ; typedef TType TypeData ; typedef TTypArgu TypeArg ; typedef TTypCAlloc TypeAlloc ; typedef TTypeInit TypeInit ; typedef TTypSize TypeSize ; typedef TMoveObj TypeMoveObj ; typedef ZtCObjList TypeThis ; typedef ZCLink TypeLink ; typedef ZCLink TypeNode ; // ZCNodePoint::GetNode() 의 반환형. typedef TypeThis TypeList ; typedef ZCLink* IterEasy ; // 가장 간단하게 쓰일 수 있는 반복자. typedef ZCNodePoint TypeIter ; typedef ZCNodePointN TypeIterN ; /*********************************************************************/ typedef ZCNodePoint iterator ; // 다양한 기능을 가진 반복자. typedef ZCNodePointN const_iterator; /*********************************************************************/ typedef const TypeThis TypeThisC ; typedef const TypeList TypeListC ; typedef const TypeData TypeDataC ; typedef const TypeLink TypeLinkC ; typedef const TypeNode TypeNodeC ; // ZCNodePoint::GetNode() const 의 반환형. typedef const ZCLink ZCLinkC ; typedef const ZCLinkOpt ZCLinkOptC ; typedef const ZCDataOpt ZCDataOptC ; typedef const ZCLink* IterEasyC ; typedef ZCNodePointN iteratorN ; /*********************************************************************/ typedef typename TFeeeHeap:: template ZtCBody ZCFreeHeap; /*********************************************************************/ public: class ZCLink : public TypeAlloc { public : template friend class ZtCSortObjList; /*++++++++++++++++++++++++++*/ friend class ZtCObjList ; public : template friend class ZNsIFaceEx::ZtCFreeHeapCDL ; private: ZCLink* mp_NextLink; ZCLink* mp_PrevLink; TypeData mo_DataObjt; private: static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink) { AP_PrevLink->mp_NextLink=AP_NextLink; AP_NextLink->mp_PrevLink=AP_PrevLink; }/* static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)*/ static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink) { AP_HeadLink->mp_PrevLink=AP_TailLink; AP_TailLink->mp_NextLink=AP_HeadLink; }/* static void MakeRing(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/ private: /******************************************************************/ public : ZCLink() { mp_NextLink =0 ; mp_PrevLink =0 ; }/* ZCLink()*/ ZCLink(TypeArg AR_Type) { mp_NextLink = 0 ; mp_PrevLink = 0 ; mo_DataObjt = AR_Type ; }/* ZCLink(TypeArg AR_Type)*/ ZCLink(const ZCLink& rhs) { mp_NextLink =0 ; mp_PrevLink =0 ; mo_DataObjt = rhs.mo_DataObjt ; }/* ZCLink(const ZCLink& rhs)*/ ZCLink& operator=(const ZCLink& rhs) { mo_DataObjt = rhs.mo_DataObjt; return *this; }/* ZCLink& operator=(const ZCLink& rhs)*/ operator TypeData & () {return mo_DataObjt;} operator TypeData () {return mo_DataObjt;} operator TypeDataC& () const{return mo_DataObjt;} TypeData & GetData () {return mo_DataObjt;} TypeData & operator* () {return mo_DataObjt;} TypeData & operator()() {return mo_DataObjt;} TypeDataC& GetData () const{return mo_DataObjt;} TypeDataC& operator* () const{return mo_DataObjt;} TypeDataC& operator()() const{return mo_DataObjt;} ZCLink * GetNextPrevPtr(TypeSize AL_FarNum) // AL_FarNum 은 0 이거나 음수일 수 있다. { ZCLink* VP_TmpLink = this; if(AL_FarNum>=0) { while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } else // AL_FarNum<0 인 경우. { while(++AL_FarNum<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }/* else*/ return VP_TmpLink; }/* ZCLink * GetNextPrevPtr(TypeSize AL_FarNum)*/ ZCLinkC* GetNextPrevPtr(TypeSize AL_FarNum) const // or ZCLink const * const GetNextPrevPtr(TypeSize AL_FarNum) const { ZCLinkC* VP_TmpLink = this; if(AL_FarNum>=0) { while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; } else // AL_FarNum<0 인 경우. { while(++AL_FarNum<=0) VP_TmpLink=VP_TmpLink->mp_PrevLink; }/* else*/ return VP_TmpLink; }/* ZCLinkC* GetNextPrevPtr(TypeSize AL_FarNum) const*/ ZCLink * GetNextPtr() {return mp_NextLink;} ZCLink * GetPrevPtr() {return mp_PrevLink;} ZCLinkC* GetNextPtr() const{return mp_NextLink;} ZCLinkC* GetPrevPtr() const{return mp_PrevLink;} ZCLink* GetNextPtr(TypeSize AL_Distance) { TypeSize VL_LoopIndex=0 ; ZCLink* VP_TmpLink =this; while(VL_LoopIndex++ < AL_Distance) VP_TmpLink = VP_TmpLink->mp_NextLink ; return VP_TmpLink; }/* ZCLink* GetNextPtr(TypeSize AL_Distance)*/ ZCLink* GetPrevPtr(TypeSize AL_Distance) { TypeSize VL_LoopIndex=0 ; ZCLink* VP_TmpLink =this; while(VL_LoopIndex++ < AL_Distance) VP_TmpLink = VP_TmpLink->mp_PrevLink ; return VP_TmpLink; }/* ZCLink* GetPrevPtr(TypeSize AL_Distance)*/ ZCLinkC* GetNextPtr(TypeSize AL_Distance) const { TypeSize VL_LoopIndex= 0 ; ZCLinkC* VP_TmpLink = this ; while(VL_LoopIndex++ < AL_Distance) VP_TmpLink = VP_TmpLink->mp_NextLink ; return VP_TmpLink; }/* ZCLinkC* GetNextPtr(TypeSize AL_Distance) const*/ ZCLinkC* GetPrevPtr(TypeSize AL_Distance) const { TypeSize VL_LoopIndex= 0 ; ZCLinkC* VP_TmpLink = this ; while(VL_LoopIndex++ < AL_Distance) VP_TmpLink = VP_TmpLink->mp_PrevLink ; return VP_TmpLink; }/* ZCLinkC* GetPrevPtr(TypeSize AL_Distance) const*/ ZCLink & operator+(TypeSize AL_Distance) { if(AL_Distance>=0) return *GetNextPtr(AL_Distance); else return *GetPrevPtr(AL_Distance); }/* ZCLink & operator+(TypeSize AL_Distance)*/ ZCLink & operator-(TypeSize AL_Distance) { if(AL_Distance>=0) return *GetPrevPtr(AL_Distance); else return *GetNextPtr(AL_Distance); }/* ZCLink & operator-(TypeSize AL_Distance)*/ ZCLinkC& operator+(TypeSize AL_Distance) const { if(AL_Distance>=0) return *GetNextPtr(AL_Distance); else return *GetPrevPtr(AL_Distance); }/* ZCLinkC& operator+(TypeSize AL_Distance) const*/ ZCLinkC& operator-(TypeSize AL_Distance) const { if(AL_Distance>=0) return *GetPrevPtr(AL_Distance); else return *GetNextPtr(AL_Distance); }/* ZCLinkC& operator-(TypeSize AL_Distance) const*/ public: };/* class ZCLink*/ class ZCNodePoint { protected: /*****/ TypeList& mr_CurrList; mutable TypeLink* mp_CurrLink; // 사실상 mp_CurrLink!=0 mutable TypeSize ml_CurrPos ; public : ZCNodePoint(TypeList& AR_TypeList) : mr_CurrList(AR_TypeList) { mp_CurrLink = AR_TypeList.HeadPtr(); ml_CurrPos = 1 ; } ZCNodePoint(const ZCNodePoint& rhs) : mr_CurrList(rhs.mr_CurrList), mp_CurrLink(rhs.mp_CurrLink), ml_CurrPos (rhs.ml_CurrPos ) {} public : static ZCNodePoint MakeTailPoint(TypeList& AR_TypeList) { ZCNodePoint VO_ZCLinkPoint(AR_TypeList); VO_ZCLinkPoint.mp_CurrLink = AR_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = AR_TypeList.ml_LinkSize; return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePoint MakeTailPoint(TypeList& AR_TypeList)*/ static ZCNodePoint MakeTailPoint(const TypeIter& AR_TypeIter) { ZCNodePoint VO_ZCLinkPoint(AR_TypeIter); VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize; return VO_ZCLinkPoint; /****************************/ }/* static ZCNodePoint MakeTailPoint(const TypeIter& AR_TypeIter)*/ public : TypeThis & GetMain() {return mr_CurrList;} TypeNode & GetNode() {return *mp_CurrLink;} TypeThisC& GetMain() const{return mr_CurrList;} TypeNodeC& GetNode() const{return *mp_CurrLink;} /***************************************************/ TypeSize GetPos () const{return ml_CurrPos ;} /***************************************************/ bool IsValid() const{return mr_CurrList.size()>0;} bool IsEmpty() const{return mr_CurrList.size()<1;} ZCNodePoint& operator= (const ZCNodePoint& rhs){ return *this; } TypeData & operator*() {return **mp_CurrLink;} TypeDataC& operator*() const{return **mp_CurrLink;} operator TypeLink * () {return mp_CurrLink;} operator TypeLinkC* () const{return mp_CurrLink;} operator TypeLink & () {return *mp_CurrLink;} operator TypeLinkC& () const{return *mp_CurrLink;} bool operator == (const ZCNodePoint& rhs) const { return ml_CurrPos == rhs.ml_CurrPos; } bool operator != (const ZCNodePoint& rhs) const { return ml_CurrPos != rhs.ml_CurrPos; } bool operator > (const ZCNodePoint& rhs) const { return ml_CurrPos > rhs.ml_CurrPos; } bool operator >= (const ZCNodePoint& rhs) const { return ml_CurrPos >= rhs.ml_CurrPos; } bool operator < (const ZCNodePoint& rhs) const { return ml_CurrPos < rhs.ml_CurrPos; } bool operator <= (const ZCNodePoint& rhs) const { return ml_CurrPos <= rhs.ml_CurrPos; } bool operator == (TypeSize AL_Size) const { return ml_CurrPos == AL_Size; } bool operator != (TypeSize AL_Size) const { return ml_CurrPos != AL_Size; } bool operator > (TypeSize AL_Size) const { return ml_CurrPos > AL_Size; } bool operator >= (TypeSize AL_Size) const { return ml_CurrPos >= AL_Size; } bool operator < (TypeSize AL_Size) const { return ml_CurrPos < AL_Size; } bool operator <= (TypeSize AL_Size) const { return ml_CurrPos <= AL_Size; } const ZCNodePoint& operator++() const { mp_CurrLink = mp_CurrLink->mp_NextLink; ++ml_CurrPos; return *this ; }/* const ZCNodePoint& operator++() const*/ const ZCNodePoint& operator--() const { mp_CurrLink = mp_CurrLink->mp_PrevLink; --ml_CurrPos; return *this ; }/* const ZCNodePoint& operator--() const*/ ZCNodePoint operator++(int) const { ZCNodePoint VO_NowPoint(*this); mp_CurrLink = mp_CurrLink->mp_NextLink; ++ml_CurrPos ; return VO_NowPoint ; }/* ZCNodePoint operator++(int) const*/ ZCNodePoint operator--(int) const { ZCNodePoint VO_NowPoint(*this); mp_CurrLink = mp_CurrLink->mp_PrevLink; --ml_CurrPos; return VO_NowPoint ; }/* ZCNodePoint operator--(int) const*/ const ZCNodePoint& operator+=(TypeSize AL_Distance) const { if(IsEmpty()){return *this;} mp_CurrLink = &((*mp_CurrLink)+AL_Distance) ; ml_CurrPos += AL_Distance ; return *this; /*:::::::::::::::::::::::::::*/ }/* const ZCNodePoint& operator+=(TypeSize AL_Distance) const*/ const ZCNodePoint& operator-=(TypeSize AL_Distance) const { mp_CurrLink = &((*mp_CurrLink)-AL_Distance); ml_CurrPos -= AL_Distance ; return *this; /*::::::::::::::::::::::::::*/ }/* const ZCNodePoint& operator-=(TypeSize AL_Distance) const*/ public: };/* class ZCNodePoint*/ class ZCNodePointN { protected: const TypeList& mr_CurrList; mutable TypeLinkC* mp_CurrLink; // 사실상 mp_CurrLink!=0 mutable TypeSize ml_CurrPos ; public : ZCNodePointN(const TypeList& AR_TypeList) : mr_CurrList(AR_TypeList) { mp_CurrLink = AR_TypeList.HeadPtr(); ml_CurrPos = 1 ; } ZCNodePointN(const ZCNodePoint & rhs) : mr_CurrList( rhs.GetMain()), mp_CurrLink(&rhs.GetNode()), ml_CurrPos ( rhs.GetPos ()) {} ZCNodePointN(const ZCNodePointN& rhs) : mr_CurrList(rhs.mr_CurrList), mp_CurrLink(rhs.mp_CurrLink), ml_CurrPos (rhs.ml_CurrPos ) {} public : static ZCNodePointN MakeTailPoint(const TypeList& AR_TypeList) { ZCNodePointN VO_ZCLinkPoint(AR_TypeList); VO_ZCLinkPoint.mp_CurrLink = AR_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = AR_TypeList.ml_LinkSize; return VO_ZCLinkPoint; /****************/ }/* static ZCNodePointN MakeTailPoint(const TypeList& AR_TypeList)*/ static ZCNodePointN MakeTailPoint(const ZCNodePoint& AR_TypeIter) { ZCNodePointN VO_ZCLinkPoint(AR_TypeIter); VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize; return VO_ZCLinkPoint; /****************/ }/* static ZCNodePointN MakeTailPoint(const ZCNodePoint& AR_TypeIter)*/ static ZCNodePointN MakeTailPoint(const ZCNodePointN& AR_TypeIter) { ZCNodePointN VO_ZCLinkPoint(AR_TypeIter); VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize; return VO_ZCLinkPoint; /****************/ }/* static ZCNodePointN MakeTailPoint(const ZCNodePointN& AR_TypeIter)*/ public : TypeThisC& GetMain() const{return mr_CurrList;} TypeNodeC& GetNode() const{return *mp_CurrLink;} /***************************************************/ TypeSize GetPos () const{return ml_CurrPos ;} /***************************************************/ bool IsValid() const{return mr_CurrList.size()>0;} bool IsEmpty() const{return mr_CurrList.size()<1;} ZCNodePointN& operator= (const ZCNodePointN& rhs){ return *this; } TypeDataC& operator*() const{return **mp_CurrLink;} operator TypeNodeC* () const{return mp_CurrLink;} operator TypeNodeC& () const{return *mp_CurrLink;} operator TypeNode * () const{return 0 ;} bool operator == (const ZCNodePointN& rhs) const { return ml_CurrPos == rhs.ml_CurrPos; } bool operator != (const ZCNodePointN& rhs) const { return ml_CurrPos != rhs.ml_CurrPos; } bool operator > (const ZCNodePointN& rhs) const { return ml_CurrPos > rhs.ml_CurrPos; } bool operator >= (const ZCNodePointN& rhs) const { return ml_CurrPos >= rhs.ml_CurrPos; } bool operator < (const ZCNodePointN& rhs) const { return ml_CurrPos < rhs.ml_CurrPos; } bool operator <= (const ZCNodePointN& rhs) const { return ml_CurrPos <= rhs.ml_CurrPos; } bool operator == (TypeSize AL_Size) const { return ml_CurrPos == AL_Size; } bool operator != (TypeSize AL_Size) const { return ml_CurrPos != AL_Size; } bool operator > (TypeSize AL_Size) const { return ml_CurrPos > AL_Size; } bool operator >= (TypeSize AL_Size) const { return ml_CurrPos >= AL_Size; } bool operator < (TypeSize AL_Size) const { return ml_CurrPos < AL_Size; } bool operator <= (TypeSize AL_Size) const { return ml_CurrPos <= AL_Size; } const ZCNodePointN& operator++() const { mp_CurrLink = mp_CurrLink->mp_NextLink; ++ml_CurrPos; return *this ; }/* const ZCNodePointN& operator++() const*/ const ZCNodePointN& operator--() const { mp_CurrLink = mp_CurrLink->mp_PrevLink; --ml_CurrPos; return *this ; }/* const ZCNodePointN& operator--() const*/ ZCNodePointN operator++(int) const { ZCNodePointN VO_NowPoint(*this); mp_CurrLink = mp_CurrLink->mp_NextLink; ++ml_CurrPos ; return VO_NowPoint ; }/* ZCNodePointN operator++(int) const*/ ZCNodePointN operator--(int) const { ZCNodePointN VO_NowPoint(*this); mp_CurrLink = mp_CurrLink->mp_PrevLink; --ml_CurrPos; return VO_NowPoint ; }/* ZCNodePointN operator--(int) const*/ const ZCNodePointN& operator+=(TypeSize AL_Distance) const { if(IsEmpty()){return *this;} mp_CurrLink = &((*mp_CurrLink)+AL_Distance) ; ml_CurrPos += AL_Distance ; return *this; /*:::::::::::::::::::::::::::*/ }/* const ZCNodePointN& operator+=(TypeSize AL_Distance) const*/ const ZCNodePointN& operator-=(TypeSize AL_Distance) const { mp_CurrLink = &((*mp_CurrLink)-AL_Distance); ml_CurrPos -= AL_Distance ; return *this; /*::::::::::::::::::::::::::*/ }/* const ZCNodePointN& operator-=(TypeSize AL_Distance) const*/ public: };/* class ZCNodePointN*/ class ZCLinkPointEx : public ZCNodePoint { public: ZCLinkPointEx(TypeList& AR_TypeList): ZCNodePoint(AR_TypeList){} ZCLinkPointEx(const ZCNodePoint & rhs): ZCNodePoint(rhs ){} ZCLinkPointEx(const ZCLinkPointEx& rhs): ZCNodePoint(rhs ){} public: static ZCLinkPointEx MakeTailPoint(const ZCLinkPointEx& AR_TypeIter) { ZCLinkPointEx VO_ZCLinkPoint(AR_TypeIter); if(!AR_TypeIter.IsEmpty()) /****************************/ { VO_ZCLinkPoint.mp_CurrLink = VO_ZCLinkPoint.mr_TypeList.mp_TailLink; VO_ZCLinkPoint.ml_CurrPos = VO_ZCLinkPoint.mr_TypeList.ml_LinkSize; } return VO_ZCLinkPoint; /********************************/ }/* static ZCLinkPointEx MakeTailPoint(const ZCLinkPointEx& AR_TypeIter)*/ public: ZCLinkPointEx& operator= (const ZCLinkPointEx& rhs){ return *this; } const ZCLinkPointEx& operator++() const { if(this->IsEmpty()){return *this;} this->mp_CurrLink = this->mp_CurrLink->mp_NextLink ; if(++this->ml_CurrPos>this->mr_CurrList.size()) { this->ml_CurrPos -= this->mr_CurrList.size(); } return *this; /*******************************/ }/* const ZCLinkPointEx& operator++() const*/ const ZCLinkPointEx& operator--() const { if(this->IsEmpty()){return *this;} this->mp_CurrLink = this->mp_CurrLink->mp_PrevLink ; if(--this->ml_CurrPos<1) { this->ml_CurrPos += this->mr_CurrList.size(); } return *this; /********/ }/* const ZCLinkPointEx& operator--() const*/ ZCLinkPointEx operator++(int) const { ZCLinkPointEx VO_NowPoint(*this); if(this->IsEmpty()){return VO_NowPoint;} this->mp_CurrLink = this->mp_CurrLink->mp_NextLink ; if(++this->ml_CurrPos>this->mr_CurrList.size()) { this->ml_CurrPos -= this->mr_CurrList.size(); } return VO_NowPoint; /*************************/ }/* ZCLinkPointEx operator++(int) const*/ ZCLinkPointEx operator--(int) const { ZCLinkPointEx VO_NowPoint(*this); if(this->IsEmpty()){return VO_NowPoint;} this->mp_CurrLink = this->mp_CurrLink->mp_PrevLink ; if(--this->ml_CurrPos<1) { this->ml_CurrPos += this->mr_CurrList.size(); } return VO_NowPoint; }/* ZCLinkPointEx operator--(int) const*/ const ZCLinkPointEx& operator+=(TypeSize AL_Distance) const { if(this->IsEmpty()){return *this;} this->mp_CurrLink = &((*this->mp_CurrLink)+AL_Distance) ; if(this->ml_CurrPos+=AL_Distance > this->mr_CurrList.size()) { this->ml_CurrPos %= this->mr_CurrList.size(); } else if(this->ml_CurrPos<1) // AL_Distance<0 { while(this->ml_CurrPos+= this->mr_CurrList.size()<1){} } return *this; /****************************/ }/* const ZCLinkPointEx& operator+=(TypeSize AL_Distance) const*/ const ZCLinkPointEx& operator-=(TypeSize AL_Distance) const { if(this->IsEmpty()){return *this;} this->mp_CurrLink = &((*this->mp_CurrLink)-AL_Distance); if(this->ml_CurrPos-=AL_Distance > this->mr_CurrList.size()) { this->ml_CurrPos %= this->mr_CurrList.size(); } else if(this->ml_CurrPos<1) // AL_Distance>=0 { while(this->ml_CurrPos+= this->mr_CurrList.size()<1){} } return *this; /*****************************/ }/* const ZCLinkPointEx& operator-=(TypeSize AL_Distance) const*/ public: };/* class ZCLinkPointEx*/ class ZCLinkFake : public TypeAlloc { public: friend class ZtCObjList; private: ZCLink* mp_NextLink; ZCLink* mp_PrevLink; public : ZCLinkFake() { mp_NextLink = 0; mp_PrevLink = 0; } public : };/* class ZCLinkFake : public TypeAlloc*/ public : /******************************************************************/ protected: ZCLink* mp_HeadLink; ZCLink* mp_TailLink; TypeSize ml_LinkSize; mutable ZCFreeHeap mo_FreeObjt; protected: ZCLink* AddTailLink(ZCLink* AP_NewLink) { if(ml_LinkSize<1) { mp_HeadLink = AP_NewLink; mp_TailLink = AP_NewLink; ZCLink::MakeRing ( mp_HeadLink, mp_TailLink ) ; ml_LinkSize= 1; return AP_NewLink; }/* if(ml_LinkSize<1)*/ ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; mp_TailLink = AP_NewLink; ++ml_LinkSize ; return AP_NewLink; /*::::::::::::::::::::*/ }/* ZCLink* AddTailLink(ZCLink* AP_NewLink)*/ ZCLink* AddHeadLink(ZCLink* AP_NewLink) { if(ml_LinkSize<1) { mp_HeadLink = AP_NewLink; mp_TailLink = AP_NewLink; ZCLink::MakeRing ( mp_HeadLink, mp_TailLink ) ; ml_LinkSize= 1; return AP_NewLink; }/* if(ml_LinkSize<1)*/ ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; mp_HeadLink = AP_NewLink; ++ml_LinkSize ; return AP_NewLink; /*::::::::::::::::::::*/ }/* ZCLink* AddHeadLink(ZCLink* AP_NewLink)*/ ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink) { // *this 에 속한 AP_StdLink 의 뒤에, AP_NewLink 를 삽입한다. // AP_StdLink 이 0 이면, 맨 앞에 삽입한다. if(AP_StdLink==0) // 맨 앞에 삽입 { if(ml_LinkSize<1) { mp_HeadLink = AP_NewLink; mp_TailLink = AP_NewLink; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else { ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; mp_HeadLink = AP_NewLink; } } else if(AP_StdLink==mp_TailLink) { ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; mp_TailLink = AP_NewLink; } else { ZCLink* VP_StdNext = AP_StdLink->mp_NextLink ; ZCLink::JoinLink(AP_StdLink, AP_NewLink) ; ZCLink::JoinLink(AP_NewLink, VP_StdNext) ; } ++ml_LinkSize; return AP_NewLink; }/* ZCLink* AddLinkAfter(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/ ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink) { // *this 에 속한 AP_StdLink 의 앞에, AP_NewLink 를 삽입한다. // AP_StdLink 이 0 이면, 맨 뒤에 삽입한다. if(AP_StdLink==0) // 맨 뒤에 삽입 { if(ml_LinkSize<1) { mp_HeadLink = AP_NewLink; mp_TailLink = AP_NewLink; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else { ZCLink::JoinLink(mp_TailLink, AP_NewLink) ; ZCLink::MakeRing(mp_HeadLink, AP_NewLink) ; mp_TailLink = AP_NewLink; } } else if(AP_StdLink==mp_HeadLink) { ZCLink::JoinLink(AP_NewLink, mp_HeadLink) ; ZCLink::MakeRing(AP_NewLink, mp_TailLink) ; mp_HeadLink = AP_NewLink; } else { ZCLink* VP_StdPrev = AP_StdLink->mp_PrevLink ; ZCLink::JoinLink(VP_StdPrev, AP_NewLink) ; ZCLink::JoinLink(AP_NewLink, AP_StdLink) ; } ++ml_LinkSize; return AP_NewLink; }/* ZCLink* AddLinkBefore(ZCLink* AP_StdLink, ZCLink* AP_NewLink)*/ ZCLink* CutLink(ZCLink* AP_StdLink) { if(mp_HeadLink==AP_StdLink) { if(ml_LinkSize==1) { mp_HeadLink = 0; mp_TailLink = 0; } else // ml_LinkSize>1 { mp_HeadLink = mp_HeadLink->mp_NextLink ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* else*/ } else if(mp_TailLink==AP_StdLink) { mp_TailLink = mp_TailLink->mp_PrevLink ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); } else { ZCLink::JoinLink ( AP_StdLink->mp_PrevLink, AP_StdLink->mp_NextLink ) ; //////////////// }/* else*/ --ml_LinkSize ; return AP_StdLink; }/* ZCLink* CutLink(ZCLink* AP_StdLink)*/ ZtCObjList& CutLinkRangeOut /*////////////////////////////////////////*/ ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , ZtCObjList& 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 추가. AB_After==false 이면, rhs 의 AP_RhsStd 의 앞에 삽입한다. AP_RhsStd==0 이면 맨 뒤에 삽입한다. -- 2025-10-07 08:36 ///////////////////////////////////////////////////////////*/ 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) { // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. ZCLink::MakeRing(&AR_CutHead, &AR_CutTail); rhs.mp_HeadLink = &AR_CutHead ; rhs.mp_TailLink = &AR_CutTail ; } else if(AB_After) { if(AP_RhsStd==0) // 맨 앞에 삽입. { ZCLink::JoinLink(&AR_CutTail, rhs.mp_HeadLink); ZCLink::MakeRing(&AR_CutHead, rhs.mp_TailLink); rhs.mp_HeadLink = &AR_CutHead; } else // AP_RhsStd 의 뒤에 삽입. { 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 { if(AP_RhsStd==0) // 맨 뒤에 삽입. { ZCLink::JoinLink(rhs.mp_TailLink, &AR_CutHead); ZCLink::MakeRing(rhs.mp_HeadLink, &AR_CutTail); rhs.mp_TailLink = &AR_CutTail; } else // AP_RhsStd 의 앞에 삽입. { 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*/ rhs.ml_LinkSize += AL_CutSize; return rhs; }/* ZtCObjList& CutLinkRangeOut //////////////////////////////////////////// ( ZCLink& AR_CutHead , ZCLink& AR_CutTail , TypeSize AL_CutSize , ZtCObjList& rhs , ZCLink* AP_RhsStd , bool AB_After=true ) #######################################################################*/ /*private :*/ public : ZtCObjList() { mp_HeadLink = 0 ; mp_TailLink = 0 ; ml_LinkSize = 0 ; }/* ZtCObjList()*/ ZtCObjList(const ZtCObjList& rhs) { mp_HeadLink = 0 ; mp_TailLink = 0 ; ml_LinkSize = 0 ; *this = (rhs); }/* ZtCObjList(const ZtCObjList& rhs)*/ ~ZtCObjList() { DeleteAll(); }/* ~ZtCObjList()*/ ZtCObjList& operator=(const ZtCObjList& 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 ; mo_FreeObjt.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; mo_FreeObjt.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; }/* ZtCObjList& operator=(const ZtCObjList& rhs)*/ void DeleteAll() { if(ml_LinkSize<1) return; mo_FreeObjt.RecvFreeIn (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink =0 ; mp_TailLink =0 ; ml_LinkSize =0 ; }/* void DeleteAll()*/ TypeData& AddHead() { return **AddHeadLink(mo_FreeObjt.SendFreeOut()); } TypeData& AddTail() { return **AddTailLink(mo_FreeObjt.SendFreeOut()); } ZCLink& AddHeadDef() { return *AddHeadLink(mo_FreeObjt.SendFreeOut()); } ZCLink& AddTailDef() { return *AddTailLink(mo_FreeObjt.SendFreeOut()); } TypeData& AddHead(TypeArg AO_ArgData) /*########################*/ { if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); TypeMoveObj::Exec(**VP_NewNode, AO_ArgData); return AddHeadLink(VP_NewNode)->mo_DataObjt; } //////////////////////////////////////////////////// return AddHeadLink(new ZCLink(AO_ArgData))->mo_DataObjt; }/* TypeData& AddHead(TypeArg AO_ArgData) ##########################*/ TypeData& AddTail(TypeArg AO_ArgData) /*########################*/ { if(TypeMoveObj::ZEUseMoveObj>0) //////////////////// { ZCLink* VP_NewNode = mo_FreeObjt.SendFreeOut(); TypeMoveObj::Exec(*VP_NewNode, AO_ArgData); return AddTailLink(VP_NewNode)->mo_DataObjt; } //////////////////////////////////////////////////// return AddTailLink(new ZCLink(AO_ArgData))->mo_DataObjt; }/* TypeData& AddTail(TypeArg AO_ArgData) ##########################*/ ZtCObjList& AddHead(ZtCObjList& rhs) { if(this == &rhs ) return *this; if(rhs.size()<1 ) return *this; ZtCObjList VO_TempList(rhs); return JoinHead(VO_TempList); }/* ZtCObjList& AddHead(ZtCObjList& rhs)*/ ZtCObjList& AddTail(ZtCObjList& rhs) { if(this == &rhs ) return *this; if(rhs.size()<1 ) return *this; ZtCObjList VO_TempList(rhs); return JoinTail(VO_TempList); }/* ZtCObjList& AddTail(ZtCObjList& rhs)*/ void DeleteHead() { if(ml_LinkSize<1) return; ZCLink* VP_TempLink = mp_HeadLink ; mp_HeadLink = mp_HeadLink->mp_NextLink ; mo_FreeObjt.RecvFreeIn(VP_TempLink); if(--ml_LinkSize<1) { mp_HeadLink = mp_TailLink =0; return; }/* if(--ml_LinkSize<1)*/ ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* void DeleteHead()*/ void DeleteTail() { if(ml_LinkSize<1) return; ZCLink* VP_TempLink = mp_TailLink ; mp_TailLink = mp_TailLink->mp_PrevLink ; mo_FreeObjt.RecvFreeIn(VP_TempLink); if(--ml_LinkSize<1) { mp_HeadLink = mp_TailLink =0; return; }/* if(--ml_LinkSize<1)*/ ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* void DeleteTail()*/ void DeleteHead(TTypSize AL_DelSize) { // AL_DelSize 개의 링크를 앞 부분에서 삭제 if(ml_LinkSize<1 || AL_DelSize<1){ return; } if(AL_DelSize > ml_LinkSize) { AL_DelSize = ml_LinkSize; } if(AL_DelSize== ml_LinkSize) { RecvFreeIn (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink=0 ; mp_TailLink=0 ; ml_LinkSize=0 ; return; }/* if(AL_DelSize==ml_LinkSize)*/ ZCLink* VP_NewHead = mp_HeadLink->GetNextPrevPtr( AL_DelSize ) ; mo_FreeObjt.RecvFreeIn (AL_DelSize, mp_HeadLink, VP_NewHead->mp_PrevLink); mp_HeadLink = VP_NewHead ; ml_LinkSize -= AL_DelSize ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* void DeleteHead(TTypSize AL_DelSize)*/ void DeleteTail(TTypSize AL_DelSize) { if(ml_LinkSize==0 || AL_DelSize<1){ return; } if(AL_DelSize> ml_LinkSize){ AL_DelSize=ml_LinkSize; } if(AL_DelSize==ml_LinkSize) { mo_FreeObjt.RecvFreeIn (ml_LinkSize, mp_HeadLink, mp_TailLink); mp_HeadLink=0 ; mp_TailLink=0 ; ml_LinkSize=0 ; return; }/* if(AL_DelSize==ml_LinkSize)*/ ZCLink* VP_NewTail = mp_TailLink->GetNextPrevPtr( -AL_DelSize ) ; mo_FreeObjt.RecvFreeIn (AL_DelSize, VP_NewTail->mp_NextLink, mp_TailLink); mp_TailLink = VP_NewTail ; ml_LinkSize -= AL_DelSize ; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); }/* void DeleteTail(TTypSize AL_DelSize)*/ ZtCObjList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt) { // AP_StdLink 의 뒤에 rhs 를 삽입. if(rhs.ml_LinkSize<1) return *this; ZCLink* VP_StdLink = AO_StdOpt.Raw(); if(VP_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(VP_StdLink==0)*/ ZCLink* VP_StdNext=VP_StdLink->mp_NextLink; ZCLink::JoinLink(VP_StdLink , rhs.mp_HeadLink ); ZCLink::JoinLink(rhs.mp_TailLink, VP_StdNext ); if(VP_StdLink==mp_TailLink) { mp_TailLink=rhs.mp_TailLink; } ml_LinkSize += rhs.ml_LinkSize; rhs.mp_HeadLink =0 ; rhs.mp_TailLink =0 ; rhs.ml_LinkSize =0 ; return *this; /*:::::::::::::*/ }/* ZtCObjList& JoinAfter(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ ZtCObjList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt) { // AO_StdOpt 의 앞에 rhs 를 삽입. if(rhs.size()<1) return *this; ZCLink* VP_StdLink = AO_StdOpt.Raw(); if(VP_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(VP_StdLink==0)*/ ZCLink* VP_StdPrev = VP_StdLink->mp_PrevLink; ZCLink::JoinLink( VP_StdPrev , rhs.mp_HeadLink ); ZCLink::JoinLink(rhs.mp_TailLink, VP_StdLink ); if(VP_StdLink==mp_HeadLink) { mp_HeadLink = rhs.mp_HeadLink; } ml_LinkSize += rhs.ml_LinkSize; rhs.mp_HeadLink =0 ; rhs.mp_TailLink =0 ; rhs.ml_LinkSize =0 ; return *this; /*:::::::::::::*/ }/* ZtCObjList& JoinBefore(TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ ZtCObjList& JoinHead(TypeThis& rhs) { if(this==&rhs) return *this; return JoinAfter (rhs, ZCLinkOpt(0)); } ZtCObjList& JoinTail(TypeThis& rhs) { if(this==&rhs) return *this; return JoinBefore(rhs, ZCLinkOpt(0)); } void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt) { // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 뒤에 연결한다. CutLink(&AR_CutLink); rhs.AddLinkAfter(AO_StdOpt.Raw(), &AR_CutLink); }/* void SendOutAfter (ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt) { // AP_CutLink 를 잘라서 rhs 의 AP_StdLink 앞에 연결한다. CutLink(&AR_CutLink); rhs.AddLinkBefore(AO_StdOpt.Raw(), &AR_CutLink); }/* void SendOutBefore(ZCLink& AR_CutLink, TypeThis& rhs, ZCLinkOpt AO_StdOpt)*/ void SendOutHead(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 앞에 연결한다. { SendOutAfter (AR_CutLink, rhs, ZCLinkOpt(0)); } void SendOutTail(ZCLink& AR_CutLink, TypeThis& rhs) // AP_CutLink 를 잘라서 rhs 의 뒤에 연결한다. { SendOutBefore(AR_CutLink, rhs, ZCLinkOpt(0)); } ZtCObjList& SwapLinkNext(ZCLink& AR_LinkPrev) { // 다음 링크와 위치를 맞바꾼다. if(size()<=1){return *this;} ZCLink* VP_LinkNext = AR_LinkPrev.mp_NextLink; if(&AR_LinkPrev == VP_LinkNext){ return *this; } if(size()==2) { if(&AR_LinkPrev==mp_HeadLink) /*************************/ { // VP_LinkNext==mp_TailLink mp_HeadLink = VP_LinkNext ; mp_TailLink = &AR_LinkPrev; } /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ else // VP_LinkNext==mp_HeadLink { mp_HeadLink = &AR_LinkPrev ; mp_TailLink = VP_LinkNext ; } /*:::::::::::::::::::::::::::::::::::::::::::::::::::::*/ } else if(&AR_LinkPrev==mp_HeadLink) { // VP_LinkNext == mp_HeadLink.mp_NextLink; ZCLink* VP_HeadNext2 = VP_LinkNext->mp_NextLink ; ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev); ZCLink::JoinLink(&AR_LinkPrev, VP_HeadNext2); ZCLink::MakeRing(VP_LinkNext , mp_TailLink ); mp_HeadLink = VP_LinkNext ; } else if(&AR_LinkPrev==mp_TailLink) { // VP_LinkNext==mp_HeadLink ZCLink* VP_HeadNext = mp_HeadLink->mp_NextLink ; ZCLink* VP_TailPrev = mp_TailLink->mp_PrevLink ; ZCLink::JoinLink(mp_TailLink, VP_HeadNext); ZCLink::JoinLink(VP_TailPrev, mp_HeadLink); ZCLink::MakeRing(mp_TailLink, mp_HeadLink); mp_HeadLink = &AR_LinkPrev ; mp_TailLink = VP_LinkNext ; } else if(VP_LinkNext==mp_TailLink) { ZCLink* VP_TailPrev2 = AR_LinkPrev.mp_PrevLink ; ZCLink::JoinLink(VP_TailPrev2, VP_LinkNext ); ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ); ZCLink::MakeRing(mp_HeadLink , &AR_LinkPrev ); mp_TailLink = &AR_LinkPrev ; } else { ZCLink* VP_SwapPrev = AR_LinkPrev. mp_PrevLink; ZCLink* VP_SwapNext = VP_LinkNext->mp_NextLink; ZCLink::JoinLink(VP_SwapPrev , VP_LinkNext ) ; ZCLink::JoinLink(VP_LinkNext , &AR_LinkPrev ) ; ZCLink::JoinLink(&AR_LinkPrev, VP_SwapNext ) ; } return *this; /***********************************/ }/* ZtCObjList& SwapLinkNext(ZCLink& AR_LinkPrev)*/ ZtCObjList& SwapLinkPrev(ZCLink& AR_LinkNext) { // 이전 링크와 위치를 맞바꾼다. return SwapLinkNext(*AR_LinkNext.mp_PrevLink); }/* ZtCObjList& SwapLinkPrev(ZCLink& AR_LinkNext)*/ ZtCObjList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo) { // AR_LinkOne 와 AR_LinkTwo 의 위치를 바꾼다. if(size()<=1){return *this;} if(&AR_LinkOne==&AR_LinkTwo){return *this;} if(&AR_LinkOne==mp_HeadLink && &AR_LinkTwo==mp_TailLink) { return SwapLinkNext(AR_LinkTwo); } if(&AR_LinkOne==mp_TailLink && &AR_LinkTwo==mp_HeadLink) { return SwapLinkNext(AR_LinkOne); } /******************************************************/ if(&AR_LinkTwo==AR_LinkOne.mp_NextLink) { return SwapLinkNext(AR_LinkOne); } if(&AR_LinkOne==AR_LinkTwo.mp_NextLink) { return SwapLinkNext(AR_LinkTwo); } /******************************************************/ if(&AR_LinkOne==mp_HeadLink) { ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; ZCLink* VP_TwoNext =AR_LinkTwo. mp_NextLink; ZCLink* VP_TwoPrev =AR_LinkTwo. mp_PrevLink; ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne ) ; ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext ) ; ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; mp_HeadLink = &AR_LinkTwo ; return *this; } if(&AR_LinkOne==mp_TailLink) { ZCLink* VP_TailPrev= mp_TailLink->mp_PrevLink; ZCLink* VP_TwoNext = AR_LinkTwo. mp_NextLink; ZCLink* VP_TwoPrev = AR_LinkTwo. mp_PrevLink; ZCLink::JoinLink( VP_TwoPrev , &AR_LinkOne ) ; ZCLink::JoinLink(&AR_LinkOne , VP_TwoNext ) ; ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; mp_TailLink = &AR_LinkTwo ; return *this; } /******************************************************/ if(&AR_LinkTwo==mp_HeadLink) { ZCLink* VP_HeadNext=mp_HeadLink->mp_NextLink; ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; ZCLink::JoinLink(&AR_LinkTwo, VP_HeadNext) ; ZCLink::JoinLink( VP_OnePrev, &AR_LinkOne ) ; ZCLink::JoinLink(&AR_LinkOne, VP_OneNext ) ; ZCLink::MakeRing(&AR_LinkTwo, mp_TailLink) ; mp_HeadLink = &AR_LinkTwo ; return *this; } if(&AR_LinkTwo==mp_TailLink) { ZCLink* VP_TailPrev=mp_TailLink->mp_PrevLink; ZCLink* VP_OneNext =AR_LinkOne. mp_NextLink; ZCLink* VP_OnePrev =AR_LinkOne. mp_PrevLink; ZCLink::JoinLink( VP_OnePrev , &AR_LinkTwo ) ; ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext ) ; ZCLink::JoinLink( VP_TailPrev, &AR_LinkTwo ) ; ZCLink::MakeRing( mp_HeadLink, &AR_LinkTwo ) ; mp_TailLink = &AR_LinkTwo ; return *this; } /********************************************************/ ZCLink* VP_OnePrev= AR_LinkOne.mp_PrevLink ; ZCLink* VP_OneNext= AR_LinkOne.mp_NextLink ; ZCLink* VP_TwoPrev= AR_LinkTwo.mp_PrevLink ; ZCLink* VP_TwoNext= AR_LinkTwo.mp_NextLink ; ZCLink::JoinLink( VP_OnePrev, &AR_LinkTwo) ; ZCLink::JoinLink(&AR_LinkTwo, VP_OneNext) ; ZCLink::JoinLink( VP_TwoPrev, &AR_LinkOne) ; ZCLink::JoinLink(&AR_LinkOne, VP_TwoNext) ; return *this; }/* ZtCObjList& SwapLink(ZCLink& AR_LinkOne, ZCLink& AR_LinkTwo)*/ ZtCObjList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After) { if(size()<=1 || &AR_MoveLink==&AR_StdLink){return *this;} const bool CB_NeedFakeLink = //////////////////////////////////// ( &AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink || &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink ) ; if(CB_NeedFakeLink) ///////////////////////////////////////////// { // AR_MoveLink 를 떼어 내고, AR_MoveLink 의 앞뒤 링크를 연결. ZCLinkFake VO_FakeHead ; ZCLinkFake VO_FakeTail ; ZCLink* VP_FakeHead = reinterpret_cast( &VO_FakeHead) ; ZCLink* VP_FakeTail = reinterpret_cast( &VO_FakeTail) ; ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink; ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink; ZCLink::JoinLink(VP_MovePrev, VP_MoveNext); /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: AR_MoveLink 떼어 내기 완료. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; if(AB_After) { ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink); ZCLink::JoinLink(&AR_MoveLink, VP_StdNext ); } else { ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink); ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink ); } mp_HeadLink = VP_FakeHead->mp_NextLink; mp_TailLink = VP_FakeTail->mp_PrevLink; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); return *this; /***************************/ }/* const bool CB_NeedFakeLink = //////////////////////////////////// ( &AR_MoveLink==mp_HeadLink || &AR_MoveLink==mp_TailLink || &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink ) ; if(CB_NeedFakeLink) ///////////////////////////////////////////*/ if( AB_After && AR_MoveLink.mp_PrevLink==&AR_StdLink) { return *this; } if(!AB_After && AR_MoveLink.mp_NextLink==&AR_StdLink) { return *this; } /*:::::::::::::::::::::::::::::::::::::::::::::::::*/ ZCLink* VP_MoveNext = AR_MoveLink.mp_NextLink; ZCLink* VP_MovePrev = AR_MoveLink.mp_PrevLink; ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ; ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; if(AB_After) { ZCLink::JoinLink(&AR_StdLink , &AR_MoveLink); ZCLink::JoinLink(&AR_MoveLink, VP_StdNext ); } else { ZCLink::JoinLink( VP_StdPrev , &AR_MoveLink); ZCLink::JoinLink(&AR_MoveLink, &AR_StdLink ); } return *this; /*::::::::::::::::::::::::::::::::*/ }/* ZtCObjList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLink& AR_StdLink, bool AB_After)*/ ZtCObjList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After) { ZCLink* VP_LinkStd = AO_StdOpt.Raw(); if(VP_LinkStd==0) { if(AB_After) { VP_LinkStd = mp_HeadLink; AB_After=false; } else{ VP_LinkStd = mp_TailLink; AB_After=true ; } }/* if(VP_LinkStd==0)*/ return MoveLinkIn(AR_MoveLink, *VP_LinkStd, AB_After); }/* ZtCObjList& MoveLinkIn(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt, bool AB_After)*/ ZtCObjList& MoveLinkAfter (ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) { return MoveLinkIn(AR_MoveLink, AO_StdOpt, true ); } ZtCObjList& MoveLinkBefore(ZCLink& AR_MoveLink, ZCLinkOpt AO_StdOpt) { return MoveLinkIn(AR_MoveLink, AO_StdOpt, false); } ZtCObjList& MoveLinkHead(ZCLink& AR_MoveLink) { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), true ); } ZtCObjList& MoveLinkTail(ZCLink& AR_MoveLink) { return MoveLinkIn(AR_MoveLink, ZCLinkOpt(0), false); } ZtCObjList& MoveRangeIn /*/////////////////////////////////////////////*/ ( ZCLink& AR_MoveHead , ZCLink& AR_MoveTail , ZCLink& AR_StdLink , bool AB_After ) /*#####################################################################*/ { // AR_MoveHead ~ AR_MoveTail 밖에 AR_StdLink 이 있어야 한다. // AR_MoveHead 이 AR_MoveTail 위에 와서는 안 된다. if(size() <= 1 ){return *this;} if(&AR_MoveHead == &AR_StdLink){return *this;} if(&AR_MoveTail == &AR_StdLink){return *this;} const bool CB_NeedFakeLink = //////////////////////////////////// ( &AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink || &AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink || &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink ) ; if(CB_NeedFakeLink) ///////////////////////////////////////////// { // AR_MoveHead~AR_MoveTail 를 떼어 내고, 그 앞뒤 링크를 연결. ZCLinkFake VO_FakeHead ; ZCLinkFake VO_FakeTail ; ZCLink* VP_FakeHead = reinterpret_cast( &VO_FakeHead) ; ZCLink* VP_FakeTail = reinterpret_cast( &VO_FakeTail) ; ZCLink::JoinLink( VP_FakeHead, mp_HeadLink ) ; ZCLink::JoinLink( mp_TailLink, VP_FakeTail ) ; ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink; ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink; ZCLink::JoinLink(VP_MovePrev, VP_MoveNext); /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: AR_MoveHead~AR_MoveTail 떼어 내기 완료. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; if(AB_After) { ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead); ZCLink::JoinLink(&AR_MoveTail, VP_StdNext ); } else { ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead); ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink ); } mp_HeadLink = VP_FakeHead->mp_NextLink; mp_TailLink = VP_FakeTail->mp_PrevLink; ZCLink::MakeRing(mp_HeadLink, mp_TailLink); return *this; /***************************/ }/* const bool CB_NeedFakeLink = //////////////////////////////////// ( &AR_MoveHead==mp_HeadLink || &AR_MoveHead==mp_TailLink || &AR_MoveTail==mp_HeadLink || &AR_MoveTail==mp_TailLink || &AR_StdLink ==mp_HeadLink || &AR_StdLink ==mp_TailLink ) ; if(CB_NeedFakeLink) ///////////////////////////////////////////*/ if( AB_After && AR_MoveHead.mp_PrevLink==&AR_StdLink) { return *this; } if(!AB_After && AR_MoveTail.mp_NextLink==&AR_StdLink) { return *this; } /*:::::::::::::::::::::::::::::::::::::::::::::::::*/ ZCLink* VP_MoveNext = AR_MoveTail.mp_NextLink; ZCLink* VP_MovePrev = AR_MoveHead.mp_PrevLink; ZCLink::JoinLink( VP_MovePrev, VP_MoveNext ) ; ZCLink* VP_StdNext = AR_StdLink .mp_NextLink; ZCLink* VP_StdPrev = AR_StdLink .mp_PrevLink; if(AB_After) { ZCLink::JoinLink(&AR_StdLink , &AR_MoveHead); ZCLink::JoinLink(&AR_MoveTail, VP_StdNext ); } else { ZCLink::JoinLink( VP_StdPrev , &AR_MoveHead); ZCLink::JoinLink(&AR_MoveTail, &AR_StdLink ); } return *this; /*::::::::::::::::::::::::::::::::*/ }/* ZtCObjList& MoveRangeIn ///////////////////////////////////////////////// ( ZCLink& AR_MoveHead, ZCLink& AR_MoveTail, ZCLink& AR_StdLink , bool AB_After ) #######################################################################*/ ZtCObjList& SendRangeOut /////////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, TypeThis& rhs , ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 rhs 의 AR_StdLink 뒤에 연결한다. return CutLinkRangeOut /************************/ ( AR_CutHead, AR_CutTail , AI_CutSize, rhs , AO_LinkOpt.Raw(), AB_After ); /***********************************************/ } /*#####################################################################*/ ZtCObjList& 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 ); //////////////////////////////////// } ZtCObjList& 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 ); ////////////////////// } /*#####################################################################*/ ZtCObjList& SendRangeIn ///////////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt, bool AB_After ) /*#####################################################################*/ { // AR_CutHead 부터 AR_CutTail 까지를 잘라서 AR_StdLink 뒤에 연결한다. if(AI_CutSize < 1 ){return *this;} if(AI_CutSize >= size()){return *this;} ZtCObjList VO_Saver; CutLinkRangeOut /***********/ ( AR_CutHead , AR_CutTail , AI_CutSize, RR(VO_Saver), AO_LinkOpt.Raw(), AB_After ); /*************************************************/ if(AB_After) return JoinAfter (VO_Saver, AO_LinkOpt); else return JoinBefore(VO_Saver, AO_LinkOpt); } /*#####################################################################*/ ZtCObjList& SendRangeInAfter //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { return SendRangeIn ( AR_CutHead, AR_CutTail, AI_CutSize, AO_LinkOpt, true ); } /*#####################################################################*/ ZtCObjList& SendRangeInBefore /////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { return SendRangeIn ( AR_CutHead, AR_CutTail, AI_CutSize, AO_LinkOpt, false); } /*#####################################################################*/ ZtCObjList& SendRangeInHead ///////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { return SendRangeIn ( AR_CutHead, AR_CutTail, AI_CutSize, ZCLinkOpt(0), true ); } /*#####################################################################*/ ZtCObjList& SendRangeInTail //////////////////////////////////////////// ( ZCLink& AR_CutHead, ZCLink& AR_CutTail, TypeSize AI_CutSize, ZCLinkOpt AO_LinkOpt ) /*#####################################################################*/ { return SendRangeIn ( AR_CutHead, AR_CutTail, AI_CutSize, ZCLinkOpt(0), false); } /*#####################################################################*/ TypeThis& CopyThis(TypeThis& ARR_Rhs) const { // *this 를 복사해서, ARR_Rhs 의 끝에 연결한다. if(size()<1) return ARR_Rhs; ZCLink* VP_HeadCopy=0; ZCLink* VP_TailCopy=0; mo_FreeObjt.SendFreeOutCopy //////////// ( mp_HeadLink , size()-1, RR(VP_HeadCopy), RR(VP_TailCopy) ); //////////////////////////////////////// TypeThis VO_TempList; VO_TempList.mp_HeadLink=VP_HeadCopy ; VO_TempList.mp_TailLink=VP_TailCopy ; VO_TempList.ml_LinkSize=size() ; return ARR_Rhs.JoinTail(VO_TempList); }/* TypeThis& CopyThis(TypeThis& ARR_Rhs) const*/ ZCFreeHeap& GetCFreeHeap() const{return mo_FreeObjt;} TypeData & GetHeadData() {return mp_HeadLink->mo_DataObjt;} TypeData & GetTailData() {return mp_TailLink->mo_DataObjt;} TypeDataC& GetHeadData() const{return mp_HeadLink->mo_DataObjt;} TypeDataC& GetTailData() const{return mp_TailLink->mo_DataObjt;} operator TypeData&() { return AddTail() ; } ZCDataOpt GetHeadDataOpt() { if(mp_HeadLink==0) return ZCDataOpt(0); return ZCDataOpt(mp_HeadLink->mo_DataObjt); } ZCDataOpt GetTailDataOpt() { if(mp_TailLink==0) return ZCDataOpt(0); return ZCDataOpt(mp_TailLink->mo_DataObjt); } ZCDataOptC GetHeadDataOpt() const { if(mp_HeadLink==0) return ZCDataOpt(0); return ZCDataOpt(mp_HeadLink->mo_DataObjt); } ZCDataOptC GetTailDataOpt() const { if(mp_TailLink==0) return ZCDataOpt(0); return ZCDataOpt(mp_TailLink->mo_DataObjt); }/* ZCDataOptC GetTailDataOpt()*/ TypeSize size() const{ return ml_LinkSize; } TypeSize GetSize() const{ return ml_LinkSize; } TypeSize capacity () const { return mo_FreeObjt.size()+size(); } TypeSize size_free() const { return mo_FreeObjt.size() ; } TypeSize GetFreeSize() const{ return size_free(); } bool IsEmpty() const{return ml_LinkSize<1;} bool empty () const{return ml_LinkSize<1;} void clear (){DeleteAll();} void push_front(TypeArg AO_ArgData){AddHead(AO_ArgData);} void push_back (TypeArg AO_ArgData){AddTail(AO_ArgData);} void pop_front(){DeleteHead();} void pop_back (){DeleteTail();} TypeData & front() {return GetHeadData();} TypeData & back () {return GetTailData();} TypeDataC& front() const{return GetHeadData();} TypeDataC& back () const{return GetTailData();} 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_Size)*/ }/* 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->mo_DataObjt , 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->mo_DataObjt , 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 ) ###############################################################################*/ template void IterElemLink(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 IterElemLink(TFunctor AO_Functor) */ template void IterElemLink(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_LinkSize)*/ }/* template void IterElemLink(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElemLink ( 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_LinkSize)*/ }/* template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElemLink ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) ###############################################################################*/ template void IterElemLinkRev(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_LinkSize)*/ }/* template void IterElemLinkRev(TFunctor AO_Functor) */ template void IterElemLinkRev(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_LinkSize)*/ }/* template void IterElemLinkRev(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElemLinkRev ( 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_LinkSize)*/ }/* template < typename TFunctor , typename TTypeHelp1 , typename TTypeHelp2 > void IterElemLinkRev ( TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2 ) ###############################################################################*/ ZCLink * GetHeadLinkPtr() {return mp_HeadLink;} ZCLink * GetTailLinkPtr() {return mp_TailLink;} ZCLinkC* GetHeadLinkPtr() const{return mp_HeadLink;} ZCLinkC* GetTailLinkPtr() const{return mp_TailLink;} ZCLink * GetLinkPtr(TypeSize AI_Index) {return mp_HeadLink->GetNextPrevPtr(AI_Index-1);} ZCLinkC* GetLinkPtr(TypeSize AI_Index) const{return mp_HeadLink->GetNextPrevPtr(AI_Index-1);} ZCLink & GetHeadLink(TypeSize AI_Distance) {return (*mp_HeadLink)+AI_Distance;} ZCLink & GetTailLink(TypeSize AI_Distance) {return (*mp_TailLink)-AI_Distance;} ZCLinkC& GetHeadLink(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;} ZCLinkC& GetTailLink(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} ZCLink & GetNode(TypeSize AI_Index) {return (*mp_HeadLink)+(AI_Index-1);} ZCLinkC& GetNode(TypeSize AI_Index) const{return (*mp_HeadLink)+(AI_Index-1);} ZCLink * HeadPtr() {return mp_HeadLink;} ZCLink * TailPtr() {return mp_TailLink;} ZCLinkC* HeadPtr() const{return mp_HeadLink;} ZCLinkC* TailPtr() const{return mp_TailLink;} ZCLink * HeadPtr(TypeSize AI_Distance) {return &((*mp_HeadLink)+AI_Distance);} ZCLink * TailPtr(TypeSize AI_Distance) {return &((*mp_TailLink)-AI_Distance);} ZCLinkC* HeadPtr(TypeSize AI_Distance) const{return &((*mp_HeadLink)+AI_Distance);} ZCLinkC* TailPtr(TypeSize AI_Distance) const{return &((*mp_TailLink)-AI_Distance);} ZCLink & HeadRef() {return *mp_HeadLink;} ZCLink & TailRef() {return *mp_TailLink;} ZCLinkC& HeadRef() const{return *mp_HeadLink;} ZCLinkC& TailRef() const{return *mp_TailLink;} ZCLink & HeadRef(TypeSize AI_Distance) {return (*mp_HeadLink)+AI_Distance;} ZCLink & TailRef(TypeSize AI_Distance) {return (*mp_TailLink)-AI_Distance;} ZCLinkC& HeadRef(TypeSize AI_Distance) const{return (*mp_HeadLink)+AI_Distance;} ZCLinkC& TailRef(TypeSize AI_Distance) const{return (*mp_TailLink)-AI_Distance;} ZCDataOpt GetDataOpt(TypeSize AI_Index) // 1부터 시작. { return DataOpt(AI_Index-1); } ZCDataOptC GetDataOpt(TypeSize AI_Index) const { return DataOpt(AI_Index-1); } ZCDataOpt DataOpt(TypeSize AI_Index) // 1부터 { if(mp_HeadLink==0){return ZCDataOpt(0);} return ZCDataOpt(**HeadPtr(AI_Index-1)); } ZCDataOptC DataOpt(TypeSize AI_Index) const { if(mp_HeadLink==0){return ZCDataOpt(0) ;} return ZCDataOpt(**HeadPtr(AI_Index-1)); } ZCDataOpt HeadOptD(TypeSize AI_Distance=0) { if(mp_HeadLink==0){return ZCDataOpt(0);} return ZCDataOpt(**HeadPtr(AI_Distance)); } ZCDataOpt TailOptD(TypeSize AI_Distance=0) { if(mp_HeadLink==0){return ZCDataOpt(0);} return ZCDataOpt(**TailPtr(AI_Distance)); } ZCDataOptC HeadOptD(TypeSize AI_Distance=0) const { if(mp_HeadLink==0){return ZCDataOpt(0);} return ZCDataOpt(**HeadPtr(AI_Distance)); } ZCDataOptC TailOptD(TypeSize AI_Distance=0) const { if(mp_HeadLink==0){return ZCDataOpt(0);} return ZCDataOpt(**TailPtr(AI_Distance)); } ZCLinkOpt HeadOpt() {return ZCLinkOpt(mp_HeadLink);} ZCLinkOpt TailOpt() {return ZCLinkOpt(mp_TailLink);} ZCLinkOptC HeadOpt() const{return ZCLinkOpt(mp_HeadLink);} ZCLinkOptC TailOpt() const{return ZCLinkOpt(mp_TailLink);} ZCLinkOpt HeadOpt(TypeSize AI_Distance) {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} ZCLinkOpt TailOpt(TypeSize AI_Distance) {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} ZCLinkOptC HeadOpt(TypeSize AI_Distance) const {if(mp_HeadLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_HeadLink)+AI_Distance);} ZCLinkOptC TailOpt(TypeSize AI_Distance) const {if(mp_TailLink==0){return ZCLinkOpt(0);} return ZCLinkOpt((*mp_TailLink)-AI_Distance);} ZCLink & _1() {return HeadRef();} ZCLink & _0() {return TailRef();} ZCLinkC& _1() const{return HeadRef();} ZCLinkC& _0() const{return TailRef();} ZCLink & _1(TypeSize AI_Distance) {return HeadRef(AI_Distance);} ZCLink & _0(TypeSize AI_Distance) {return TailRef(AI_Distance);} ZCLinkC& _1(TypeSize AI_Distance) const{return HeadRef(AI_Distance);} ZCLinkC& _0(TypeSize AI_Distance) const{return TailRef(AI_Distance);} ZCLinkOpt GetLinkOpt(TypeSize AI_Index) { if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); } ZCLinkOptC GetLinkOpt(TypeSize AI_Index) const { if(mp_HeadLink==0) return ZCLinkOpt(0); return ZCLinkOpt(GetLinkPtr(AI_Index)); } IterEasy GetHeadIterEasy () {return GetHeadLinkPtr();} IterEasy GetTailIterEasy () {return GetTailLinkPtr();} IterEasyID GetHeadIterEasyID () {return (IterEasyID )GetHeadLinkPtr();} IterEasyID GetTailIterEasyID () {return (IterEasyID )GetTailLinkPtr();} IterEasy GetHeadIterEasy () const{return GetHeadLinkPtr();} IterEasy GetTailIterEasy () const{return GetTailLinkPtr();} IterEasyIDc GetHeadIterEasyID () const{return (IterEasyIDc)GetHeadLinkPtr();} IterEasyIDc GetTailIterEasyID () const{return (IterEasyIDc)GetTailLinkPtr();} IterEasyIDc GetHeadIterEasyIDc() const{return (IterEasyIDc)GetHeadLinkPtr();} IterEasyIDc GetTailIterEasyIDc() const{return (IterEasyIDc)GetTailLinkPtr();} void MoveNextIter(ZCLink* & APR_CLink ) const { APR_CLink=APR_CLink->GetNextPtr(); } void MoveNextIter(IterEasyID & ARRI_IterEasyID ) const { MoveNextIter((ZCLink*&)(ARRI_IterEasyID)); } void MoveNextIter(TypeLinkC* & APR_CLink ) const { APR_CLink=APR_CLink->GetNextPtr(); } void MoveNextIter(IterEasyIDc& ARRI_IterEasyID ) const { MoveNextIter((TypeLinkC*&)(ARRI_IterEasyID)); } void MoveNextIter(iterator & ARR_Iterator ) const{++ARR_Iterator;} void MoveNextIter(iteratorN & ARR_Iterator ) const{++ARR_Iterator;} void MovePrevIter(ZCLink* & APR_CLink ) const { APR_CLink=APR_CLink->GetPrevPtr(); } void MovePrevIter(IterEasyID & ARRI_IterEasyID ) const { MovePrevIter((ZCLink*&)(ARRI_IterEasyID)); } void MovePrevIter(TypeLinkC* & APR_CLink ) const { APR_CLink=APR_CLink->GetPrevPtr(); } void MovePrevIter(IterEasyIDc& ARRI_IterEasyID ) const { MovePrevIter((TypeLinkC*&)(ARRI_IterEasyID)); } void MovePrevIter(iterator & ARR_Iterator ) const{--ARR_Iterator;} void MovePrevIter(iteratorN & ARR_Iterator ) const{--ARR_Iterator;} iterator begin () { return ZCNodePoint (*this); } iteratorN begin () const{ return ZCNodePointN(*this); } iterator end () { return ZCNodePoint ::MakeTailPoint(*this); } iteratorN end () const{ return ZCNodePointN::MakeTailPoint(*this); } iteratorN cbegin () const{ return ZCNodePointN(*this); } iteratorN cend () const{ return ZCNodePointN::MakeTailPoint(*this); } IterEasy ItHEasy() {return GetHeadIterEasy ();} IterEasy ItTEasy() {return GetTailIterEasy ();} IterEasyID ItHID () {return GetHeadIterEasyID ();} IterEasyID ItTID () {return GetTailIterEasyID ();} IterEasyC ItHEasy() const{return GetHeadIterEasy ();} IterEasyC ItTEasy() const{return GetTailIterEasy ();} IterEasyIDc ItHID () const{return GetHeadIterEasyIDc();} IterEasyIDc ItTID () const{return GetTailIterEasyIDc();} IterEasyIDc ItHIDc () const{return GetHeadIterEasyIDc();} IterEasyIDc ItTIDc () const{return GetTailIterEasyIDc();} void ItNext(TypeLink* & APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} void ItNext(iterator & ARR_Iterator ) const{++ARR_Iterator;} void ItNext(IterEasyID & ARRI_IterEasyID) const{ItNext((ZCLink*&)(ARRI_IterEasyID));} void ItNext(TypeLinkC* & APR_CLink ) const{ APR_CLink=APR_CLink->GetNextPtr() ;} void ItNext(iteratorN & ARR_Iterator ) const{++ARR_Iterator;} void ItNext(IterEasyIDc & ARRI_IterEasyID) const { ItNext((TypeLinkC*&)(ARRI_IterEasyID)); } void ItPrev(ZCLink* & APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;} void ItPrev(iterator & ARR_Iterator ) const{--ARR_Iterator;} void ItPrev(IterEasyID & ARRI_IterEasyID) const{ItPrev((ZCLink*&)(ARRI_IterEasyID));} void ItPrev(TypeLinkC* & APR_CLink ) const{ APR_CLink=APR_CLink->GetPrevPtr() ;} void ItPrev(iteratorN & ARR_Iterator ) const{--ARR_Iterator;} void ItPrev(IterEasyIDc & ARRI_IterEasyID) const { ItPrev((TypeLinkC*&)(ARRI_IterEasyID)); } TypeData & ItD(TypeLink * AP_CLink ){return **AP_CLink ;} TypeData & ItD(iterator & AR_Iterator ){return *AR_Iterator;} TypeData & ItD(IterEasyID AH_IterEasyID) { return ItD((TypeLink *)AH_IterEasyID); } TypeDataC& ItD(TypeLinkC * AP_CLink ) const{return **AP_CLink ;} TypeDataC& ItD(iteratorN & AR_Iterator ) const{return *AR_Iterator;} TypeDataC& ItD(IterEasyIDc AH_IterEasyID ) const { return ItD((TypeLinkC*)AH_IterEasyID); } TypeData & ItD(TypeLink * AP_CLink , TypeSize AI_FarNum) {return **(AP_CLink->GetNextPrevPtr(AI_FarNum)) ; } TypeData & ItD(IterEasyID AH_IterEasyID, TypeSize AI_FarNum) { return ItD((ZCLink *)AH_IterEasyID , AI_FarNum); } TypeData & ItD(iterator & ARR_Iterator , TypeSize AI_FarNum) { return ItD((ZCLink *)ARR_Iterator , AI_FarNum); } TypeDataC& ItD(TypeLinkC * AP_CLink , TypeSize AI_FarNum) const {return **(AP_CLink->GetNextPrePtr(AI_FarNum)) ; } TypeDataC& ItD(IterEasyIDc AH_IterEasyID, TypeSize AI_FarNum) const { return ItD((ZCLinkC*)AH_IterEasyID , AI_FarNum); } TypeDataC& ItD(iteratorN & ARR_Iterator , TypeSize AI_FarNum) const { return ItD((ZCLinkC*)ARR_Iterator , AI_FarNum); } ZtCObjList& Rotate(TypeSize AL_RotateNum) { if(ml_LinkSize>0) /***********************/ { mp_HeadLink = mp_HeadLink-> GetNextPrevPtr(AL_RotateNum); mp_TailLink = mp_HeadLink->mp_PrevLink; } return *this; /***************************/ }/* ZtCObjList& Rotate(TypeSize AL_RotateNum)*/ ZtCObjList& Rotate() { if(ml_LinkSize>0) /************************/ { mp_HeadLink = mp_HeadLink->mp_NextLink ; mp_TailLink = mp_HeadLink->mp_PrevLink ; } return *this; /****************************/ }/* ZtCObjList& Rotate()*/ ZtCObjList& RotateBack() { if(ml_LinkSize>0) /************************/ { mp_HeadLink = mp_HeadLink->mp_PrevLink ; mp_TailLink = mp_HeadLink->mp_PrevLink ; } return *this; /****************************/ }/* ZtCObjList& RotateBack()*/ /*/////////////////////////////////////////////////////////////////////////// ■ IterElement() 예제. #include #include "ZCppMain/ZtCObjList.H" using namespace std; int main() { ZNsMain:: ZtCObjList myObjList; myObjList.AddTail(10); myObjList.AddTail(20); myObjList.AddTail(30); myObjList.AddTail(40); struct StFunctor { static void ShowElement(int ArgiValue){cout<<"# Value="< CArray ; typedef ZtCObjList CObjList ; typedef CArray ::IterEasy IterEasyA; typedef CObjList::IterEasy IterEasyL; CArray VO_CArray; CObjList VO_CObjList; VO_CArray.AddTail(10); VO_CArray.AddTail(20); VO_CArray.AddTail(30); VO_CArray.AddTail(40); VO_CObjList.AddTail(10); VO_CObjList.AddTail(20); VO_CObjList.AddTail(30); VO_CObjList.AddTail(40); IterEasyA VH_IterA = VO_CArray .ItHEasy(); IterEasyL VH_IterL = VO_CObjList.ItHEasy(); class CHelpObj { public: CHelpObj() { } CHelpObj(const CHelpObj& rhs) { cout<<"* CHelpObj(const CHelpObj& rhs)"<