diff --git a/ZCppMain/ZtCObjList.H b/ZCppMain/ZtCObjList.H index ff230cb..78a828e 100644 --- a/ZCppMain/ZtCObjList.H +++ b/ZCppMain/ZtCObjList.H @@ -1515,7 +1515,7 @@ namespace ZNsMain { ZCLink* VP_LoopLink=mp_HeadLink; - __for0(int, i, ml_Size) + __for0(TypeSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor)(VP_LoopLink->mo_Type); @@ -1524,7 +1524,7 @@ namespace ZNsMain VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(int, i, ml_Size)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor) */ @@ -1557,7 +1557,7 @@ namespace ZNsMain ZCLink* VP_LoopLink=mp_HeadLink; - __for0(int, i, ml_Size) + __for0(TypeSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor) ( @@ -1573,7 +1573,7 @@ namespace ZNsMain VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(int, i, ml_Size)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template void IterElement(TFunctor AO_Functor, TTypeHelp AO_TypeHelp) */ @@ -1614,7 +1614,7 @@ namespace ZNsMain ZCLink* VP_LoopLink=mp_HeadLink; - __for0(int, i, ml_Size) + __for0(TypeSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor) ( @@ -1629,7 +1629,7 @@ namespace ZNsMain VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(int, i, ml_Size)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template ############### @@ -1647,14 +1647,14 @@ namespace ZNsMain ZCLink* VP_LoopLink=mp_HeadLink; - __for0(int, i, ml_Size) + __for0(TypeSize, i, ml_Size) { ZtCTypeData::GetObjRef (AO_Functor)(VP_LoopLink->mo_Type, AR_TypeHelp); VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(int, i, ml_Size)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template void IterElemRef(TFunctor AO_Functor, TTypeHelp& AR_TypeHelp) */ @@ -1672,14 +1672,14 @@ namespace ZNsMain ZCLink* VP_LoopLink=mp_HeadLink; - __for0(int, i, ml_Size) + __for0(TypeSize, i, ml_Size) { ZtCTypeData::GetObjRef(AO_Functor) ( VP_LoopLink->mo_Type, AR_TypeHelp1, AR_TypeHelp2 ); VP_LoopLink = VP_LoopLink->mp_NextLink ; }/* - __for0(int, i, ml_Size)*/ + __for0(TypeSize, i, ml_Size)*/ }/* template ############### @@ -2305,7 +2305,7 @@ namespace ZNsMain } public: - }; CHelpObj VO_CHelpObj; cout<<"VO_CHelpObj Ptr : "<<&VO_CHelpObj< 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__