#ifndef __CSIMLIST_H__ #define __CSIMLIST_H__ #include "ZCppMain/ZMainHead.H" namespace ZNsMain { template class ZtCSortObjList; template /*############################*/ < typename TType , typename TTypCArg =const TType&, typename TTypCAlloc=ZCAllocator , typename TTypCInit =ZCInit , typename TTypSize =ZTypLong > class ZtCSimList /*####################*/ { public: typedef TType Type ; typedef TType TypeData ; typedef TTypCArg TypeArg ; typedef TTypCAlloc TypeAlloc; typedef TTypCInit TypeInit ; typedef TTypSize TypeSize ; public: class ZCLinkHeap; class ZCLink : public TypeAlloc { public: template friend class ZtCSortObjList ; friend class ZtCSimList ; /*##########################*/ friend class ZCLinkHeap ; public: #ifdef _DEBUG ZCCheckAlloc mo_CheckStack; #endif //_DEBUG private: ZCLink* mp_NextLink; TType mo_Type ; private: inline static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink) { // µÎ °³ÀÇ ¸µÅ©¸¦ ¿¬°á »óÅ·Π¸¸µç´Ù. AP_PrevLink->mp_NextLink=AP_NextLink; }/* inline static void JoinLink(ZCLink* AP_PrevLink, ZCLink* AP_NextLink)*/ inline static void MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink) { // óÀ½°ú ³¡ ¸µÅ©¸¦ ¿¬°áÇÏ¿© ¿øÇü»óÅ·Π¸¸µç´Ù. // À̰ÍÀº ZtCSimList class template °ú ¸â¹ö ÇÔ¼ö¸¦ ¸ÂÃß±â À§ÇÑ °ÍÀ¸·Î // ½ÇÁ¦ÀûÀ¸·Î´Â º° ¾µ¸ð´Â ¾ø´Â °Í °°´Ù. AP_TailLink->mp_NextLink=AP_HeadLink; }/* inline static void MakeCircle(ZCLink* AP_HeadLink, ZCLink* AP_TailLink)*/ //private: public : ZCLink():mp_NextLink(0) { }/* ZCLink()*/ ZCLink(const ZCLink& rhs):mp_NextLink(0) { // TType ÀÇ ´ëÀÔ¿¬»êÀÚ´Â ¹Ýµå½Ã public ¿µ¿ª¿¡ ÀÖ¾î¾ß ÇÑ´Ù. mo_Type=rhs.mo_Type; }/* ZCLink(const ZCLink& rhs)*/ ZCLink(TypeArg AR_Type):mp_NextLink(0) { mo_Type=AR_Type; }/* ZCLink(TypeArg AR_Type)*/ operator TType&() { return mo_Type; }/* operator TType&()*/ operator TType() { return mo_Type; }/* operator TType()*/ TType& GetData() { return mo_Type; }/* TType& GetData()*/ const TType& GetData() const { return mo_Type; }/* const TType& GetData() const*/ TType& GetData(TTypSize AL_FarNum) // must AL_FarNum >= 0 { return GetNextPtr(AL_FarNum)->mo_Type; }/* TType& GetData(TTypSize AL_FarNum)*/ const TType& GetData(TTypSize AL_FarNum) const { return GetNextPtr(AL_FarNum)->mo_Type; }/* const TType& GetData(TTypSize AL_FarNum) const*/ TType& operator*() { return mo_Type; }/* TType& operator*()*/ const TType& operator*() const { return mo_Type; }/* const TType& operator*() const*/ ZCLink* GetNextPtr(TTypSize AL_FarNum) // must AL_FarNum > 0 { // ÀÌ ¸â¹ö ÇÔ¼ö´Â TTypSize °¡ ¿ë¶ûÀÌ Å« object ¶ó ÇÒÁö¶óµµ // ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼­ °ªÀÌ º¯Çϰí ÀÖÀ¸¹Ç·Î ÂüÁ¶·Î ¹ÞÁö ¾Ê´Â´Ù. ZCLink* VP_TmpLink=this; while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; //end while return VP_TmpLink; }/* ZCLink* GetNextPtr(TTypSize AL_FarNum)*/ const ZCLink* const GetNextPtr(TTypSize AL_FarNum) const // or ZCLink const * const GetNextPtr(TTypSize AL_FarNum) const { // TTypSize °¡ object ÀÏ °æ¿ì AL_FarNum ÀÇ °ªÀÌ ÀÌ ÇÔ¼ö¿¡¼­ º¯Çϰí ÀÖÀ¸¹Ç·Î // TTypSize À» ÂüÁ¶·Î ¹ÞÀ¸¸é ¾ÈµÈ´Ù. ZCLink* VP_TmpLink=const_cast(this); // ÀÌ ÇÔ¼ö´Â µÚ¿¡ const keyword °¡ ºÙ¾î Àִµ¥ ÀÌ°Í ¶§¹®¿¡ this pointer ´Â »ó¼ö Æ÷ÀÎÅÍ·Î °£ÁֵȴÙ. // À­ÁÙ¿¡¼­ ÀÌ this Æ÷ÀÎÅ͸¦ ºñ»ó¼ö Æ÷ÀÎÅÍ·Î ¸ÕÀú Çüº¯È¯ÇÏ¿´´Ù. // ZCLink* VP_TmpLink=const_castthis; ¶ó Çϸé g++ 2.96 ¿¡¼­´Â ¿¡·¯ while(--AL_FarNum>=0) VP_TmpLink=VP_TmpLink->mp_NextLink; //end while return VP_TmpLink; }/* const ZCLink* const GetNextPtr(TTypSize AL_FarNum) const*/ inline ZCLink* GetNextPtr() { return mp_NextLink; }/* inline ZCLink* GetNextPtr()*/ inline const ZCLink* const GetNextPtr() const { return mp_NextLink; }/* inline const ZCLink* const GetNextPtr() const*/ ZCLink& operator=(TypeArg AR_Type) { mo_Type=AR_Type; return *this; }/* ZCLink& operator=(TypeArg AR_Type)*/ ZCLink* operator+(TypeSize AL_Offset) { ZCLink* VP_CLinkLoop=this; __for0(TTypSize, i, AL_Offset) { VP_CLinkLoop = VP_CLinkLoop->mp_NextLink; }/* __for0(TTypSize, i, AL_Offset)*/ return *this; }/* ZCLink* operator+(TypeSize AL_Offset) public:*/ };/* class ZCLink*/ ///////////////////////////////////////////////// /*************** end class ZCLink ***************/ ///////////////////////////////////////////////// class ZCLinkHeap : public ZCFreeAllocBase { public: friend class ZtCSimList ; friend class ZCLink ; public: #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallInit mo_Mutex ; #endif //_REENTRANT_MUTEX private: TypeInit mo_TypeInit; TTypSize ml_AllSize ; TTypSize ml_UseSize ; ZCLink* mp_NoUseHeadLink; ZCLink* mp_NoUseTailLink; //private: private: ZCLink* GetOneLink() { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX #ifdef _DEBUG ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj; #endif //_DEBUG if(ml_UseSize==0) return (++ml_AllSize, new ZCLink) ; ///////////////// ZCLink* VP_TempLink=mp_NoUseHeadLink; if(VP_TempLink==mp_NoUseTailLink) { mp_NoUseHeadLink=0; mp_NoUseTailLink=0; } else { mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; } //else --ml_UseSize; return VP_TempLink; }/* ZCLink* GetOneLink()*/ void GetManyLink( TTypSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink /*************/ ) { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX #ifdef _DEBUG ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj; #endif //_DEBUG if(mp_NoUseHeadLink==0) { MakeLink(AL_LinkSize,APR_HeadLink,APR_TailLink); } else if(AL_LinkSize==ml_UseSize) { ZCLink* VP_Temp=mp_NoUseHeadLink; while(true) { mo_TypeInit(VP_Temp->mo_Type); if(VP_Temp==mp_NoUseTailLink) break; else VP_Temp=VP_Temp->mp_NextLink; //else } //while(true) APR_HeadLink=mp_NoUseHeadLink; APR_TailLink=mp_NoUseTailLink ; mp_NoUseHeadLink=0; mp_NoUseTailLink =0; ml_UseSize=0; } else if(AL_LinkSizemo_Type); for(TTypSize VL_Count=2;VL_Count<=AL_LinkSize;++VL_Count) { // VL_Count °¡ 2 ºÎÅÍ ½ÃÀÛÇÔÀ¸·Î AL_LinkSize-1 ¹ø ¼øÈ¯ÇÑ´Ù. // ±×·¡¾ßÁö AL_LinkSize °³ÀÇ ¸µÅ©¸¦ ÀÚ¸¦ ¼ö ÀÖ´Ù. mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; mo_TypeInit(mp_NoUseHeadLink->mo_Type); } //for(TTypSize VL_Count=2;VL_Count<=AL_LinkSize;++VL_Count) APR_TailLink = mp_NoUseHeadLink; mp_NoUseHeadLink= mp_NoUseHeadLink->mp_NextLink; ml_UseSize -= AL_LinkSize; } else // AL_LinkSize > ml_UseSize { ZCLink* VP_Temp=mp_NoUseHeadLink; while(true) { mo_TypeInit(VP_Temp->mo_Type); if(VP_Temp==mp_NoUseTailLink) break; else VP_Temp=VP_Temp->mp_NextLink; //endif } //while(true) APR_HeadLink=mp_NoUseHeadLink; MakeLink( AL_LinkSize-ml_UseSize, mp_NoUseTailLink->mp_NextLink, APR_TailLink /*****/ ); mp_NoUseHeadLink=0; mp_NoUseTailLink=0; ml_UseSize =0; } //else // AL_LinkSize > ml_UseSize } /*void GetManyLink( TTypSize AL_LinkSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink ////////////// ) */ void GetManyLinkCopy( ZCLink* AP_LinkOrgin, TTypSize AL_FarNum , ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy /*****************/ ) { // AL_FarNum > 0 // AP_LinkOrgin ¸µÅ©ºÎÅÍ, // AP_LinkOrgin ¿¡¼­ AL_FarNum ¸¸Å­ ¶³¾îÁø ¸µÅ©±îÁö¸¦ º¹»çÇÏ¿© // º¹»ç»ý¼ºµÈ óÀ½ ¸µÅ© Æ÷ÀÎÅ͸¦ APR_HeadCopy ¿¡, // ¸¶Áö¸· ¸µÅ©¸¦ APR_TailCopy ¿¡ ´ëÀÔÇÑ´Ù. // AP_LinkOrgin ¸µÅ©¿¡¼­ ±× ´ÙÀ½ ¸µÅ©·Î Á¢±ÙÇϸ鼭 ¸µÅ©¸¦ º¹»çÇÒ °ÍÀÌ´Ù. // µû¶ó¼­ ÃÑ AL_FarNum + 1 °³ÀÇ ¸µÅ©°¡ ¸¸µé¾îÁø´Ù. // ÀÌ ÇÔ¼ö´Â °¢ ¸µÅ©¸¦ »õ·Î »ý¼ºÇÏ´Â MakeLinkCopy() ÇÔ¼ö¿Í´Â ´Þ¸® // ±âÁ¸¿¡ ÀÖ´Â ml_UseSize °³ÀÇ ¸µÅ©¸¦ ¸ÕÀú »ç¿ëÇÑ´Ù. #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX #ifdef _DEBUG ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj; #endif //_DEBUG if(mp_NoUseHeadLink==0) { MakeLinkCopy(AP_LinkOrgin, AL_FarNum, APR_HeadCopy, APR_TailCopy); } else if( AL_FarNum < ml_UseSize) // ( (AL_FarNum<0 ? -AL_FarNum : AL_FarNum)+1 <= ml_UseSize) { ml_UseSize -= AL_FarNum+1 ; mp_NoUseHeadLink->mo_Type = AP_LinkOrgin->mo_Type; APR_HeadCopy=mp_NoUseHeadLink; while(--AL_FarNum>=0) { mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; AP_LinkOrgin=AP_LinkOrgin->mp_NextLink; mp_NoUseHeadLink->mo_Type = AP_LinkOrgin->mo_Type; } //while(--AL_FarNum>=0) APR_TailCopy=mp_NoUseHeadLink; // ÀÌ ºÎºÐ¿¡¼­ mp_NoUseHeadLink ´Â Àß·Á³ª°¡´Â ¸¶Áö¸· ¸µÅ©°¡ µÈ´Ù. // ±×·¯¹Ç·Î ´Ù½Ã ´ÙÀ½ ¸µÅ©·Î ÃʱâÈ­ÇÑ´Ù. mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; if(mp_NoUseHeadLink==0) { mp_NoUseTailLink=0; // mp_NoUseHeadLink == 0 Àε¥ mp_NoUseTailLink !=0 À̶ó¸é // ³ªÁß¿¡ ÀÚÄ© ¹«ÇÑ·çÇÁ¿¡ ºüÁú ¼ö ÀÖ´Ù. // µû¶ó¼­ À§ Äڵ带 µÎ¾ú´Ù. } //if(mp_NoUseHeadLink==0) } else // AL_FarNum > ml_UseSize { mp_NoUseHeadLink->mo_Type = AP_LinkOrgin->mo_Type; APR_HeadCopy = mp_NoUseHeadLink; while(mp_NoUseHeadLink!=mp_NoUseTailLink) { mp_NoUseHeadLink=mp_NoUseHeadLink->mp_NextLink; AP_LinkOrgin =AP_LinkOrgin ->mp_NextLink; mp_NoUseHeadLink->mo_Type = AP_LinkOrgin->mo_Type; } //while(mp_NoUseHeadLink!=mp_NoUseTailLink) MakeLinkCopy( AP_LinkOrgin->mp_NextLink , AL_FarNum-ml_UseSize , mp_NoUseTailLink->mp_NextLink, APR_TailCopy /*********/ ); mp_NoUseHeadLink = mp_NoUseTailLink = 0; ml_UseSize = 0; } //else // AL_FarNum > ml_UseSize } /*void GetManyLinkCopy( ZCLink* AP_LinkOrgin, TTypSize AL_FarNum, ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy, ///////////// ) */ void MakeLink( TTypSize AL_MakeSize, ZCLink*& APR_HeadLink, ZCLink*& APR_TailLink /**********/ ) { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX #ifdef _DEBUG ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj; #endif //_DEBUG APR_HeadLink = new ZCLink; if(APR_HeadLink==0) { //add codes for memory over DeleteAllInHeap(); return; } //if(APR_HeadLink==0) ml_AllSize += AL_MakeSize; ZCLink* VP_MakeLink =0; ZCLink* VP_TempLink =APR_HeadLink; bool VB_IsHeapOver=false; // bool VB_IsHeapOver Àº new ¿¬»êÀÚ°¡ NULL Æ÷ÀÎÅ͸¦ ¹ÝȯÇßÀ» ¶§ // true ¸¦ ´ëÀԹ޴´Ù. ÀÌ °ªÀ» Á¶»çÇÔÀ¸·Î½á heap overflow ¸¦ ó¸®ÇÑ´Ù. // bool VB_IsHeapOver º¯¼ö¸¦ µÎÁö ¾Ê°í // ¾Æ·¡ for ¹®¿¡¼­ Á÷Á¢ ¸Þ¸ð¸® 󸮸¦ ÇÏ´Â Äڵ带 µÑ ¼ö ÀÖÀ¸³ª // for ¹® ¾È¿¡ if ¹® ¼Ó¿¡¼­ ¶Ç for ¹®À» ½á¾ß ÇÔÀ¸·Î // °¡µ¶¼ºÀÌ ¶³¾îÁú ¼ö°¡ ÀÖ´Ù. // ±×·¡¼­ heap over ¿¡ ´ëÇÑ ¿¹¿Üó¸® Äڵ带 // for ¹® ¹Ù±ùÀ¸·Î »©·Á´Â °ÍÀÌ´Ù. while(--AL_MakeSize>0) // AL_MakeSize - 1 ¹ø ¼øÈ¯ { // AL_MakeSize - 1 ¹ø ¼øÈ¯ VP_MakeLink = new ZCLink; if(VP_MakeLink==0) { ml_AllSize -= AL_MakeSize+1 ; VB_IsHeapOver=true; break; } //if(VP_MakeLink==0) VP_TempLink->mp_NextLink=VP_MakeLink; VP_TempLink=VP_MakeLink; } //while(--AL_MakeSize>0) APR_TailLink = VP_TempLink; // ¸Þ¸ð¸®¸¦ ´õ ÀÌ»ó ÇÒ´çÇÒ ¼ö ¾ø¾ú´Ù¸é // ÀÌ¹Ì ¸¸µé¾îÁø VL_Count °³ÀÇ ºñ¿øÇü ÀÌÁß ¸µÅ©¸¦ Áö¿î´Ù. if(VB_IsHeapOver==true) { VP_TempLink=APR_HeadLink; // ÀÌ ½ÃÁ¡¿¡¼­ ÃÖ¼ÒÇÑ APR_HeadLink Çϳª´Â // heap ¿¡ »ý¼ºµÇ¾î ÀÖ´Ù. do ////// { delete VP_TempLink; if(VP_TempLink==APR_TailLink) { DeleteAllInHeap(); // Add extra codes for memory over return; } //if(VP_TempLink==APR_TailLink) APR_HeadLink=APR_HeadLink->mp_NextLink; } while(true); } //if(VB_IsHeapOver==true) } //void MakeLink(TTypSize AL_MakeSize,ZCLink*& APR_HeadLink,ZCLink*& APR_TailLink) void MakeLinkCopy( ZCLink* AP_LinkOrgin, TTypSize AL_FarNum, ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy /**************/ ) { // AP_LinkOrgin ¸µÅ©ºÎÅÍ, // AP_LinkOrgin ¿¡¼­ AL_FarNum ¸¸Å­ ¶³¾îÁø ¸µÅ©±îÁö¸¦ º¹»çÇÏ¿© // º¹»ç»ý¼ºµÈ óÀ½ ¸µÅ© Æ÷ÀÎÅ͸¦ APR_HeadCopy ¿¡, // ¸¶Áö¸· ¸µÅ©¸¦ APR_TailCopy ¿¡ ´ëÀÔÇÑ´Ù. // AL_FarNum > 0 , ÃÑ AL_FarNum + 1 °³ÀÇ ¸µÅ©°¡ ¸¸µé¾îÁø´Ù. #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX #ifdef _DEBUG ZNsMain::ZCCheckAlloc::ZCAllowAlloc CAllowAllocObj; #endif //_DEBUG ZCLink* VP_MakeLink =0; ZCLink* VP_TempLink =0; bool VB_IsHeapOver=false; VP_TempLink = \ VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Type); ml_AllSize += AL_FarNum+1 ; if(VP_MakeLink==0) { //add codes for memory over ml_AllSize -= AL_FarNum+1 ; DeleteAllInHeap(); return; } //if(VP_MakeLink==0) APR_HeadCopy=VP_MakeLink; while(--AL_FarNum >= 0) { AP_LinkOrgin= AP_LinkOrgin->mp_NextLink; VP_MakeLink = new ZCLink(AP_LinkOrgin->mo_Type); if(VP_MakeLink==0) { ml_AllSize -= AL_FarNum+1 ; APR_TailCopy =VP_TempLink; VB_IsHeapOver=true; break; } //if(VP_MakeLink==0) VP_TempLink->mp_NextLink=VP_MakeLink; VP_TempLink = VP_MakeLink; } //while(--AL_FarNum >= 0) APR_TailCopy=VP_TempLink; // ¸Þ¸ð¸®¸¦ ´õ ÀÌ»ó ÇÒ´çÇÒ ¼ö ¾ø¾ú´Ù¸é // ÀÌ¹Ì ¸¸µé¾îÁø ºñ¿øÇü ÀÌÁß ¸µÅ©¸¦ Áö¿î´Ù. if(VB_IsHeapOver==true) { do ////// { delete APR_HeadCopy; if(APR_HeadCopy==APR_TailCopy) { DeleteAllInHeap(); return; } //if(APR_HeadCopy==APR_TailCopy) APR_HeadCopy=APR_HeadCopy->mp_NextLink; } while(true); } //if(VB_IsHeapOver==true) } /*void MakeLinkCopy( ZCLink* AP_LinkOrgin, TTypSize AL_FarNum, ZCLink*& APR_HeadCopy, ZCLink*& APR_TailCopy ////////////// ) */ void ReceiveLink(ZCLink* AP_Link) { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX AP_Link->mp_NextLink=0; if(++ml_UseSize==1) // ml_UseSize ÀÌ 0 À϶§ { mp_NoUseHeadLink = mp_NoUseTailLink = AP_Link ; } else { // »õ·Î¿î ¸µÅ©´Â mp_NoUseTailLink ´ÙÀ½¿¡ ºÙÀδÙ. mp_NoUseTailLink->mp_NextLink=AP_Link; mp_NoUseTailLink=AP_Link; } //else } //void ReceiveLink(ZCLink* AP_Link) void ReceiveLink(ZCLink* AP_HeadLink,ZCLink* AP_TailLink,TTypSize AL_Count) { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX if(ml_UseSize==0) { mp_NoUseHeadLink = AP_HeadLink ; mp_NoUseTailLink = AP_TailLink ; } else { // »õ·Î¿î ¸µÅ©´Â mp_NoUseTailLink ´ÙÀ½¿¡ ºÙÀδÙ. mp_NoUseTailLink->mp_NextLink=AP_HeadLink; mp_NoUseTailLink=AP_TailLink; } //else mp_NoUseTailLink->mp_NextLink=0; ml_UseSize+=AL_Count; } //void ReceiveLink(ZCLink* AP_HeadLink,ZCLink* AP_TailLink,TTypSize AL_Count) //private: public : ZCLinkHeap() { ml_AllSize = ml_UseSize = 0 ; mp_NoUseHeadLink = mp_NoUseTailLink = 0 ; ZNsMain::GetCHeapAllocList().AddFreeAllocBase(*this); } //ZCLinkHeap() ~ZCLinkHeap() { #ifndef _SIMLIST_FREE_STORE_CHECK_ #ifdef _SIMLIST_FREE_STORE_LOG_ if( ml_UseSize>0 ) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<0 ) #endif //_SIMLIST_FREE_STORE_LOG_ return ; #endif //!_SIMLIST_FREE_STORE_CHECK_ if(ml_UseSize==0) return ; //endif ZCLink* VP_DelLink=mp_NoUseHeadLink; do ////// { mp_NoUseHeadLink = mp_NoUseHeadLink->mp_NextLink; delete VP_DelLink; VP_DelLink = mp_NoUseHeadLink ; } while(VP_DelLink!=0); ml_AllSize -= ml_UseSize; ml_UseSize = 0 ; mp_NoUseHeadLink = mp_NoUseTailLink = 0 ; } //~ZCLinkHeap() void DeleteAllInHeap() { #ifdef _REENTRANT_MUTEX ZNsMain::CMutexSmallLock VO_CMutexSmallLock(mo_Mutex); #endif //_REENTRANT_MUTEX if(ml_UseSize==0) return ; //endif ZCLink* VP_DelLink=mp_NoUseHeadLink; do ////// { mp_NoUseHeadLink = mp_NoUseHeadLink->mp_NextLink; delete VP_DelLink; VP_DelLink = mp_NoUseHeadLink ; } while(VP_DelLink!=0); ml_AllSize -= ml_UseSize; ml_UseSize = 0 ; mp_NoUseHeadLink = mp_NoUseTailLink = 0 ; } //void DeleteAllInHeap() TTypSize GetUseLinkSize() const { return ml_UseSize; } //TTypSize GetUseLinkSize() const TTypSize GetAllLinkSize() const { return ml_AllSize; } //TTypSize GetAllLinkSize() const long GetHeapSize() const { return ml_UseSize; } //long GetHeapSize() const long GetMemSize() const { return ml_UseSize*sizeof(ZCLink); } //long GetMemSize() const TypeInit& GetTypeInit() { return mo_TypeInit; } //TypeInit& GetTypeInit() //public: }; //class ZCLinkHeap //////////////////////////////////////////////// /************ end class ZCLinkHeap ************/ //////////////////////////////////////////////// //public : protected: TTypSize ml_Size ; ZCLink* mp_HeadLink; ZCLink* mp_TailLink; /////////////////////////////////////////////////////////////// ZtCSimList& CopyLink /*######################################*/ ( const ZCLink* const AP_CopyLink , TTypSize AL_FarNum , ZtCSimList& ARR_StoreList ) const /*###########################################################*/ { // AP_CopyLink ºÎÅÍ AP_CopyLink->GetNextPrePtr(AL_FarNum) // ¸µÅ©±îÁö¸¦ º¹»çÇÑ´Ù. ÃÑ AL_FarNum + 1 °³ÀÇ ¸µÅ©°¡ ¸¸µé¾î Áø´Ù. ZCLink* VP_HeadLink=0; ZCLink* VP_TailLink=0; GetCLinkHeap().GetManyLinkCopy ( const_cast(AP_CopyLink), // g++ ¿¡¼­´Â ¹Ýµå½Ã AP_CopyLink ºÎºÐÀ» () ·Î ¹­¾î ÁÙ °Í. AL_FarNum , VP_HeadLink , VP_TailLink ); ////////////////////////////// VP_TailLink->mp_NextLink=0; ARR_StoreList.mp_HeadLink=VP_HeadLink; ARR_StoreList.mp_TailLink=VP_TailLink; ARR_StoreList.ml_Size =AL_FarNum+1 ; return ARR_StoreList; }/* ZtCSimList& CopyLink ########################################## ( const ZCLink* const AP_CopyLink , TTypSize AL_FarNum , ZtCSimList& ARR_StoreList ) const #############################################################*/ ZCLink* CutLink(ZCLink* AP_PrevLink, ZCLink* AP_CutLink) { // ZCLink* AP_PrevLink : »èÁ¦ÇÏ·Á´Â ¸µÅ©ÀÇ ÀÌÀü ¸µÅ© // ZCLink* AP_CutLink : »èÁ¦ÇÏ·Á´Â ¸µÅ© // »èÁ¦ÇÏ·Á´Â ¸µÅ©ÀÇ À§Ä¡°ªÀ» ¾Ë ¼ö ¾øÀ¸¹Ç·Î // ¸ðµç ¸µÅ©¸¦ »èÁ¦ÇÑ´Ù´Â ½ÅÈ£¸¦ º¸³½´Ù. OnDelete(mp_HeadLink, 1, mp_HeadLink->mp_PrevLink, ml_Size); if(AP_CutLink==mp_HeadLink) { if(mp_HeadLink==mp_TailLink) { mp_HeadLink=0; mp_TailLink=0; } else { mp_HeadLink=mp_HeadLink->mp_NextLink; } //else } else if(AP_CutLink==mp_TailLink) { AP_PrevLink->mp_NextLink=0; } else { AP_PrevLink->mp_NextLink=AP_CutLink->mp_NextLink; } //else return (--ml_Size, AP_CutLink); }/* ZCLink* CutLink(ZCLink* AP_PrevLink, ZCLink* AP_CutLink)*/ ZCLink* CutLink(ZCLink* AP_PrevLink, ZCLink* AP_CutLink, TTypSize AL_CutPos) { OnDelete(AP_CutLink, AL_CutPos, AP_CutLink, AL_CutPos); if(AP_CutLink==mp_HeadLink) { if(mp_HeadLink==mp_TailLink) { mp_HeadLink=0; mp_TailLink=0; } else { mp_HeadLink=mp_HeadLink->mp_NextLink; } //else } else if(AP_CutLink==mp_TailLink) { AP_PrevLink->mp_NextLink=0; } else { AP_PrevLink->mp_NextLink=AP_CutLink->mp_NextLink; } //else return (--ml_Size, AP_CutLink); } //ZCLink* CutLink(ZCLink* AP_PrevLink, ZCLink* AP_CutLink, TTypSize AL_CutPos) ZtCSimList& CutLink /*###############################*/ ( ZCLink* AP_CutHeadPrev, ZCLink* AP_CutHead , TTypSize AL_CutHeadPos, ZCLink* AP_CutTail , TTypSize AL_CutTailPos, ZtCSimList& ARR_StoreList ) /*###################################################*/ { // AP_CutHead ´Â »èÁ¦ÇÏ·Á´Â ¸µÅ©ÀÇ ¹üÀ§ÀÇ ¾ÕÀÇ ¸µÅ©, AL_CutHeadPos ´Â ±× À§Ä¡ ,AP_CutHeadPrev ´Â ±× ÀÌÀü ¸µÅ© // AP_CutTail Àº »èÁ¦ÇÏ·Á´Â ¸µÅ©ÀÇ ¹üÀ§ÀÇ µÚÀÇ ¸µÅ©, AL_CutTailPos ´Â ±× À§Ä¡ // AP_CutTail ÀÇ ÀÌÀü ¸µÅ©µµ ´ëÀÔ¹Þ¾Æ¾ß Â¦¾Æ ¸ÂÀ» °Í °°Áö¸¸ ¾È±×·¡µµ µÈ´Ù. OnDelete(AP_CutHead, AL_CutHeadPos, AP_CutTail, AL_CutTailPos); if(AP_CutHead==mp_HeadLink) { if(AP_CutTail==mp_TailLink) { // ¸ðµç ¸µÅ©¸¦ »èÁ¦ÇÒ ¶§. mp_HeadLink=0; mp_TailLink=0; } else { mp_HeadLink=AP_CutTail->mp_NextLink; } //endif } else if(AP_CutTail==mp_TailLink) // Àß¶ó³»·Á´Â ¸µÅ©°¡ ³¡ ¸µÅ©¸¦ Æ÷ÇÔÇÒ ¶§. { mp_TailLink=AP_CutHeadPrev; mp_TailLink->mp_NextLink=0; } else // Àß¶ó³»·Á´Â ¸µÅ©°¡ óÀ½°ú ³¡ ¸µÅ©¸¦ Æ÷ÇÔÇÏÁö ¾ÊÀ» ¶§. { AP_CutHeadPrev->mp_NextLink=AP_CutTail->mp_NextLink; } //else ml_Size -= AL_CutTailPos-AL_CutHeadPos+1 ; #ifdef _DEBUG if(ARR_StoreList.IsEmpty()!=true) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout< 0 ZCLink* VP_HeadLink=0; ZCLink* VP_TailLink=0; GetCLinkHeap().GetManyLink(AL_DefaultSize, VP_HeadLink, VP_TailLink); ZCLink::MakeCircle(VP_HeadLink, VP_TailLink); ARR_StoreList.mp_HeadLink=VP_HeadLink; ARR_StoreList.mp_TailLink=VP_TailLink; ARR_StoreList.ml_Size =AL_DefaultSize; return ARR_StoreList; } //ZtCSimList& MakeDefault(TTypSize AL_DefaultSize ,ZtCSimList& ARR_StoreList) const virtual void OnDelete( ZCLink* AP_CutHead, TTypSize AL_CutHeadPos, ZCLink* AP_CutTail, TTypSize AL_CutTailPos /*////////////////*/ ) { // »ó¼ÓŬ·¡½º¿¡¼­ Ãß°¡µÈ ¸â¹ö µ¥ÀÌŸ°¡ ¸µÅ©ÀÇ »èÁ¦½Ã º¯ÇØ¾ß ÇÏ´Â °ªÀ̶ó¸é // ÀÌ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇ ÇÏ¿© °ªÀ» Á¶Á¾ÇÑ´Ù. } /* virtual void OnDelete( ZCLink* AP_CutHead,TTypSize AL_CutHeadPos, ZCLink* AP_CutTail,TTypSize AL_CutTailPos //////////////////// ) */ virtual void OnInsert( TTypSize AL_InsertPos , // »ðÀԵǴ À§Ä¡ TTypSize AL_InsertSize, // »ðÀԵǴ ¸µÅ©ÀÇ °¹¼ö ZCLink* AP_HeadInsert // »ðÀԵǴ ù¹øÂ° ¸µÅ©ÀÇ Æ÷ÀÎÅÍ /*////////////////*/ ) { // »ó¼ÓŬ·¡½º¿¡¼­ Ãß°¡µÈ ¸â¹ö µ¥ÀÌŸ°¡ ¸µÅ©ÀÇ »ðÀԽà º¯ÇØ¾ß ÇÏ´Â °ªÀ̶ó¸é // ÀÌ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇ ÇÏ¿© °ªÀ» Á¶Á¾ÇÑ´Ù. } /* virtual void OnInsert( TTypSize AL_InsertPos , TTypSize AL_InsertSize, ZCLink* AP_HeadInsert //////////////////// ) */ //protected: public : ZtCSimList() { ml_Size =0; mp_HeadLink=0; mp_TailLink=0; }/* ZtCSimList()*/ ZtCSimList(TypeArg AR_Type) { ml_Size =0; mp_HeadLink=0; mp_TailLink=0; AddTail(AR_Type); }/* ZtCSimList(TypeArg AR_Type)*/ ZtCSimList(const ZtCSimList& rhs) { ml_Size =0; mp_HeadLink=0; mp_TailLink=0; ZtCSimList VO_StoreList; JoinHead( CopyLink(rhs.mp_HeadLink, rhs.ml_Size-1 ,VO_StoreList) ); }/* ZtCSimList(const ZtCSimList& rhs)*/ ZtCSimList& operator=(const ZtCSimList& rhs) { if(&rhs ==this){return *this;} { DeleteAll(); } if(rhs.ml_Size==0 ){return *this;} ZtCSimList VO_StoreList; JoinHead /////////////////////////// ( CopyLink(rhs.mp_HeadLink, rhs.ml_Size-1 ,VO_StoreList) ); return *this; ////////////////////// }/* ZtCSimList& operator=(const ZtCSimList& rhs)*/ virtual ~ZtCSimList() { DeleteAll(); }/* virtual ~ZtCSimList()*/ ZtCSimList& operator()(TypeArg AR_Type) { AddTail(AR_Type); return *this; }/* ZtCSimList& operator()(TypeArg AR_Type)*/ TType& operator[](TTypSize 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 return GetLinkPtr(AL_Index)->mo_Type; }/* TType& operator[](TTypSize AL_Index)*/ const TType& operator[](TTypSize 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)->mo_Type; } //const TType& operator[](TTypSize AL_Index) const operator TType& () { return AddTailDefault()->mo_Type; }/* operator TType& ()*/ TType& operator()() { return AddTailDefault()->mo_Type; }/* TType& operator()()*/ void AddHead(TypeArg AR_Type) { ZCLink* VP_AddLink=GetCLinkHeap().GetOneLink(); VP_AddLink->mo_Type=AR_Type; if(++ml_Size==1) // ml_Size==0 { mp_HeadLink = mp_TailLink = VP_AddLink ; } else { VP_AddLink->mp_NextLink =mp_HeadLink; mp_HeadLink=VP_AddLink; }/* else*/ }/* void AddHead(TypeArg AR_Type)*/ ZCLink* AddHeadDefault() { ZCLink* VP_AddLink=GetCLinkHeap().GetOneLink(); if(++ml_Size==1) // ml_Size==0 { mp_HeadLink = mp_TailLink = VP_AddLink ; } else { VP_AddLink->mp_NextLink =mp_HeadLink; mp_HeadLink=VP_AddLink; } //else return mp_HeadLink; }/* ZCLink* AddHeadDefault()*/ void AddTail(TypeArg AR_Type) { ZCLink* VP_AddLink = GetCLinkHeap().GetOneLink(); VP_AddLink->mo_Type= AR_Type; if(++ml_Size==1) // ml_Size==0 { mp_HeadLink = mp_TailLink = VP_AddLink ; } else { mp_TailLink->mp_NextLink=VP_AddLink; mp_TailLink=mp_TailLink->mp_NextLink; }/* else*/ }/* void AddTail(TypeArg AR_Type)*/ ZCLink* AddTailDefault() { ZCLink* VP_AddLink = GetCLinkHeap().GetOneLink(); if(++ml_Size==1) // ml_Size==0 { mp_HeadLink = mp_TailLink = VP_AddLink ; } else { mp_TailLink->mp_NextLink = VP_AddLink ; mp_TailLink=mp_TailLink->mp_NextLink; }/* else*/ return mp_TailLink; }/* ZCLink* AddTailDefault()*/ void AddHeadDefault(TTypSize AL_DefaultSize) { if(AL_DefaultSize<1) return; ZtCSimList VO_StoreList; JoinHead ( MakeDefault(AL_DefaultSize ,VO_StoreList) ); ////////////////////////////////// }/* void AddHeadDefault(TTypSize AL_DefaultSize)*/ void AddTailDefault(TTypSize AL_DefaultSize) { if(AL_DefaultSize<1) return; ZtCSimList VO_StoreList; JoinTail ( MakeDefault(AL_DefaultSize ,VO_StoreList) ); ////////////////////////////////// }/* void AddTailDefault(TTypSize AL_DefaultSize)*/ ZCLink* GetHeadLinkPtr (){return mp_HeadLink;} ZCLink* GetHeadIterEasy (){return mp_HeadLink;} IterEasyID GetHeadIterEasyID(){return (IterEasyID)mp_HeadLink;} ZCLink* GetTailLinkPtr (){return mp_TailLink;} ZCLink* GetTailIterEasy (){return mp_TailLink;} IterEasyID GetTailIterEasyID(){return (IterEasyID)mp_TailLink;} ZCLink* front(){return mp_HeadLink;} ZCLink* back (){return mp_TailLink;} const ZCLink* GetHeadLinkPtr () const{return mp_HeadLink;} const ZCLink* GetHeadIterEasy () const{return mp_HeadLink;} const IterEasyID GetHeadIterEasyID() const{return (IterEasyID)mp_HeadLink;} const ZCLink* GetTailLinkPtr () const{return mp_TailLink;} const ZCLink* GetTailIterEasy () const{return mp_TailLink;} const IterEasyID GetTailIterEasyID() const{return (IterEasyID)mp_TailLink;} const ZCLink* front() const{return mp_HeadLink;} const ZCLink* back () const{return mp_TailLink;} void pop_back(TypeArg AR_Type) { return AddHead(AR_Type); }/* void pop_back(TypeArg AR_Type)*/ void push_back(TypeArg AR_Type) { return AddTail(AR_Type); }/* void push_back(TypeArg AR_Type)*/ TType& GetHeadData() { #ifdef _DEBUG if(mp_HeadLink==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mo_Type; }/* TType& GetHeadData()*/ const TType& GetHeadData() const { #ifdef _DEBUG if(mp_HeadLink==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mo_Type; }/* const TType& GetHeadData() const*/ TType& GetTailData() { #ifdef _DEBUG if(mp_TailLink==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mo_Type ; }/* TType& GetTailData()*/ const TType& GetTailData() const { #ifdef _DEBUG if(mp_TailLink==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mo_Type ; }/* const TType& GetTailData() const*/ TType& GetData(TTypSize 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 return GetLinkPtr(AL_Index)->mo_Type; }/* TType& GetData(TTypSize AL_Index)*/ TType GetData(TTypSize 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)->mo_Type; }/* TType GetData(TTypSize AL_Index) const*/ void JoinHead(ZCLink* AP_Link) { #ifdef _DEBUG if(AP_Link==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mp_NextLink=0; return; }/* if(mp_HeadLink==0)*/ AP_Link->mp_NextLink=mp_HeadLink; mp_HeadLink=AP_Link; ++ml_Size; }/* void JoinHead(ZCLink* AP_Link)*/ void JoinTail(ZCLink* AP_Link) { #ifdef _DEBUG if(AP_Link==0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<mp_NextLink=0; if(mp_HeadLink==0) { mp_HeadLink = mp_TailLink = AP_Link ; } else { mp_TailLink->mp_NextLink=AP_Link; mp_TailLink=AP_Link; }/* else*/ ++ml_Size; }/* void JoinTail(ZCLink* AP_Link)*/ void JoinHead(ZtCSimList& rhs) { if(this==&rhs || rhs.mp_HeadLink==0) {return;} //////////////////////////////////// rhs.OnDelete( rhs.mp_HeadLink, 1, rhs.mp_TailLink, rhs.ml_Size /*********/ ); OnInsert(1, rhs.ml_Size, rhs.mp_HeadLink); if(mp_HeadLink==0) { mp_HeadLink=rhs.mp_HeadLink; mp_TailLink=rhs.mp_TailLink; ml_Size =rhs.ml_Size ; } else { rhs.mp_TailLink->mp_NextLink=mp_HeadLink; mp_HeadLink=rhs.mp_HeadLink; ml_Size += rhs.ml_Size; }/* else*/ rhs.mp_HeadLink=0; rhs.mp_TailLink=0; rhs.ml_Size =0; }/* void JoinHead(ZtCSimList& rhs)*/ void JoinTail(ZtCSimList& rhs) { if(this==&rhs || rhs.mp_HeadLink==0) { return; } //////////////////////////////////// rhs.OnDelete( rhs.mp_HeadLink, 1, rhs.mp_TailLink, rhs.ml_Size /*********/ ); OnInsert(ml_Size+1, rhs.ml_Size, rhs.mp_HeadLink); if(mp_HeadLink==0) { mp_HeadLink=rhs.mp_HeadLink; mp_TailLink=rhs.mp_TailLink; ml_Size =rhs.ml_Size ; } else { mp_TailLink->mp_NextLink=rhs.mp_HeadLink; mp_TailLink=rhs.mp_TailLink; ml_Size += rhs.ml_Size; }/* else*/ rhs.mp_HeadLink=0; rhs.mp_TailLink=0; rhs.ml_Size =0; }/* void JoinTail(ZtCSimList& rhs)*/ void DeleteHead() { if(ml_Size==0) return; ZCLink* VP_DelLink=mp_HeadLink; mp_HeadLink=mp_HeadLink->mp_NextLink; GetCLinkHeap().ReceiveLink(VP_DelLink); if(--ml_Size==0) { mp_HeadLink = mp_TailLink = 0 ; }/* if(--ml_Size==0)*/ }/* void DeleteHead()*/ void DeleteHead(TTypSize AL_DelSize) { // AL_DelSize °³ÀÇ ¸µÅ©¸¦ ¾Õ ºÎºÐ¿¡¼­ »èÁ¦ if(AL_DelSize>ml_Size) AL_DelSize=ml_Size; ZtCSimList VO_StoreList; CutLink( 0, mp_HeadLink, 1, mp_HeadLink->GetNextPtr(AL_DelSize-1), AL_DelSize , VO_StoreList).DeleteAll(); }/* void DeleteHead(TTypSize AL_DelSize)*/ void DeleteTail() { if(ml_Size==0){return;} ZCLink* VP_CutLink=mp_TailLink; if(--ml_Size==0) { mp_HeadLink = mp_TailLink = 0 ; return; }/* if(--ml_Size==0)*/ mp_TailLink = mp_HeadLink->GetNextPtr(ml_Size-1); mp_TailLink->mp_NextLink=0 ; GetCLinkHeap().ReceiveLink(VP_CutLink); }/* void DeleteTail()*/ void DeleteTail(TTypSize AL_DelSize) { if(ml_Size==0){return;} if(AL_DelSize>ml_Size) AL_DelSize=ml_Size; if(AL_DelSize==ml_Size) { GetCLinkHeap().ReceiveLink(mp_HeadLink,mp_TailLink,ml_Size); mp_HeadLink=0; mp_TailLink=0; ml_Size =0; return; }/* if(AL_DelSize==ml_Size)*/ ZCLink* VP_NewTail=mp_HeadLink->GetNextPtr(ml_Size-AL_DelSize-1); GetCLinkHeap().ReceiveLink(VP_NewTail->mp_NextLink,mp_TailLink,AL_DelSize); mp_TailLink=VP_NewTail; mp_TailLink->mp_NextLink=0; ml_Size -= AL_DelSize ; }/* void DeleteTail(TTypSize AL_DelSize)*/ void Delete(ZCLink* AP_PrevLink, ZCLink* AP_CutLink) { #ifdef _DEBUG if ( Find(AP_CutLink)==0 || Find(AP_CutLink)!=Find(AP_PrevLink)+1 ) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<AL_CutTailPos || Find(AP_CutHead)!=AL_CutHeadPos || Find(AP_CutTail)!=AL_CutTailPos || (AL_CutHeadPos!=1 && AP_CutHeadPrev->mp_NextLink!=AP_CutHead) ) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout< ml_Size ); if(CB_DoStop) {return 0;} ///////// TTypSize VL_FindIndex = AL_FirstFindIndex ; ZCLink* VP_TempLink = const_cast (GetLinkPtr(AL_FirstFindIndex)); do ////// { if(VP_TempLink==AP_pSearchLink) {return VL_FindIndex;} /////////////////////////////// if(VL_FindIndex==ml_Size){return 0; } VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; } while(true); }/* TTypSize Find(ZCLink* AP_pSearchLink, TTypSize AL_FirstFindIndex=1) const*/ TTypSize Find(TypeArg AR_TypeArg, TTypSize AL_FirstFindIndex=1) { const bool CB_DoStop = ( mp_HeadLink==0 || AL_FirstFindIndex<1 || AL_FirstFindIndex>ml_Size ); if(CB_DoStop) return 0; TTypSize VL_FindIndex = AL_FirstFindIndex ; ZCLink* VP_TempLink = const_cast (GetLinkPtr(AL_FirstFindIndex)); do ////// { if(**VP_TempLink==AR_TypeArg) {return VL_FindIndex;} //////////////////////////// if(VL_FindIndex==ml_Size){return 0; } VP_TempLink=VP_TempLink->mp_NextLink; ++VL_FindIndex; } while(true); }/* TTypSize Find(TypeArg AR_TypeArg, TTypSize AL_FirstFindIndex=1)*/ /*//////////////////////////////////////////////////////////////////////////////////////// ¡á FindData(TTypeArg, ~) ÇÔ¼ö°¡ ¾ø´Ù¸é, TypeCArg ÀÌ const TType& À¸·Î Á¤ÀǵǾî ÀÖ´Â °æ¿ì, const TType& ¿¡ ´ëÇØ¼­¸¸ ã±â¸¦ ¼öÇàÇÒ ¼ö ÀÖ°í, TType& ¿¡ ´ëÇØ¼­´Â ã±â¸¦ ¼öÇàÇÒ ¼ö ¾ø´Ù. -- 2010-05-29 21:31:00 ////////////////////////////////////////////////////////////////////////////////////////*/ TTypSize FindData(TypeArg AR_TypeArg, TTypSize AL_FirstFindIndex=1) const { return Find(AR_TypeArg, AL_FirstFindIndex); }/* TTypSize FindData(TypeArg AR_TypeArg, TTypSize AL_FirstFindIndex=1) const*/ ZCLink* GetLinkPtr(TTypSize 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 return mp_HeadLink->GetNextPtr(AL_Index-1); }/* ZCLink* GetLinkPtr(TTypSize AL_Index)*/ const ZCLink* GetLinkPtr(TTypSize 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 mp_HeadLink->GetNextPtr(AL_Index-1); }/* const ZCLink* GetLinkPtr(TTypSize AL_Index) const*/ static ZCLinkHeap& GetCLinkHeap() { static ZCLinkHeap SO_CLinkHeap; return SO_CLinkHeap; }/* static ZCLinkHeap& GetCLinkHeap()*/ inline TTypSize GetSize() const { return ml_Size; }/* inline TTypSize GetSize() const*/ inline TTypSize size() const { return ml_Size; }/* inline TTypSize size() const*/ inline bool IsEmpty() const { return mp_HeadLink==0; }/* inline bool IsEmpty() const*/ // ***************************************************************** // // *********************** Functor ºÎºÐ ½ÃÀÛ *********************** // // ***************************************************************** // template void IterElement(TFunctor AO_Functor) { ZCLink* VP_LoopLink = mp_HeadLink; __for1(TTypSize, VL_Index, ml_Size) { ZtCTypeData:: GetObjRef(AO_Functor)(VP_LoopLink->mo_Type); VP_LoopLink = VP_LoopLink->mp_NextLink; }/* __for1(TTypSize, VL_Index, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor) */ template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) { typedef ZNsMain:: ZtCCheckRef ZCCheckRef; ZCLink* VP_LoopLink=mp_HeadLink; __for0(TTypSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor) ( VP_LoopLink->mo_Type, ZCCheckRef::PassData(AO_TypeHelp) ); //////////////////////////////////////////// VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* __for0(TTypSize, i, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ template void IterElement (TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2) { typedef ZNsMain::ZtCCheckRef ZCCheckRef1; typedef ZNsMain::ZtCCheckRef ZCCheckRef2; ZCLink* VP_LoopLink = mp_HeadLink ; __for0(TTypSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor) ( VP_LoopLink->mo_Type , ZCCheckRef1::PassData(AO_TypeHelp1), ZCCheckRef2::PassData(AO_TypeHelp2) ); //////////////////////////////////////////// VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* __for0(TTypSize, i, ml_Size)*/ }/* template void IterElement (TFunctor AO_Functor, TTypeHelp1 AO_TypeHelp1, TTypeHelp2 AO_TypeHelp2) */ template void IterEleCutIf(TFunctor AO_Functor) { // °¢ ¸µÅ©¿¡ ´ëÇÏ¿© AO_Functor(ZCLink*) ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù. // ÀÌ ÇÔ¼ö¸¦ ¼³°èÇÑ ÀÌÀ¯´Â °¢ ¸µÅ©¸¦ ¼øÈ¸Çϸ鼭 »èÁ¦ÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­´Ù. ZCLink* VP_TempLink =mp_HeadLink ; ZCLink* VP_TempPrev =0 ; ZCLink* VP_TempBefore=VP_TempLink ; // ¼øÈ¸ µµÁß¿¡ ¸µÅ©°¡ »èÁ¦µÇ¸é ³ëµå°¹¼ö°¡ º¯ÇÒ ¼ö ÀÖÀ¸¹Ç·Î // ml_Size ¸¦ ´Ù¸¥ º¯¼ö¿¡ ´ã¾Æ ³õ´Â´Ù. TTypSize VL_Count=ml_Size ; TTypSize VL_Index=1 ; __for1(TTypSize, VL_Loop, VL_Count) { VP_TempLink=VP_TempLink->mp_NextLink; const bool CB_IsTrue = ZtCTypeData:: GetObjRef(AO_Functor)( VP_TempBefore->mo_Type ); if(CB_IsTrue) { Delete(VP_TempPrev, VP_TempBefore, VL_Index); } else { ++VL_Index; if(VP_TempPrev==0) VP_TempPrev=VP_TempBefore; else VP_TempPrev=VP_TempPrev->mp_NextLink; }/* else*/ VP_TempBefore=VP_TempLink; }/* __for1(TTypSize, VL_Loop, VL_Count)*/ }/* template void IterEleCutIf(TFunctor AO_Functor) */ template void IterEleLink ( ZCLink* AP_StdLink , TTypSize AL_WorkDistance, TFunctor AO_Functor ) /*########################################*/ { /* AP_StdLink ºÎÅÍ AL_WorkDistance ¸¸Å­ À̵¿Çϸ鼭 * °¢ ZCLink ¿¡ ´ëÇÏ¿© AO_Functor() ÇÔ¼ö¸¦ ¼öÇàÇÑ´Ù.(ÃÑ ¼öÇà Ƚ¼ö´Â (AL_WorkDistance)Àý´ë°ª+1) * AL_WorkDistance>=0 ÀÌ¸é ´ÙÀ½À¸·Î À̵¿Çϰí * AL_WorkDistance <0 À̸é ÀÌÀüÀ¸·Î À̵¿ÇÑ´Ù. */ #ifdef _DEBUG if(ml_Size==0 || Find(AP_StdLink)==0 || AL_WorkDistance>=ml_Size || AL_WorkDistance<0) { std::fstream fileout("DEBUG.txt",std::ios::out | std::ios::app); fileout<=ml_Size || AL_WorkDistance<0)*/ #endif //_DEBUG for(TTypSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop) { ZtCTypeData:: GetObjRef(AO_Functor)(AP_StdLink); AP_StdLink = AP_StdLink->mp_NextLink ; }/* for(TTypSize VL_Loop=0; VL_Loop<=AL_WorkDistance; ++VL_Loop)*/ }/* void IterEleLink ///////////////// ( ZCLink* AP_StdLink , TTypSize AL_WorkDistance, TFunctor AO_Functor ) ////////////////////////////////*/ // *************************************************************** // *********************** Functor ºÎºÐ ³¡ *********************** // *************************************************************** /*/////////////////////////////////////////////////////////////////////////// ¡á ¼øÂ÷ÀûÀ¸·Î °¢ ¿ø¼Ò¸¦ ¼øÈ¸ÇÒ ¼ö ÀÖ´Â ÀÚ·á ±¸Á¶, Áï ¸®½ºÆ®³ª ¹è¿­ Ŭ·¡½º´Â MoveNextIter(), MovePrevIter() ¸â¹ö¸¦ °®´Â °ÍÀ¸·Î Á¤Çß´Ù. stl ÀÇ ¹Ýº¹ÀÚ´Â ³Ê¹« ÀϹÝÈ­ÇÏ´Ùº¸´Ï, ¼º´É »óÀÇ Á¦¾àÀÌ ¹ß»ýÇÑ °Í °°´Ù. -- 2011-06-07 20:25:00 GetDataInIter() ¸¦ Ãß°¡Çß´Ù. -- 2011-06-12 17:12:00 ///////////////////////////////////////////////////////////////////////////*/ void MoveNextIter(ZCLink*& APR_CLink) { APR_CLink=APR_CLink->GetNextPtr(); }/* void MoveNextIter(ZCLink*& APR_CLink)*/ void MoveNextIter(IterEasyID& APPI_IterEasyID) { MoveNextIter((ZCLink*&)APPI_IterEasyID); }/* void MoveNextIter(IterEasyID& APPI_IterEasyID)*/ void MoveNextIter(const ZCLink*& APR_CLink) const { APR_CLink=APR_CLink->GetNextPtr(); }/* void MoveNextIter(const ZCLink*& APR_CLink) const*/ void MoveNextIter(const IterEasyID& APPI_IterEasyID) const { MoveNextIter((const ZCLink*&)APPI_IterEasyID); }/* void MoveNextIter(const IterEasyID& APPI_IterEasyID) const*/ TType& GetDataInIter(ZCLink* AP_CLink) { return **AP_CLink; }/* TType& GetDataInIter(ZCLink* AP_CLink)*/ TType& GetDataInIter(IterEasyID APPI_IterEasyID) { return GetDataInIter((ZCLink*)APPI_IterEasyID); }/* TType& GetDataInIter(IterEasyID APPI_IterEasyID)*/ const TType& GetDataInIter(const ZCLink* AP_CLink) const { return **AP_CLink; }/* const TType& GetDataInIter(const ZCLink* AP_CLink) const*/ const TType& GetDataInIter(const IterEasyID APPI_IterEasyID) const { return GetDataInIter((const ZCLink*)APPI_IterEasyID); }/* const TType& GetDataInIter(const IterEasyID APPI_IterEasyID) const*/ /* public:*/ };/* class ZtCSimList*/ //////////////////////////////////////////////////////////// /****************** end class ZtCSimList ******************/ //////////////////////////////////////////////////////////// namespace ZNsExam { template class ZtCExamSimList { public: class CHelpObj { public: CHelpObj() { } CHelpObj(const CHelpObj& rhs) { cout<<"* CHelpObj(const CHelpObj& rhs)"< CObjList; CHelpObj VO_CHelpObj; CObjList VO_CObjList; VO_CObjList.AddTail(10); VO_CObjList.AddTail(20); VO_CObjList.AddTail(30); VO_CObjList.AddTail(40); cout< class ZtCExamSimList*/ }/* namespace ZNsExam*/ }/* namespace ZNsMain*/ #undef _TYPE_ARG_ #undef _TYPENAME_CSIM_LIST_ #undef _TYPENAME_ARGUMENT_ #undef _TYPENAME_ARGUMENT_DEFAULT_ #endif //__CSIMLIST_H__