From 6dc1a28af45351278eb2210c560e9b88736b3b41 Mon Sep 17 00:00:00 2001 From: sauron Date: Fri, 26 Feb 2021 17:21:25 +0900 Subject: [PATCH] add ZtCObjList.H --- ZCppMain/CObjList.H | 3208 +++++++++++++++++++++++++++++++++++++++++++++ ZCppMain/ZtCObjList.H | 3208 +++++++++++++++++++++++++++++++++++++++++++++ ZCppMain/ZtCSortObjList.H | 15 + ZCppMain/test.cpp | 5 +- 4 files changed, 6435 insertions(+), 1 deletion(-) create mode 100644 ZCppMain/CObjList.H create mode 100644 ZCppMain/ZtCObjList.H create mode 100644 ZCppMain/ZtCSortObjList.H diff --git a/ZCppMain/CObjList.H b/ZCppMain/CObjList.H new file mode 100644 index 0000000..e7ce252 --- /dev/null +++ b/ZCppMain/CObjList.H @@ -0,0 +1,3208 @@ + + +#ifndef __NSCPP_COBJLIST_H__ +#define __NSCPP_COBJLIST_H__ + + +#include "ZtCSortObjList.H" + + +namespace ZNsMain +{ + + /*///////////////////////////////////////////////////////////////// + + std::CDoubleList template ̳ std::ZtCObjList template ʹ ޸ + ܼϰ Ǿ ִ ḮƮ class ZtCObjList . + + typename TypCInit ٸ ʰ ִ. ٸ Ʈ + Ŭ ø μ ϰ ߱ , ׸ + ϴ ̴ . + + /////////////////////////////////////////////////////////////////*/ + + + template class ZtCSortObjList; + + + template< typename Type , + typename TypCArg =const Type&, + typename TypCAlloc=ZCAllocator, + typename TypCInit =ZCInit , + typename TypSize =ZTypLong + > + class ZtCObjList + { + public: + template friend class ZtCSortObjList; + public: + typedef Type TypeData ; + typedef TypCArg TypeArg ; + typedef TypCAlloc TypeAlloc; + typedef TypCInit TypeInit ; + typedef TypSize TypeSize ; + public: + class ZCIterator; + class ZCLink ; + public: + typedef ZCLink* IterEasy; // ǥ ִ ݺ. + typedef ZCIterator iterator; + typedef const ZCIterator const_iterator; + public: + + class ZCLink : public TypCAlloc + { + public : + template friend class ZtCSortObjList; + /*##########################*/ friend class ZtCObjList ; + private: + Type mo_Type ; + ZCLink* mp_NextLink; + ZCLink* mp_PrevLink; + 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 MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink) + { + AP_HeadLink->mp_PrevLink=AP_TailLink; + AP_TailLink->mp_NextLink=AP_HeadLink; + }/* + static void MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/ + + /*private:*/ + public : + + ZCLink() + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + ZCLink(TypCArg AR_Type):mo_Type(AR_Type) + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + ZCLink(const ZCLink& rhs):mo_Type(rhs.mo_Type) + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + + operator Type& (){return mo_Type;} + operator Type (){return mo_Type;} + Type& GetData (){return mo_Type;} + Type& operator*(){return mo_Type;} + + operator const Type& () const{return mo_Type;} + const Type& GetData () const{return mo_Type;} + const Type& operator*() const{return mo_Type;} + + + ZCLink* GetNextPrevPtr(TypSize 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(TypSize AL_FarNum)*/ + + const ZCLink* GetNextPrevPtr(TypSize AL_FarNum) const // or ZCLink const * const GetNextPrevPtr(TypSize AL_FarNum) const + { + ZCLink* VP_TmpLink=const_cast(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; + }/* + const ZCLink* GetNextPrevPtr(TypSize AL_FarNum) const*/ + + + ZCLink* GetNextPtr(){return mp_NextLink;} + ZCLink* GetPrevPtr(){return mp_PrevLink;} + + const ZCLink* GetNextPtr() const{return mp_NextLink;} + const ZCLink* GetPrevPtr() const{return mp_PrevLink;} + + + ZCLink* GetNextPtr(TypSize AL_Distance) + { + TypSize VL_LoopIndex=0; + + ZCLink* VP_TmpLink=this; + + while(VL_LoopIndex++mp_NextLink; + + return VP_TmpLink; + }/* + ZCLink* GetNextPtr(TypSize AL_Distance)*/ + + ZCLink* GetPrevPtr(TypSize AL_Distance) + { + TypSize VL_LoopIndex=0 ; + ZCLink* VP_TmpLink =this; + + while(VL_LoopIndex++mp_PrevtLink; + + return VP_TmpLink; + }/* + ZCLink* GetPrevPtr(TypSize AL_Distance)*/ + + + const ZCLink* GetNextPtr(TypSize AL_Distance) const + { + TypSize VL_LoopIndex=0; + + ZCLink* VP_TmpLink=const_cast(this); + + while(VL_LoopIndex++mp_NextLink; + + return VP_TmpLink; + }/* + const ZCLink* GetNextPtr(TypSize AL_Distance) const*/ + + const ZCLink* GetPrevPtr(TypSize AL_Distance) const + { + TypSize VL_LoopIndex=0; + ZCLink* VP_TmpLink =const_cast(this); + + while(VL_LoopIndex++mp_PrevtLink; + + return VP_TmpLink; + }/* + const ZCLink* GetPrevPtr(TypSize AL_Distance) const*/ + + + public: + };/* + class ZCLink*/ + + + /*public :*/ + protected: + ZCLink* mp_HeadLink; + TypSize ml_Size ; + protected: + + virtual void OnDelete( + ZCLink* AP_CutHead, TypSize AI_CutHeadPos, + ZCLink* AP_CutTail, TypSize AI_CutTailPos + /*//////////*/ ) + { + // Ŭ ߰ Ÿ ũ ؾ ϴ ̶ + // Լ overload Ͽ Ѵ. + }/* + virtual void OnDelete( + ZCLink* AP_CutHead,TypSize AI_CutHeadPos, + ZCLink* AP_CutTail,TypSize AI_CutTailPos + ////////////// ) */ + + + virtual void OnInsert( + TypSize AI_InsertPos , // ԵǴ ġ + TypSize AI_InsertSize, // ԵǴ ũ + ZCLink* AP_HeadInsert // ԵǴ ù° ũ + /*//////////*/ ) + { + // Ŭ ߰ Ÿ ũ Խ ؾ ϴ ̶ + // Լ overload Ͽ Ѵ. + }/* + virtual void OnInsert( + TypSize AI_InsertPos , + TypSize AI_InsertSize, + ZCLink* AP_HeadInsert + ////////////// ) */ + + + void JoinAfter(ZCLink* AP_LinkInsert, ZCLink* AP_LinkStd, TypSize AL_PosStd) + { + // AP_LinkInsert AL_PosStd ° ũ AP_LinkStd ڿ Ѵ. + // AL_PosStd==0 ̸ տ Ѵ. + + if(AP_LinkStd==0) + { + OnInsert(1,1,AP_LinkInsert); + + if(++ml_Size==1) + { + mp_HeadLink =AP_LinkInsert ; + mp_HeadLink->mp_NextLink=mp_HeadLink ; + mp_HeadLink->mp_PrevLink=mp_HeadLink ; + } + else + { + AP_LinkInsert->mp_NextLink =mp_HeadLink ; + mp_HeadLink->mp_PrevLink->mp_NextLink=AP_LinkInsert ; + AP_LinkInsert->mp_PrevLink =mp_HeadLink->mp_PrevLink ; + mp_HeadLink->mp_PrevLink =AP_LinkInsert ; + + mp_HeadLink=AP_LinkInsert; + }/* + else*/ + } + else + { + OnInsert(AL_PosStd+1, 1, AP_LinkInsert); ++ml_Size; + + AP_LinkInsert->mp_NextLink = AP_LinkStd->mp_NextLink ; + AP_LinkStd ->mp_NextLink = AP_LinkInsert ; + + AP_LinkInsert->mp_PrevLink =AP_LinkStd ; + AP_LinkInsert->mp_NextLink->mp_PrevLink=AP_LinkInsert; + }/* + else*/ + }/* + void JoinAfter(ZCLink* AP_LinkInsert, ZCLink* AP_LinkStd, TypSize AL_PosStd)*/ + + + public : void JoinAfter(ZtCObjList& AO_CObjList, ZCLink* AP_LinkStd, TypSize AL_PosStd) + { + #ifdef _DEBUG + + if(AP_LinkStd!=0 && Find(AP_LinkStd)!=AL_PosStd) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink; + + ZCLink::MakeCircle(AO_CObjList.mp_HeadLink, mp_HeadLink->mp_PrevLink); + ZCLink::JoinLink (VP_TailLink,mp_HeadLink ); + + mp_HeadLink = AO_CObjList.mp_HeadLink; + ml_Size += AO_CObjList.ml_Size ; + }/* + else*/ + } + else // AP_LinkStd!=0 + { + ZCLink* VP_TailLink=AO_CObjList.mp_HeadLink->mp_PrevLink; + + ZCLink::JoinLink(VP_TailLink, AP_LinkStd->mp_NextLink); + ZCLink::JoinLink(AP_LinkStd , AO_CObjList.mp_HeadLink); + + ml_Size += AO_CObjList.ml_Size ; + }/* + else // AP_LinkStd!=0*/ + + AO_CObjList.mp_HeadLink=0; + AO_CObjList.ml_Size =0; + }/* + void JoinAfter(ZtCObjList& AO_CObjList, ZCLink* AP_LinkStd, TypSize AL_PosStd)*/ + + + protected: ZCLink* CutLink(ZCLink* AP_CutLink) + { + // Ϸ ũ ġ Ƿ ũ Ѵٴ ȣ . + + OnDelete(mp_HeadLink, 1, mp_HeadLink->mp_PrevLink, ml_Size); + + if(AP_CutLink==mp_HeadLink) + { + if(mp_HeadLink==mp_HeadLink->mp_PrevLink) + mp_HeadLink=0; + else + { + ZCLink::MakeCircle( mp_HeadLink=mp_HeadLink->mp_NextLink, + AP_CutLink->mp_PrevLink + /*////////////*/ ); + }/* + else*/ + } + else if(AP_CutLink==mp_HeadLink->mp_PrevLink) + ZCLink::MakeCircle(mp_HeadLink , AP_CutLink->mp_PrevLink); + else ZCLink::JoinLink (AP_CutLink->mp_PrevLink, AP_CutLink->mp_NextLink); + + return (--ml_Size, AP_CutLink); + }/* + ZCLink* CutLink(ZCLink* AP_CutLink)*/ + + + ZCLink* CutLink(ZCLink* AP_CutLink, TypSize AL_CutPos) + { + OnDelete(AP_CutLink, AL_CutPos, AP_CutLink, AL_CutPos); + + if(AL_CutPos==1) // ù° ũ . + { + if(ml_Size==1) + mp_HeadLink=0; + else + { + ZCLink::MakeCircle( mp_HeadLink=mp_HeadLink->mp_NextLink, + AP_CutLink->mp_PrevLink + /*////////////*/ ); + }/* + else*/ + } + else if(AL_CutPos==ml_Size) // ũ + ZCLink::MakeCircle(mp_HeadLink , AP_CutLink->mp_PrevLink); + else ZCLink::JoinLink (AP_CutLink->mp_PrevLink, AP_CutLink->mp_NextLink); + + return (--ml_Size, AP_CutLink); + }/* + ZCLink* CutLink(ZCLink* AP_CutLink, TypSize AL_CutPos)*/ + + + ZtCObjList& CutLink( + ZCLink* AP_CutHead, TypSize AL_CutHeadPos, + ZCLink* AP_CutTail, TypSize AL_CutTailPos, ZtCObjList& ARR_StoreList + /*//////////////*/ ) + { + // AP_CutHead Ϸ ũ ũ, AL_CutHeadPos ġ + // AP_CutTail Ϸ ũ ũ, AL_CutTailPos ġ + // AL_CutHeadPos <= AL_CutTailPos + + + #ifdef _DEBUG + + if(AL_CutHeadPos>AL_CutTailPos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos"<AL_CutTailPos)*/ + + #endif // _DEBUG + + + OnDelete(AP_CutHead, AL_CutHeadPos, AP_CutTail, AL_CutTailPos); + + if(AL_CutHeadPos==1 && AL_CutTailPos==ml_Size) // ũ . + { + mp_HeadLink=0; + } + else if(AL_CutHeadPos==1) // ߶󳻷 ũ ó ũ . + { + ZCLink::MakeCircle(mp_HeadLink=AP_CutTail->mp_NextLink, AP_CutHead->mp_PrevLink); + } + else if(AL_CutTailPos==ml_Size) // ߶󳻷 ũ ũ . + { + ZCLink::MakeCircle(mp_HeadLink, AP_CutHead->mp_PrevLink); + } + else // ߶󳻷 ũ ó ũ . + { + ZCLink::JoinLink(AP_CutHead ->mp_PrevLink, AP_CutTail->mp_NextLink); + }/* + else*/ + + ml_Size -= AL_CutTailPos-AL_CutHeadPos+1 ; + + // AP_CutHead AP_CutTail Ͽ + // ḮƮ ǵ Ѵ. + + ZCLink::MakeCircle(AP_CutHead, AP_CutTail); + + + #ifdef _DEBUG + + if(ARR_StoreList.IsEmpty()!=true) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetNextPrevPtr(AL_FarNum) ũ Ѵ. + // AL_FarNum 0 ̰ų ִ. + // (FarNum 밪) + 1 ũ . + + #ifdef _DEBUG + + if(ARR_StoreList.IsEmpty()!=true) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<(AP_CopyLink), + AL_FarNum , + VP_HeadLink, + VP_TailLink + /*//////////*/ ); ////////////////////////////// + + ZCLink::MakeCircle(VP_HeadLink, VP_TailLink); + + ARR_StoreList.mp_HeadLink=VP_HeadLink; + ARR_StoreList.ml_Size =(AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 ; + + return ARR_StoreList; + }/* + ZtCObjList& CopyLink( const ZCLink* AP_CopyLink, + TypSize AL_FarNum , + ZtCObjList& ARR_StoreList + ///////////////// ) const */ + + + ZtCObjList& CopyThis(ZtCObjList& ARR_StoreList) const + { + return CopyLink(mp_HeadLink, ml_Size-1, RR(ARR_StoreList)); + }/* + ZtCObjList& CopyThis(ZtCObjList& ARR_StoreList) const*/ + + + ZtCObjList& MakeDefault(TypSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const + { + // must AL_DefaultSize > 0 + + ZCLink* VP_HeadLink=0; + ZCLink* VP_TailLink=0; + + GetManyLink(AL_DefaultSize, VP_HeadLink, VP_TailLink); + ZCLink::MakeCircle(VP_HeadLink, VP_TailLink); + + ARR_StoreList.mp_HeadLink=VP_HeadLink ; + ARR_StoreList.ml_Size =AL_DefaultSize; + + return ARR_StoreList; + }/* + ZtCObjList& MakeDefault(TypSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const*/ + + + void GetManyLink( + TypSize AL_LinkSize , + ZCLink*& APR_HeadLink, + ZCLink*& APR_TailLink + /*///////////*/ ) const + { + #ifdef _DEBUG + std::CCheckAlloc::CAllowAlloc VO_CAllowAllocObj; + #endif //_DEBUG + + APR_HeadLink=new ZCLink; ZCLink* VP_TempLink=APR_HeadLink; + + for(TypSize i=2; i<=AL_LinkSize; ++i) + { + ZCLink::JoinLink(VP_TempLink, new ZCLink); + + VP_TempLink=VP_TempLink->mp_NextLink; + }/* + for(TypSize i=2; i<=AL_LinkSize; ++i)*/ + + APR_TailLink=VP_TempLink; + }/* + void GetManyLink( + TypSize AL_LinkSize , + ZCLink*& APR_HeadLink, + ZCLink*& APR_TailLink + /////////////// ) const */ + + + void GetManyLinkCopy( + ZCLink* AP_CopyLink , TypSize AL_FarNum , + ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + /*///////////////*/ ) const + { + // AL_FarNum 밪 + 1 ũ ȴ. + + #ifdef _DEBUG + std::CCheckAlloc::CAllowAlloc VO_CAllowAllocObj; + #endif + + if(AL_FarNum>0) + { + APR_HeadLink= + new ZCLink(AP_CopyLink->GetData()); + + ZCLink* VP_TempLink=APR_HeadLink; + + for(TypSize i=1; i<=AL_FarNum; ++i) + { + AP_CopyLink=AP_CopyLink->mp_NextLink; + + ZCLink::JoinLink( + VP_TempLink, new ZCLink(AP_CopyLink->GetData())); + + VP_TempLink=VP_TempLink->mp_NextLink; + }/* + for(TypSize i=1; i<=AL_FarNum; ++i)*/ + + APR_TailLink=VP_TempLink; + } + else //AL_FarNum<=0 + { + APR_TailLink= + new ZCLink(AP_CopyLink->GetData()); + + ZCLink* VP_TempLink=APR_TailLink; + + for(TypSize i=AL_FarNum; i<0; ++i) + { + AP_CopyLink=AP_CopyLink->mp_PrevLink; + + ZCLink::JoinLink( + VP_TempLink, new ZCLink(AP_CopyLink->GetData())); + + VP_TempLink=VP_TempLink->mp_PrevLink; + }/* + for(TypSize i=AL_FarNum; i<0; ++i)*/ + + APR_HeadLink=VP_TempLink; + }/* + else //AL_FarNum<=0*/ + }/* + void GetManyLinkCopy( + ZCLink* AP_CopyLink , TypSize AL_FarNum , + ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + ////////////////// ) const */ + + + /*protected:*/ + public : + + + ZtCObjList() + { + mp_HeadLink=0; + ml_Size =0; + }/* + ZtCObjList()*/ + + ZtCObjList(const ZtCObjList& rhs):mp_HeadLink(0),ml_Size(0) + { + *this=rhs; + }/* + ZtCObjList(const ZtCObjList& rhs)*/ + + + virtual ~ZtCObjList() + { + DeleteAll(); + }/* + virtual ~ZtCObjList()*/ + + + ZtCObjList& operator=(const ZtCObjList& rhs) + { + if(rhs.ml_Size<1) + { + return DeleteAll(); + } + else if(ml_Size<=rhs.ml_Size) + { + AddDefault(rhs.ml_Size-ml_Size,ml_Size+1); + + ZCLink* pRhsLink=rhs.mp_HeadLink; + ZCLink* pLhsLink= mp_HeadLink; + + __for1(TypSize, i, ml_Size) + { + pLhsLink->GetData()=pRhsLink->GetData(); + + pLhsLink=pLhsLink->mp_NextLink; + pRhsLink=pRhsLink->mp_NextLink; + }/* + __for1(TypSize, i, ml_Size)*/ + } + else + { + ZtCObjList VO_StoreList; + + CutLink( GetLinkPtr(rhs.ml_Size+1),rhs.ml_Size+1, + GetLinkPtr( ml_Size ), ml_Size , + RR(VO_StoreList) + /****/ ).DeleteAll(); ////////////////////////////// + }/* + else*/ + + return *this; + }/* + ZtCObjList& operator=(const ZtCObjList& rhs)*/ + + + bool IsEmpty() const + { + return mp_HeadLink==0 ; + }/* + bool IsEmpty() const*/ + + + TypSize GetSize() const{return ml_Size;} + TypSize size () const{return ml_Size;} + + ZCLink* GetHeadLinkPtr(){return mp_HeadLink;} + ZCLink* GetTailLinkPtr() + { + return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; + }/* + ZCLink* GetTailLinkPtr()*/ + + + const ZCLink* GetHeadLinkPtr() const{return mp_HeadLink;} + const ZCLink* GetTailLinkPtr() const + { + return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; + }/* + const ZCLink* GetTailLinkPtr() const*/ + + + 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();} + IterEasyID GetHeadIterEasyID() const{return (IterEasyID)GetHeadLinkPtr();} + IterEasyID GetTailIterEasyID() const{return (IterEasyID)GetTailLinkPtr();} + + IterEasyID ItHead() {return GetHeadIterEasyID();} + IterEasyID ItTail() {return GetTailIterEasyID();} + + IterEasyID ItHead() const{return GetHeadIterEasyID();} + IterEasyID ItTail() const{return GetTailIterEasyID();} + + + Type& operator[](TypSize AL_Index) + { + // []  AL_Index 1 ϴ ÷̴. + + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AL_Index)->GetData(); + }/* + Type& operator[](TypSize AL_Index)*/ + + const Type& operator[](TypSize AL_Index) const + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AL_Index)->GetData(); + }/* + Type& operator[](TypSize AL_Index) const*/ + + + TypSize Find(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + // AB_DoFindFromFront==true ̸ AL_FirstFindIndex ° ũ + // ũ ȸϸ鼭 GetData() == AR_SearchType Ǵ + // ġ ȯѴ. + + const bool CB_IsTrue = ( + mp_HeadLink == 0 || + AL_FirstFindIndex < 1 || + AL_FirstFindIndex > ml_Size + /*//////////////////*/ ) ; + + if(CB_IsTrue) return 0; + + TypSize VL_FindIndex=AL_FirstFindIndex; const + ZCLink* VP_TempLink =GetLinkPtr(AL_FirstFindIndex); + + if(AB_DoFindFromFront==true) + { + do ///////// + { + if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; + if(VL_FindIndex ==ml_Size ) return 0 ; + + VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; + } + while(true); + } + else // AB_DoFindFromFront!=true + { + do ///////// + { + if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; + if(VL_FindIndex ==1 ) return 0 ; + + VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; + } + while(true); + }/* + else // AB_DoFindFromFront!=true*/ + + return 0; + }/* + TypSize Find(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + TypSize Find(const ZCLink* AP_SearchLink, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + if(mp_HeadLink==0 || AL_FirstFindIndex<1 || AL_FirstFindIndex>ml_Size) + return 0; + //endif + + TypSize VL_FindIndex=AL_FirstFindIndex; + ZCLink* VP_TempLink =const_cast(GetLinkPtr(AL_FirstFindIndex)); + + if(AB_DoFindFromFront==true) + { + do /**/ + { + if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; + if(VL_FindIndex==ml_Size ) return 0 ; + + VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; + } + while(true); + } + else // AB_DoFindFromFront!=true + { + do /**/ + { + if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; + if(VL_FindIndex==1 ) return 0 ; + + VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; + } + while(true); + }/* + else // AB_DoFindFromFront!=true*/ + + return 0; + }/* + TypSize Find(ZCLink* AP_SearchLink, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + + /*//////////////////////////////////////////////////////////////////////////////////////// + + FindData(TypeCArg, ~) Լ ٸ, TypeCArg const Type& ǵǾ ִ , + const Type& ؼ ã⸦ ְ, Type& ؼ ã⸦ . + + -- 2010-05-29 21:31:00 + + ////////////////////////////////////////////////////////////////////////////////////////*/ + + TypSize FindData(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + return Find(AR_SearchType, AL_FirstFindIndex, AB_DoFindFromFront); + }/* + TypSize FindData(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + + ZCLink* GetLinkPtr(TypSize AL_Index) + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif // _DEBUG + + TypSize VI_LeftDistance =AL_Index-1 ; + TypSize VI_RightDistance=ml_Size-AL_Index+1; + TypSize VI_ShortDistance= + (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); + + return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); + }/* + ZCLink* GetLinkPtr(TypSize AL_Index)*/ + + const ZCLink* GetLinkPtr(TypSize AL_Index) const // or 'ZCLink const * const GetLinkPtr(TypSize AL_Index) const' + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif // _DEBUG + + TypSize VI_LeftDistance =AL_Index-1 ; + TypSize VI_RightDistance=ml_Size-AL_Index+1; + TypSize VI_ShortDistance= + (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); + + return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); + }/* + const ZCLink* GetLinkPtr(TypSize AL_Index) const*/ + + + ZtCObjList& DeleteAll() + { + if(mp_HeadLink!=0) + { + OnDelete( + mp_HeadLink, 1, mp_HeadLink->mp_PrevLink, ml_Size); + + ZCLink* VP_DelLink=0; + + do //// + { + VP_DelLink =mp_HeadLink; + mp_HeadLink=mp_HeadLink->mp_NextLink; + + delete VP_DelLink; + } + while(--ml_Size>0); + + mp_HeadLink =0; + }/* + if(mp_HeadLink!=0)*/ + + return *this; + }/* + ZtCObjList& DeleteAll()*/ + + ZtCObjList& clear() + { + return this->DeleteAll(); + }/* + ZtCObjList& clear()*/ + + + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink) + { + #ifdef _DEBUG + + if(Find(AP_DeleteLink)<1) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<CutLink(AP_DeleteLink); return *this; + }/* + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink)*/ + + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink, TypSize AL_DeletePos) + { + #ifdef _DEBUG + + if(AL_DeletePos<1 || Find(AP_DeleteLink)!=AL_DeletePos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<CutLink(AP_DeleteLink, AL_DeletePos); return *this; + }/* + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink, TypSize AL_DeletePos)*/ + + + ZtCObjList& Delete(ZCLink* AP_DeleteLink) + { + return DeleteLink(AP_DeleteLink); + }/* + ZtCObjList& Delete(ZCLink* AP_DeleteLink)*/ + + ZtCObjList& Delete(ZCLink* AP_DeleteLink, TypSize AL_DeletePos) + { + return DeleteLink(AP_DeleteLink, AL_DeletePos); + }/* + ZtCObjList& Delete(ZCLink* AP_DeleteLink, TypSize AL_DeletePos)*/ + + ZtCObjList& DeleteLink(TypSize AL_DeletePos) + { + if(AL_DeletePos<1 || this->ml_Size>AL_DeletePos) return *this; + + Delete(this->GetLinkPtr(AL_DeletePos), AL_DeletePos); return *this; + }/* + ZtCObjList& DeleteLink(TypSize AL_DeletePos)*/ + + + ZtCObjList& DeleteHead() + { + if(ml_Size>0) + delete this->CutLink(mp_HeadLink); + + return *this; + }/* + ZtCObjList& DeleteHead()*/ + + ZtCObjList& DeleteHead(TypSize AI_DeleteCnt) + { + __for1(TypSize, i, AI_DeleteCnt) + { + if(ml_Size<1) return *this; + + delete this->CutLink(mp_HeadLink); + }/* + __for1(TypSize, i, AI_DeleteCnt)*/ + + return *this; + }/* + ZtCObjList& DeleteHead(TypSize AI_DeleteCnt)*/ + + ZtCObjList& DeleteTail() + { + if(ml_Size>0) + delete this->CutLink(mp_HeadLink->mp_PrevLink); + + return *this; + }/* + ZtCObjList& DeleteTail()*/ + + + ZCLink* AddDefault(TypSize AL_DefaultSize, TypSize AL_AddPos) + { + if(AL_DefaultSize<1 || AL_AddPos<1 || AL_AddPos>ml_Size+1) + return 0; + ////////////////////////////////////////////////////////// + + ZtCObjList VO_StoreList; MakeDefault( + AL_DefaultSize, VO_StoreList); + + ZCLink* VP_HeadLink=VO_StoreList.mp_HeadLink; + + if(AL_AddPos==1) + JoinAfter(VO_StoreList, 0 , 1 ); + else JoinAfter(VO_StoreList, GetLinkPtr(AL_AddPos-1), AL_AddPos-1); + + return VP_HeadLink; + }/* + ZCLink* AddDefault(TypSize AL_DefaultSize, TypSize AL_AddPos)*/ + + + ZtCObjList& AddHead(TypCArg AR_Type) + { + JoinAfter(new ZCLink(AR_Type), 0, 0); return *this; + }/* + ZtCObjList& AddHead(TypCArg AR_Type)*/ + + ZtCObjList& AddHead(const ZtCObjList& rhs) + { + if(this==&rhs) return *this; + + ZtCObjList VO_StoreList(rhs); + + JoinAfter(VO_StoreList, 0, 0); return *this; + }/* + ZtCObjList& AddHead(const ZtCObjList& rhs)*/ + + + ZCLink* AddHeadDefault() + { + /* Ʒ ڵ return return *this Ǿ ־. 10 Ⱓ ̸ + ̴. ڱ׸ġ 10 Ⱓ! -- 2015-02-21- 21:36:00 + */ + ZCLink* VP_NewLink=new ZCLink; JoinAfter(VP_NewLink, 0, 0); return VP_NewLink; + }/* + ZCLink& AddHeadDefault()*/ + + + ZtCObjList& AddTail(TypCArg AR_Type) + { + JoinAfter(new ZCLink(AR_Type), GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& AddTail(TypCArg AR_Type)*/ + + ZtCObjList& AddTail(const ZtCObjList& rhs) + { + ZtCObjList VO_StoreList(rhs); return JoinTail(VO_StoreList); + }/* + ZtCObjList& AddTail(const ZtCObjList& rhs)*/ + + + ZCLink* AddTailDefault() + { + ZCLink* VP_NewLink=new ZCLink; + + JoinAfter( + VP_NewLink, GetTailLinkPtr(), ml_Size); + + return VP_NewLink; + }/* + ZCLink* AddTailDefault()*/ + + + ZtCObjList& pop_back (TypCArg AR_Type){return AddHead(AR_Type);} + ZtCObjList& push_back(TypCArg AR_Type){return AddTail(AR_Type);} + + + ZtCObjList& JoinHead(ZtCObjList& rhs) + { + JoinAfter(rhs, 0, 0); return *this; + }/* + ZtCObjList& JoinHead(ZtCObjList& rhs)*/ + + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink) + { + // rhs AP_CLink Ѵ. + // ϴ ڷ mp_HeadLink ڷ δ. + + JoinAfter(rhs.CutLink(AP_CLink), GetTailLinkPtr(), ml_Size); + + mp_HeadLink=mp_HeadLink->GetPrevPtr(); return *this; + }/* + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + + ZtCObjList& JoinTail(ZtCObjList& rhs) + { + JoinAfter(rhs, GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& JoinTail(ZtCObjList& rhs)*/ + + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink) + { + // rhs AP_CLink ڷ Ѵ. + + JoinAfter(rhs.CutLink(AP_CLink), GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + + + ZtCObjList& JoinAfter( + ZtCObjList& rhs , + ZCLink* AP_LinkOfRhs , + TypSize AL_AddPosOfRhs , + ZCLink* AP_LinkStd , + TypSize AL_PosStd + /*////////////////*/ ) + { + // rhs AP_LinkOfRhs ũ ߶ AP_LinkStd տ δ. + + #ifdef _DEBUG + + if(rhs.Find(AP_LinkOfRhs)!=AL_AddPosOfRhs || (AP_LinkStd!=0 && Find(AP_LinkStd)!=AL_PosStd) ) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos"<AL_CutTailPos)*/ + + #endif // _DEBUG + + + OnDelete(AP_CutHead, AL_CutHeadPos, AP_CutTail, AL_CutTailPos); + + if(AL_CutHeadPos==1 && AL_CutTailPos==ml_Size) // ũ . + { + mp_HeadLink=0; + } + else if(AL_CutHeadPos==1) // ߶󳻷 ũ ó ũ . + { + ZCLink::MakeCircle(mp_HeadLink=AP_CutTail->mp_NextLink, AP_CutHead->mp_PrevLink); + } + else if(AL_CutTailPos==ml_Size) // ߶󳻷 ũ ũ . + { + ZCLink::MakeCircle(mp_HeadLink, AP_CutHead->mp_PrevLink); + } + else // ߶󳻷 ũ ó ũ . + { + ZCLink::JoinLink(AP_CutHead ->mp_PrevLink, AP_CutTail->mp_NextLink); + }/* + else*/ + + ml_Size -= AL_CutTailPos-AL_CutHeadPos+1 ; + + + // CutLink(ZCLink*,TypSize,ZCLink*,TypSize,ZtCObjList&) . Ŀ CutLink() + // ARR_StoreList ִ , CutLinkOut() ARR_StoreList + // 쿡 Ѵ. + + if(ARR_StoreList.ml_Size<1) + { + // AP_CutHead AP_CutTail Ͽ ḮƮ ǵ Ѵ. + + ZCLink::MakeCircle(AP_CutHead, AP_CutTail); + + ARR_StoreList.mp_HeadLink=AP_CutHead ; + ARR_StoreList.ml_Size =AL_CutTailPos-AL_CutHeadPos+1; + } + else + { + ZCLink::JoinLink (ARR_StoreList.mp_HeadLink->mp_PrevLink, AP_CutHead); + ZCLink::MakeCircle(ARR_StoreList.mp_HeadLink , AP_CutTail); + + ARR_StoreList.ml_Size += AL_CutTailPos-AL_CutHeadPos+1 ; + }/* + else*/ + + return ARR_StoreList; + }/* + ZtCObjList& CutLinkOut( + ZCLink* AP_CutHead, TypSize AL_CutHeadPos, + ZCLink* AP_CutTail, TypSize AL_CutTailPos, + ZtCObjList& ARR_StoreList + ///////////// ) */ + + + + operator Type&() + { + return AddDefault(1, ml_Size+1)->GetData(); + }/* + operator Type&()*/ + + + Type& GetData(TypSize AI_Index) + { + #ifdef _DEBUG + + if(AI_Index<1 || AI_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AI_Index)->GetData(); + }/* + Type& GetData(TypSize AI_Index)*/ + + + const Type& GetData(TypSize AI_Index) const + { + #ifdef _DEBUG + + if(AI_Index<1 || AI_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AI_Index)->GetData(); + }/* + const Type& GetData(TypSize AI_Index) const*/ + + + Type& GetHeadData() + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetData(); + }/* + Type& GetHeadData()*/ + + const Type& GetHeadData() const + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetData(); + }/* + const Type& GetHeadData() const*/ + + + Type& GetTailData() + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink->GetData(); + }/* + Type& GetTailData()*/ + + const Type& GetTailData() const + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink->GetData(); + }/* + const Type& GetTailData() const*/ + + + Type& front(){return GetHeadData();} + Type& back (){return GetTailData();} + + const Type& front() const{return GetHeadData();} + const Type& back () const{return GetTailData();} + + + ZtCObjList& Rotate(TypSize AL_RotateNum) + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->GetNextPrevPtr(AL_RotateNum); + + return *this; + }/* + ZtCObjList& Rotate(TypSize AL_RotateNum)*/ + + ZtCObjList& Rotate() + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->mp_NextLink; + + return *this; + }/* + ZtCObjList& Rotate()*/ + + ZtCObjList& RotateBack() + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->mp_PrevLink; + + return *this; + }/* + ZtCObjList& RotateBack()*/ + + + template void IterElement(TFunctor AO_Functor) + { + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T::GetObjRef(AO_Functor)(VP_LoopLink->mo_Type); + + /* ڵ ؼ, AO_Functor Լ ƴ϶, operator() + ڸ object ְ Ǿ. */ + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template void IterElement(TFunctor AO_Functor) */ + + template + void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) + { + /*///////////////////////////////////////////////////////////////////////////// + + TTypeHelp class , ũⰡ Ŀ Ѿ Ѵٸ, + + IterElement(myFunctor_obj, myClass_Obj); + + · ȣ ƴ϶, std::CObjectPtr_T<> Ͽ, + + myClass myClass_Obj; std::CObjectPtr_T myCObjPtr(myClass_Obj); + + + + IterElement(myFunctor_obj, std::CObjectPtr_T(myClass_Obj)); + + ¸ ϸ . -- 2014-06-16 23:11:00 + + /////////////////////////////////////////////////////////////////////////////*/ + + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T:: + GetObjRef(AO_Functor)(VP_LoopLink->mo_Type, AO_TypeHelp); + + /* ڵ ؼ, AO_Functor Լ ƴ϶, operator() + ڸ object ְ Ǿ. */ + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template + void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ + + + template + void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) + { + /* TTypeHelp ް Ѵ. -- 2015-09-07 02:55:00 */ + + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T:: + GetObjRef(AO_Functor)(VP_LoopLink->mo_Type, AR_TypeHelp); + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template + void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) */ + + + /*/////////////////////////////////////////////////////////////////////////// + + IterElement() . + + #include + #include "ZtCObjList.H" + + using namespace std; + + int main() + { + ZNsMain:: ZtCObjList myArray; + + myArray.AddTail(10); + myArray.AddTail(20); + myArray.AddTail(30); + myArray.AddTail(40); + + struct StFunctor + { + static void ShowElement(int ArgiValue){cout<<"# Value="< class ZtCSortObjList; + + + template< typename Type , + typename TypCArg =const Type&, + typename TypCAlloc=ZCAllocator, + typename TypCInit =ZCInit , + typename TypSize =ZTypLong + > + class ZtCObjList + { + public: + template friend class ZtCSortObjList; + public: + typedef Type TypeData ; + typedef TypCArg TypeArg ; + typedef TypCAlloc TypeAlloc; + typedef TypCInit TypeInit ; + typedef TypSize TypeSize ; + public: + class ZCIterator; + class ZCLink ; + public: + typedef ZCLink* IterEasy; // 가장 대표적으로 쓰일 수 있는 반복자. + typedef ZCIterator iterator; + typedef const ZCIterator const_iterator; + public: + + class ZCLink : public TypCAlloc + { + public : + template friend class ZtCSortObjList; + /*##########################*/ friend class ZtCObjList ; + private: + Type mo_Type ; + ZCLink* mp_NextLink; + ZCLink* mp_PrevLink; + 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 MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink) + { + AP_HeadLink->mp_PrevLink=AP_TailLink; + AP_TailLink->mp_NextLink=AP_HeadLink; + }/* + static void MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/ + + /*private:*/ + public : + + ZCLink() + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + ZCLink(TypCArg AR_Type):mo_Type(AR_Type) + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + ZCLink(const ZCLink& rhs):mo_Type(rhs.mo_Type) + { + mp_NextLink=0; + mp_PrevLink=0; + }/* + ZCLink(TypCArg AR_Type)*/ + + + operator Type& (){return mo_Type;} + operator Type (){return mo_Type;} + Type& GetData (){return mo_Type;} + Type& operator*(){return mo_Type;} + + operator const Type& () const{return mo_Type;} + const Type& GetData () const{return mo_Type;} + const Type& operator*() const{return mo_Type;} + + + ZCLink* GetNextPrevPtr(TypSize 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(TypSize AL_FarNum)*/ + + const ZCLink* GetNextPrevPtr(TypSize AL_FarNum) const // or ZCLink const * const GetNextPrevPtr(TypSize AL_FarNum) const + { + ZCLink* VP_TmpLink=const_cast(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; + }/* + const ZCLink* GetNextPrevPtr(TypSize AL_FarNum) const*/ + + + ZCLink* GetNextPtr(){return mp_NextLink;} + ZCLink* GetPrevPtr(){return mp_PrevLink;} + + const ZCLink* GetNextPtr() const{return mp_NextLink;} + const ZCLink* GetPrevPtr() const{return mp_PrevLink;} + + + ZCLink* GetNextPtr(TypSize AL_Distance) + { + TypSize VL_LoopIndex=0; + + ZCLink* VP_TmpLink=this; + + while(VL_LoopIndex++mp_NextLink; + + return VP_TmpLink; + }/* + ZCLink* GetNextPtr(TypSize AL_Distance)*/ + + ZCLink* GetPrevPtr(TypSize AL_Distance) + { + TypSize VL_LoopIndex=0 ; + ZCLink* VP_TmpLink =this; + + while(VL_LoopIndex++mp_PrevtLink; + + return VP_TmpLink; + }/* + ZCLink* GetPrevPtr(TypSize AL_Distance)*/ + + + const ZCLink* GetNextPtr(TypSize AL_Distance) const + { + TypSize VL_LoopIndex=0; + + ZCLink* VP_TmpLink=const_cast(this); + + while(VL_LoopIndex++mp_NextLink; + + return VP_TmpLink; + }/* + const ZCLink* GetNextPtr(TypSize AL_Distance) const*/ + + const ZCLink* GetPrevPtr(TypSize AL_Distance) const + { + TypSize VL_LoopIndex=0; + ZCLink* VP_TmpLink =const_cast(this); + + while(VL_LoopIndex++mp_PrevtLink; + + return VP_TmpLink; + }/* + const ZCLink* GetPrevPtr(TypSize AL_Distance) const*/ + + + public: + };/* + class ZCLink*/ + + + /*public :*/ + protected: + ZCLink* mp_HeadLink; + TypSize ml_Size ; + protected: + + virtual void OnDelete( + ZCLink* AP_CutHead, TypSize AI_CutHeadPos, + ZCLink* AP_CutTail, TypSize AI_CutTailPos + /*//////////*/ ) + { + // 상속클래스에서 추가된 멤버 데이타가 링크의 삭제시 변해야 하는 값이라면 + // 이 함수를 overload 하여 값을 조종한다. + }/* + virtual void OnDelete( + ZCLink* AP_CutHead,TypSize AI_CutHeadPos, + ZCLink* AP_CutTail,TypSize AI_CutTailPos + ////////////// ) */ + + + virtual void OnInsert( + TypSize AI_InsertPos , // 삽입되는 위치 + TypSize AI_InsertSize, // 삽입되는 링크의 갯수 + ZCLink* AP_HeadInsert // 삽입되는 첫번째 링크의 포인터 + /*//////////*/ ) + { + // 상속클래스에서 추가된 멤버 데이타가 링크의 삽입시 변해야 하는 값이라면 + // 이 함수를 overload 하여 값을 조종한다. + }/* + virtual void OnInsert( + TypSize AI_InsertPos , + TypSize AI_InsertSize, + ZCLink* AP_HeadInsert + ////////////// ) */ + + + void JoinAfter(ZCLink* AP_LinkInsert, ZCLink* AP_LinkStd, TypSize AL_PosStd) + { + // AP_LinkInsert 를 AL_PosStd 번째 링크인 AP_LinkStd 뒤에 삽입한다. + // AL_PosStd==0 이면 맨 앞에 삽입한다. + + if(AP_LinkStd==0) + { + OnInsert(1,1,AP_LinkInsert); + + if(++ml_Size==1) + { + mp_HeadLink =AP_LinkInsert ; + mp_HeadLink->mp_NextLink=mp_HeadLink ; + mp_HeadLink->mp_PrevLink=mp_HeadLink ; + } + else + { + AP_LinkInsert->mp_NextLink =mp_HeadLink ; + mp_HeadLink->mp_PrevLink->mp_NextLink=AP_LinkInsert ; + AP_LinkInsert->mp_PrevLink =mp_HeadLink->mp_PrevLink ; + mp_HeadLink->mp_PrevLink =AP_LinkInsert ; + + mp_HeadLink=AP_LinkInsert; + }/* + else*/ + } + else + { + OnInsert(AL_PosStd+1, 1, AP_LinkInsert); ++ml_Size; + + AP_LinkInsert->mp_NextLink = AP_LinkStd->mp_NextLink ; + AP_LinkStd ->mp_NextLink = AP_LinkInsert ; + + AP_LinkInsert->mp_PrevLink =AP_LinkStd ; + AP_LinkInsert->mp_NextLink->mp_PrevLink=AP_LinkInsert; + }/* + else*/ + }/* + void JoinAfter(ZCLink* AP_LinkInsert, ZCLink* AP_LinkStd, TypSize AL_PosStd)*/ + + + public : void JoinAfter(ZtCObjList& AO_CObjList, ZCLink* AP_LinkStd, TypSize AL_PosStd) + { + #ifdef _DEBUG + + if(AP_LinkStd!=0 && Find(AP_LinkStd)!=AL_PosStd) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink; + + ZCLink::MakeCircle(AO_CObjList.mp_HeadLink, mp_HeadLink->mp_PrevLink); + ZCLink::JoinLink (VP_TailLink,mp_HeadLink ); + + mp_HeadLink = AO_CObjList.mp_HeadLink; + ml_Size += AO_CObjList.ml_Size ; + }/* + else*/ + } + else // AP_LinkStd!=0 + { + ZCLink* VP_TailLink=AO_CObjList.mp_HeadLink->mp_PrevLink; + + ZCLink::JoinLink(VP_TailLink, AP_LinkStd->mp_NextLink); + ZCLink::JoinLink(AP_LinkStd , AO_CObjList.mp_HeadLink); + + ml_Size += AO_CObjList.ml_Size ; + }/* + else // AP_LinkStd!=0*/ + + AO_CObjList.mp_HeadLink=0; + AO_CObjList.ml_Size =0; + }/* + void JoinAfter(ZtCObjList& AO_CObjList, ZCLink* AP_LinkStd, TypSize AL_PosStd)*/ + + + protected: ZCLink* CutLink(ZCLink* AP_CutLink) + { + // 삭제하려는 링크의 위치값을 알 수 없으므로 모든 링크를 삭제한다는 신호를 보낸다. + + OnDelete(mp_HeadLink, 1, mp_HeadLink->mp_PrevLink, ml_Size); + + if(AP_CutLink==mp_HeadLink) + { + if(mp_HeadLink==mp_HeadLink->mp_PrevLink) + mp_HeadLink=0; + else + { + ZCLink::MakeCircle( mp_HeadLink=mp_HeadLink->mp_NextLink, + AP_CutLink->mp_PrevLink + /*////////////*/ ); + }/* + else*/ + } + else if(AP_CutLink==mp_HeadLink->mp_PrevLink) + ZCLink::MakeCircle(mp_HeadLink , AP_CutLink->mp_PrevLink); + else ZCLink::JoinLink (AP_CutLink->mp_PrevLink, AP_CutLink->mp_NextLink); + + return (--ml_Size, AP_CutLink); + }/* + ZCLink* CutLink(ZCLink* AP_CutLink)*/ + + + ZCLink* CutLink(ZCLink* AP_CutLink, TypSize AL_CutPos) + { + OnDelete(AP_CutLink, AL_CutPos, AP_CutLink, AL_CutPos); + + if(AL_CutPos==1) // 첫째 링크를 삭제. + { + if(ml_Size==1) + mp_HeadLink=0; + else + { + ZCLink::MakeCircle( mp_HeadLink=mp_HeadLink->mp_NextLink, + AP_CutLink->mp_PrevLink + /*////////////*/ ); + }/* + else*/ + } + else if(AL_CutPos==ml_Size) // 끝 링크를 삭제할 때 + ZCLink::MakeCircle(mp_HeadLink , AP_CutLink->mp_PrevLink); + else ZCLink::JoinLink (AP_CutLink->mp_PrevLink, AP_CutLink->mp_NextLink); + + return (--ml_Size, AP_CutLink); + }/* + ZCLink* CutLink(ZCLink* AP_CutLink, TypSize AL_CutPos)*/ + + + ZtCObjList& CutLink( + ZCLink* AP_CutHead, TypSize AL_CutHeadPos, + ZCLink* AP_CutTail, TypSize AL_CutTailPos, ZtCObjList& ARR_StoreList + /*//////////////*/ ) + { + // AP_CutHead 는 삭제하려는 링크의 범위의 앞의 링크, AL_CutHeadPos 는 그 위치 + // AP_CutTail 은 삭제하려는 링크의 범위의 뒤의 링크, AL_CutTailPos 는 그 위치 + // 따라서 AL_CutHeadPos <= AL_CutTailPos + + + #ifdef _DEBUG + + if(AL_CutHeadPos>AL_CutTailPos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos"<AL_CutTailPos)*/ + + #endif // _DEBUG + + + OnDelete(AP_CutHead, AL_CutHeadPos, AP_CutTail, AL_CutTailPos); + + if(AL_CutHeadPos==1 && AL_CutTailPos==ml_Size) // 모든 링크를 삭제할 때. + { + mp_HeadLink=0; + } + else if(AL_CutHeadPos==1) // 잘라내려는 링크가 처음 링크를 포함할 때. + { + ZCLink::MakeCircle(mp_HeadLink=AP_CutTail->mp_NextLink, AP_CutHead->mp_PrevLink); + } + else if(AL_CutTailPos==ml_Size) // 잘라내려는 링크가 끝 링크를 포함할 때. + { + ZCLink::MakeCircle(mp_HeadLink, AP_CutHead->mp_PrevLink); + } + else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. + { + ZCLink::JoinLink(AP_CutHead ->mp_PrevLink, AP_CutTail->mp_NextLink); + }/* + else*/ + + ml_Size -= AL_CutTailPos-AL_CutHeadPos+1 ; + + // AP_CutHead 과 AP_CutTail 을 연결하여 + // 이중 원형 연결리스트가 되도록 한다. + + ZCLink::MakeCircle(AP_CutHead, AP_CutTail); + + + #ifdef _DEBUG + + if(ARR_StoreList.IsEmpty()!=true) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetNextPrevPtr(AL_FarNum) 링크까지를 복사한다. + // AL_FarNum 은 0 이거나 음수일 수 있다. + // 총 (FarNum의 절대값) + 1 개의 링크가 만들어 진다. + + #ifdef _DEBUG + + if(ARR_StoreList.IsEmpty()!=true) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<(AP_CopyLink), + AL_FarNum , + VP_HeadLink, + VP_TailLink + /*//////////*/ ); ////////////////////////////// + + ZCLink::MakeCircle(VP_HeadLink, VP_TailLink); + + ARR_StoreList.mp_HeadLink=VP_HeadLink; + ARR_StoreList.ml_Size =(AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 ; + + return ARR_StoreList; + }/* + ZtCObjList& CopyLink( const ZCLink* AP_CopyLink, + TypSize AL_FarNum , + ZtCObjList& ARR_StoreList + ///////////////// ) const */ + + + ZtCObjList& CopyThis(ZtCObjList& ARR_StoreList) const + { + return CopyLink(mp_HeadLink, ml_Size-1, RR(ARR_StoreList)); + }/* + ZtCObjList& CopyThis(ZtCObjList& ARR_StoreList) const*/ + + + ZtCObjList& MakeDefault(TypSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const + { + // must AL_DefaultSize > 0 + + ZCLink* VP_HeadLink=0; + ZCLink* VP_TailLink=0; + + GetManyLink(AL_DefaultSize, VP_HeadLink, VP_TailLink); + ZCLink::MakeCircle(VP_HeadLink, VP_TailLink); + + ARR_StoreList.mp_HeadLink=VP_HeadLink ; + ARR_StoreList.ml_Size =AL_DefaultSize; + + return ARR_StoreList; + }/* + ZtCObjList& MakeDefault(TypSize AL_DefaultSize, ZtCObjList& ARR_StoreList) const*/ + + + void GetManyLink( + TypSize AL_LinkSize , + ZCLink*& APR_HeadLink, + ZCLink*& APR_TailLink + /*///////////*/ ) const + { + #ifdef _DEBUG + std::CCheckAlloc::CAllowAlloc VO_CAllowAllocObj; + #endif //_DEBUG + + APR_HeadLink=new ZCLink; ZCLink* VP_TempLink=APR_HeadLink; + + for(TypSize i=2; i<=AL_LinkSize; ++i) + { + ZCLink::JoinLink(VP_TempLink, new ZCLink); + + VP_TempLink=VP_TempLink->mp_NextLink; + }/* + for(TypSize i=2; i<=AL_LinkSize; ++i)*/ + + APR_TailLink=VP_TempLink; + }/* + void GetManyLink( + TypSize AL_LinkSize , + ZCLink*& APR_HeadLink, + ZCLink*& APR_TailLink + /////////////// ) const */ + + + void GetManyLinkCopy( + ZCLink* AP_CopyLink , TypSize AL_FarNum , + ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + /*///////////////*/ ) const + { + // AL_FarNum 의 절대값 + 1 개의 링크가 생성된다. + + #ifdef _DEBUG + std::CCheckAlloc::CAllowAlloc VO_CAllowAllocObj; + #endif + + if(AL_FarNum>0) + { + APR_HeadLink= + new ZCLink(AP_CopyLink->GetData()); + + ZCLink* VP_TempLink=APR_HeadLink; + + for(TypSize i=1; i<=AL_FarNum; ++i) + { + AP_CopyLink=AP_CopyLink->mp_NextLink; + + ZCLink::JoinLink( + VP_TempLink, new ZCLink(AP_CopyLink->GetData())); + + VP_TempLink=VP_TempLink->mp_NextLink; + }/* + for(TypSize i=1; i<=AL_FarNum; ++i)*/ + + APR_TailLink=VP_TempLink; + } + else //AL_FarNum<=0 + { + APR_TailLink= + new ZCLink(AP_CopyLink->GetData()); + + ZCLink* VP_TempLink=APR_TailLink; + + for(TypSize i=AL_FarNum; i<0; ++i) + { + AP_CopyLink=AP_CopyLink->mp_PrevLink; + + ZCLink::JoinLink( + VP_TempLink, new ZCLink(AP_CopyLink->GetData())); + + VP_TempLink=VP_TempLink->mp_PrevLink; + }/* + for(TypSize i=AL_FarNum; i<0; ++i)*/ + + APR_HeadLink=VP_TempLink; + }/* + else //AL_FarNum<=0*/ + }/* + void GetManyLinkCopy( + ZCLink* AP_CopyLink , TypSize AL_FarNum , + ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink + ////////////////// ) const */ + + + /*protected:*/ + public : + + + ZtCObjList() + { + mp_HeadLink=0; + ml_Size =0; + }/* + ZtCObjList()*/ + + ZtCObjList(const ZtCObjList& rhs):mp_HeadLink(0),ml_Size(0) + { + *this=rhs; + }/* + ZtCObjList(const ZtCObjList& rhs)*/ + + + virtual ~ZtCObjList() + { + DeleteAll(); + }/* + virtual ~ZtCObjList()*/ + + + ZtCObjList& operator=(const ZtCObjList& rhs) + { + if(rhs.ml_Size<1) + { + return DeleteAll(); + } + else if(ml_Size<=rhs.ml_Size) + { + AddDefault(rhs.ml_Size-ml_Size,ml_Size+1); + + ZCLink* pRhsLink=rhs.mp_HeadLink; + ZCLink* pLhsLink= mp_HeadLink; + + __for1(TypSize, i, ml_Size) + { + pLhsLink->GetData()=pRhsLink->GetData(); + + pLhsLink=pLhsLink->mp_NextLink; + pRhsLink=pRhsLink->mp_NextLink; + }/* + __for1(TypSize, i, ml_Size)*/ + } + else + { + ZtCObjList VO_StoreList; + + CutLink( GetLinkPtr(rhs.ml_Size+1),rhs.ml_Size+1, + GetLinkPtr( ml_Size ), ml_Size , + RR(VO_StoreList) + /****/ ).DeleteAll(); ////////////////////////////// + }/* + else*/ + + return *this; + }/* + ZtCObjList& operator=(const ZtCObjList& rhs)*/ + + + bool IsEmpty() const + { + return mp_HeadLink==0 ; + }/* + bool IsEmpty() const*/ + + + TypSize GetSize() const{return ml_Size;} + TypSize size () const{return ml_Size;} + + ZCLink* GetHeadLinkPtr(){return mp_HeadLink;} + ZCLink* GetTailLinkPtr() + { + return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; + }/* + ZCLink* GetTailLinkPtr()*/ + + + const ZCLink* GetHeadLinkPtr() const{return mp_HeadLink;} + const ZCLink* GetTailLinkPtr() const + { + return mp_HeadLink==0 ? 0 : mp_HeadLink->mp_PrevLink ; + }/* + const ZCLink* GetTailLinkPtr() const*/ + + + 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();} + IterEasyID GetHeadIterEasyID() const{return (IterEasyID)GetHeadLinkPtr();} + IterEasyID GetTailIterEasyID() const{return (IterEasyID)GetTailLinkPtr();} + + IterEasyID ItHead() {return GetHeadIterEasyID();} + IterEasyID ItTail() {return GetTailIterEasyID();} + + IterEasyID ItHead() const{return GetHeadIterEasyID();} + IterEasyID ItTail() const{return GetTailIterEasyID();} + + + Type& operator[](TypSize AL_Index) + { + // [] 에 들어가는 AL_Index 은 1 부터 시작하는 첨자이다. + + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AL_Index)->GetData(); + }/* + Type& operator[](TypSize AL_Index)*/ + + const Type& operator[](TypSize AL_Index) const + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AL_Index)->GetData(); + }/* + Type& operator[](TypSize AL_Index) const*/ + + + TypSize Find(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + // AB_DoFindFromFront==true 이면 AL_FirstFindIndex 번째 링크부터 + // 다음 링크로 순회하면서 GetData() == AR_SearchType 이 되는 + // 최초의 위치를 반환한다. + + const bool CB_IsTrue = ( + mp_HeadLink == 0 || + AL_FirstFindIndex < 1 || + AL_FirstFindIndex > ml_Size + /*//////////////////*/ ) ; + + if(CB_IsTrue) return 0; + + TypSize VL_FindIndex=AL_FirstFindIndex; const + ZCLink* VP_TempLink =GetLinkPtr(AL_FirstFindIndex); + + if(AB_DoFindFromFront==true) + { + do ///////// + { + if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; + if(VL_FindIndex ==ml_Size ) return 0 ; + + VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; + } + while(true); + } + else // AB_DoFindFromFront!=true + { + do ///////// + { + if(VP_TempLink->GetData()==AR_SearchType) return VL_FindIndex; + if(VL_FindIndex ==1 ) return 0 ; + + VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; + } + while(true); + }/* + else // AB_DoFindFromFront!=true*/ + + return 0; + }/* + TypSize Find(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + TypSize Find(const ZCLink* AP_SearchLink, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + if(mp_HeadLink==0 || AL_FirstFindIndex<1 || AL_FirstFindIndex>ml_Size) + return 0; + //endif + + TypSize VL_FindIndex=AL_FirstFindIndex; + ZCLink* VP_TempLink =const_cast(GetLinkPtr(AL_FirstFindIndex)); + + if(AB_DoFindFromFront==true) + { + do /**/ + { + if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; + if(VL_FindIndex==ml_Size ) return 0 ; + + VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; + } + while(true); + } + else // AB_DoFindFromFront!=true + { + do /**/ + { + if(VP_TempLink ==AP_SearchLink) return VL_FindIndex; + if(VL_FindIndex==1 ) return 0 ; + + VP_TempLink=VP_TempLink->mp_PrevLink; --VL_FindIndex; + } + while(true); + }/* + else // AB_DoFindFromFront!=true*/ + + return 0; + }/* + TypSize Find(ZCLink* AP_SearchLink, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + + /*//////////////////////////////////////////////////////////////////////////////////////// + + ■ FindData(TypeCArg, ~) 함수가 없다면, TypeCArg 이 const Type& 으로 정의되어 있는 경우, + const Type& 에 대해서만 찾기를 수행할 수 있고, Type& 에 대해서는 찾기를 수행할 수 없다. + + -- 2010-05-29 21:31:00 + + ////////////////////////////////////////////////////////////////////////////////////////*/ + + TypSize FindData(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const + { + return Find(AR_SearchType, AL_FirstFindIndex, AB_DoFindFromFront); + }/* + TypSize FindData(TypCArg AR_SearchType, TypSize AL_FirstFindIndex=1, bool AB_DoFindFromFront=true) const*/ + + + ZCLink* GetLinkPtr(TypSize AL_Index) + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif // _DEBUG + + TypSize VI_LeftDistance =AL_Index-1 ; + TypSize VI_RightDistance=ml_Size-AL_Index+1; + TypSize VI_ShortDistance= + (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); + + return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); + }/* + ZCLink* GetLinkPtr(TypSize AL_Index)*/ + + const ZCLink* GetLinkPtr(TypSize AL_Index) const // or 'ZCLink const * const GetLinkPtr(TypSize AL_Index) const' + { + #ifdef _DEBUG + + if(AL_Index<1 || AL_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif // _DEBUG + + TypSize VI_LeftDistance =AL_Index-1 ; + TypSize VI_RightDistance=ml_Size-AL_Index+1; + TypSize VI_ShortDistance= + (VI_LeftDistance<=VI_RightDistance ? VI_LeftDistance : -VI_RightDistance); + + return mp_HeadLink->GetNextPrevPtr(VI_ShortDistance); + }/* + const ZCLink* GetLinkPtr(TypSize AL_Index) const*/ + + + ZtCObjList& DeleteAll() + { + if(mp_HeadLink!=0) + { + OnDelete( + mp_HeadLink, 1, mp_HeadLink->mp_PrevLink, ml_Size); + + ZCLink* VP_DelLink=0; + + do //// + { + VP_DelLink =mp_HeadLink; + mp_HeadLink=mp_HeadLink->mp_NextLink; + + delete VP_DelLink; + } + while(--ml_Size>0); + + mp_HeadLink =0; + }/* + if(mp_HeadLink!=0)*/ + + return *this; + }/* + ZtCObjList& DeleteAll()*/ + + ZtCObjList& clear() + { + return this->DeleteAll(); + }/* + ZtCObjList& clear()*/ + + + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink) + { + #ifdef _DEBUG + + if(Find(AP_DeleteLink)<1) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<CutLink(AP_DeleteLink); return *this; + }/* + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink)*/ + + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink, TypSize AL_DeletePos) + { + #ifdef _DEBUG + + if(AL_DeletePos<1 || Find(AP_DeleteLink)!=AL_DeletePos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<CutLink(AP_DeleteLink, AL_DeletePos); return *this; + }/* + ZtCObjList& DeleteLink(ZCLink* AP_DeleteLink, TypSize AL_DeletePos)*/ + + + ZtCObjList& Delete(ZCLink* AP_DeleteLink) + { + return DeleteLink(AP_DeleteLink); + }/* + ZtCObjList& Delete(ZCLink* AP_DeleteLink)*/ + + ZtCObjList& Delete(ZCLink* AP_DeleteLink, TypSize AL_DeletePos) + { + return DeleteLink(AP_DeleteLink, AL_DeletePos); + }/* + ZtCObjList& Delete(ZCLink* AP_DeleteLink, TypSize AL_DeletePos)*/ + + ZtCObjList& DeleteLink(TypSize AL_DeletePos) + { + if(AL_DeletePos<1 || this->ml_Size>AL_DeletePos) return *this; + + Delete(this->GetLinkPtr(AL_DeletePos), AL_DeletePos); return *this; + }/* + ZtCObjList& DeleteLink(TypSize AL_DeletePos)*/ + + + ZtCObjList& DeleteHead() + { + if(ml_Size>0) + delete this->CutLink(mp_HeadLink); + + return *this; + }/* + ZtCObjList& DeleteHead()*/ + + ZtCObjList& DeleteHead(TypSize AI_DeleteCnt) + { + __for1(TypSize, i, AI_DeleteCnt) + { + if(ml_Size<1) return *this; + + delete this->CutLink(mp_HeadLink); + }/* + __for1(TypSize, i, AI_DeleteCnt)*/ + + return *this; + }/* + ZtCObjList& DeleteHead(TypSize AI_DeleteCnt)*/ + + ZtCObjList& DeleteTail() + { + if(ml_Size>0) + delete this->CutLink(mp_HeadLink->mp_PrevLink); + + return *this; + }/* + ZtCObjList& DeleteTail()*/ + + + ZCLink* AddDefault(TypSize AL_DefaultSize, TypSize AL_AddPos) + { + if(AL_DefaultSize<1 || AL_AddPos<1 || AL_AddPos>ml_Size+1) + return 0; + ////////////////////////////////////////////////////////// + + ZtCObjList VO_StoreList; MakeDefault( + AL_DefaultSize, VO_StoreList); + + ZCLink* VP_HeadLink=VO_StoreList.mp_HeadLink; + + if(AL_AddPos==1) + JoinAfter(VO_StoreList, 0 , 1 ); + else JoinAfter(VO_StoreList, GetLinkPtr(AL_AddPos-1), AL_AddPos-1); + + return VP_HeadLink; + }/* + ZCLink* AddDefault(TypSize AL_DefaultSize, TypSize AL_AddPos)*/ + + + ZtCObjList& AddHead(TypCArg AR_Type) + { + JoinAfter(new ZCLink(AR_Type), 0, 0); return *this; + }/* + ZtCObjList& AddHead(TypCArg AR_Type)*/ + + ZtCObjList& AddHead(const ZtCObjList& rhs) + { + if(this==&rhs) return *this; + + ZtCObjList VO_StoreList(rhs); + + JoinAfter(VO_StoreList, 0, 0); return *this; + }/* + ZtCObjList& AddHead(const ZtCObjList& rhs)*/ + + + ZCLink* AddHeadDefault() + { + /* 아래 코드 중 return 문이 return *this 라고 되어 있었다. 10 여년간 이를 + 모른 것이다. 자그마치 10 여년간! -- 2015-02-21- 21:36:00 + */ + ZCLink* VP_NewLink=new ZCLink; JoinAfter(VP_NewLink, 0, 0); return VP_NewLink; + }/* + ZCLink& AddHeadDefault()*/ + + + ZtCObjList& AddTail(TypCArg AR_Type) + { + JoinAfter(new ZCLink(AR_Type), GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& AddTail(TypCArg AR_Type)*/ + + ZtCObjList& AddTail(const ZtCObjList& rhs) + { + ZtCObjList VO_StoreList(rhs); return JoinTail(VO_StoreList); + }/* + ZtCObjList& AddTail(const ZtCObjList& rhs)*/ + + + ZCLink* AddTailDefault() + { + ZCLink* VP_NewLink=new ZCLink; + + JoinAfter( + VP_NewLink, GetTailLinkPtr(), ml_Size); + + return VP_NewLink; + }/* + ZCLink* AddTailDefault()*/ + + + ZtCObjList& pop_back (TypCArg AR_Type){return AddHead(AR_Type);} + ZtCObjList& push_back(TypCArg AR_Type){return AddTail(AR_Type);} + + + ZtCObjList& JoinHead(ZtCObjList& rhs) + { + JoinAfter(rhs, 0, 0); return *this; + }/* + ZtCObjList& JoinHead(ZtCObjList& rhs)*/ + + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink) + { + // rhs 의 AP_CLink 를 앞으로 연결한다. + // 일단 뒤로 연결한 다음 mp_HeadLink 을 뒤로 움직인다. + + JoinAfter(rhs.CutLink(AP_CLink), GetTailLinkPtr(), ml_Size); + + mp_HeadLink=mp_HeadLink->GetPrevPtr(); return *this; + }/* + ZtCObjList& JoinHead(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + + ZtCObjList& JoinTail(ZtCObjList& rhs) + { + JoinAfter(rhs, GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& JoinTail(ZtCObjList& rhs)*/ + + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink) + { + // rhs 의 AP_CLink 를 뒤로 연결한다. + + JoinAfter(rhs.CutLink(AP_CLink), GetTailLinkPtr(), ml_Size); return *this; + }/* + ZtCObjList& JoinTail(ZtCObjList& rhs, ZCLink* AP_CLink)*/ + + + ZtCObjList& JoinAfter( + ZtCObjList& rhs , + ZCLink* AP_LinkOfRhs , + TypSize AL_AddPosOfRhs , + ZCLink* AP_LinkStd , + TypSize AL_PosStd + /*////////////////*/ ) + { + // rhs 의 AP_LinkOfRhs 링크를 잘라서 AP_LinkStd 앞에 붙인다. + + #ifdef _DEBUG + + if(rhs.Find(AP_LinkOfRhs)!=AL_AddPosOfRhs || (AP_LinkStd!=0 && Find(AP_LinkStd)!=AL_PosStd) ) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<AL_CutTailPos"<AL_CutTailPos)*/ + + #endif // _DEBUG + + + OnDelete(AP_CutHead, AL_CutHeadPos, AP_CutTail, AL_CutTailPos); + + if(AL_CutHeadPos==1 && AL_CutTailPos==ml_Size) // 모든 링크를 삭제할 때. + { + mp_HeadLink=0; + } + else if(AL_CutHeadPos==1) // 잘라내려는 링크가 처음 링크를 포함할 때. + { + ZCLink::MakeCircle(mp_HeadLink=AP_CutTail->mp_NextLink, AP_CutHead->mp_PrevLink); + } + else if(AL_CutTailPos==ml_Size) // 잘라내려는 링크가 끝 링크를 포함할 때. + { + ZCLink::MakeCircle(mp_HeadLink, AP_CutHead->mp_PrevLink); + } + else // 잘라내려는 링크가 처음과 끝 링크를 포함하지 않을 때. + { + ZCLink::JoinLink(AP_CutHead ->mp_PrevLink, AP_CutTail->mp_NextLink); + }/* + else*/ + + ml_Size -= AL_CutTailPos-AL_CutHeadPos+1 ; + + + // 여기까지는 CutLink(ZCLink*,TypSize,ZCLink*,TypSize,ZtCObjList&) 와 같다. 이후에 CutLink() 에서는 + // ARR_StoreList 가 비어 있는 것으로 간주하지만, CutLinkOut() 는 ARR_StoreList 이 비어 있지 + // 않은 경우에도 대비한다. + + if(ARR_StoreList.ml_Size<1) + { + // AP_CutHead 과 AP_CutTail 을 연결하여 이중 원형 연결리스트가 되도록 한다. + + ZCLink::MakeCircle(AP_CutHead, AP_CutTail); + + ARR_StoreList.mp_HeadLink=AP_CutHead ; + ARR_StoreList.ml_Size =AL_CutTailPos-AL_CutHeadPos+1; + } + else + { + ZCLink::JoinLink (ARR_StoreList.mp_HeadLink->mp_PrevLink, AP_CutHead); + ZCLink::MakeCircle(ARR_StoreList.mp_HeadLink , AP_CutTail); + + ARR_StoreList.ml_Size += AL_CutTailPos-AL_CutHeadPos+1 ; + }/* + else*/ + + return ARR_StoreList; + }/* + ZtCObjList& CutLinkOut( + ZCLink* AP_CutHead, TypSize AL_CutHeadPos, + ZCLink* AP_CutTail, TypSize AL_CutTailPos, + ZtCObjList& ARR_StoreList + ///////////// ) */ + + + + operator Type&() + { + return AddDefault(1, ml_Size+1)->GetData(); + }/* + operator Type&()*/ + + + Type& GetData(TypSize AI_Index) + { + #ifdef _DEBUG + + if(AI_Index<1 || AI_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AI_Index)->GetData(); + }/* + Type& GetData(TypSize AI_Index)*/ + + + const Type& GetData(TypSize AI_Index) const + { + #ifdef _DEBUG + + if(AI_Index<1 || AI_Index>ml_Size) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<ml_Size)*/ + + #endif //_DEBUG + + return GetLinkPtr(AI_Index)->GetData(); + }/* + const Type& GetData(TypSize AI_Index) const*/ + + + Type& GetHeadData() + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetData(); + }/* + Type& GetHeadData()*/ + + const Type& GetHeadData() const + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<GetData(); + }/* + const Type& GetHeadData() const*/ + + + Type& GetTailData() + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink->GetData(); + }/* + Type& GetTailData()*/ + + const Type& GetTailData() const + { + #ifdef _DEBUG + + if(mp_HeadLink==0) + { + std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); + fileout<mp_PrevLink->GetData(); + }/* + const Type& GetTailData() const*/ + + + Type& front(){return GetHeadData();} + Type& back (){return GetTailData();} + + const Type& front() const{return GetHeadData();} + const Type& back () const{return GetTailData();} + + + ZtCObjList& Rotate(TypSize AL_RotateNum) + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->GetNextPrevPtr(AL_RotateNum); + + return *this; + }/* + ZtCObjList& Rotate(TypSize AL_RotateNum)*/ + + ZtCObjList& Rotate() + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->mp_NextLink; + + return *this; + }/* + ZtCObjList& Rotate()*/ + + ZtCObjList& RotateBack() + { + if(ml_Size>0) + mp_HeadLink=mp_HeadLink->mp_PrevLink; + + return *this; + }/* + ZtCObjList& RotateBack()*/ + + + template void IterElement(TFunctor AO_Functor) + { + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T::GetObjRef(AO_Functor)(VP_LoopLink->mo_Type); + + /* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라, operator() + 연산자를 가진 object 포인터일 때도 사용할 수 있게 되었다. */ + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template void IterElement(TFunctor AO_Functor) */ + + template + void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) + { + /*///////////////////////////////////////////////////////////////////////////// + + ■ TTypeHelp 가 class 일 경우, 크기가 커서 참조로 넘어가야 한다면, + + IterElement(myFunctor_obj, myClass_Obj); + + 의 형태로 호출할 게 아니라, std::CObjectPtr_T<> 을 사용하여, + + myClass myClass_Obj; std::CObjectPtr_T myCObjPtr(myClass_Obj); + + 나 + + IterElement(myFunctor_obj, std::CObjectPtr_T(myClass_Obj)); + + 형태를 사용하면 좋을 것 같다. -- 2014-06-16 23:11:00 + + /////////////////////////////////////////////////////////////////////////////*/ + + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T:: + GetObjRef(AO_Functor)(VP_LoopLink->mo_Type, AO_TypeHelp); + + /* 위 코드로 인해서, AO_Functor 이 함수일 때 뿐이 아니라, operator() + 연산자를 가진 object 포인터일 때도 사용할 수 있게 되었다. */ + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template + void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ + + + template + void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) + { + /* TTypeHelp 을 참조로 받고 있음에 주의한다. -- 2015-09-07 02:55:00 */ + + ZCLink* VP_LoopLink=mp_HeadLink; + + __for0(int, i, ml_Size) + { + std::CTypeData_T:: + GetObjRef(AO_Functor)(VP_LoopLink->mo_Type, AR_TypeHelp); + + VP_LoopLink = VP_LoopLink->mp_NextLink ; + }/* + __for0(int, i, ml_Size)*/ + }/* + template + void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) */ + + + /*/////////////////////////////////////////////////////////////////////////// + + ■ IterElement() 예제. + + #include + #include "ZtCObjList.H" + + using namespace std; + + int main() + { + ZNsMain:: ZtCObjList myArray; + + myArray.AddTail(10); + myArray.AddTail(20); + myArray.AddTail(30); + myArray.AddTail(40); + + struct StFunctor + { + static void ShowElement(int ArgiValue){cout<<"# Value="< class ZtCSortObjList + { + };/* + template class ZtCSortObjList*/ + +}/* +namespace ZNsMain*/ diff --git a/ZCppMain/test.cpp b/ZCppMain/test.cpp index 5efd6a5..e9e1496 100644 --- a/ZCppMain/test.cpp +++ b/ZCppMain/test.cpp @@ -1,6 +1,7 @@ + #include -#include "ZMainHead.H" +#include "ZtCObjList.H" using namespace std; @@ -8,6 +9,8 @@ using namespace std; int main(int ArgiCnt, char** AppArgu) { + ZNsMain::ZtCObjList CListByInt; + cout<<"C++ 's great start"<