#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="<