#ifndef __SUN_STL_UTILITY__ #define __SUN_STL_UTILITY__ #pragma once //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Generic Foreach Routines // Author : Waverix // Remark : ÈçÇÏ°Ô »ç¿ëµÇ´Â ·çÇÁ¿¡ ´ëÇÑ ÀϹÝÈ­µÈ ·çƾµéÀÌ´Ù. ÇÔ¼ö À̸§¿¡¼­ ±× ¿ªÇÒÀ» ÁöÁ¤ÇßÀ¸¸ç, // ½ÇÁ¦·Î »ç¿ëÇÒ °æ¿ì ÇØ´ç ·çÇÁ¿¡ ´ëÇÑ ¸í¼¼¸¦ ¼³¸íÇÑ ·¡ÆÛ¸¦ µÎ°í »ç¿ëÇϸé, // ´õ ÆíÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °Å¶ó ±â´ëÇÔ. // Spec & Usage : // VOID Foreach_Default spec 1 // BOOL Foreach_AnyConditionTrue spec 1 // BOOL Foreach_AllConditionTrue spec 1 // Foreach_IfTrueThenFuncCall spec 2 // Foreach_IfTrueThenContinue spec 1 // Foreach_IfTrueThenBreak spec 1 // Foreach_IfTrueThenDeleteNode_SequentialDS spec 1 // Foreach_IfTrueThenReleaseAndDeleteNode_SequentialDS spec 2 // Foreach_IfTrueThenDeleteNode_TreeDS spec 1 // Foreach_IfTrueThenReleaseAndDeleteNode_TreeDS spec 2 // // Usage Spec1 : // // 1) Wrapper´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ» ÃëÇÏ¸é µÈ´Ù. // template inline // VOID TriggerManagerEx::ForeachActiveTriggerWithDelete( _FN _func, const _OBJ& _left ) // { // Foreach_IfTrueThenDeleteNode_SequentialDS( // m_listActiveTrigger, // loop¸¦ µ¹ ÀڷᱸÁ¶ // m_listActiveTrigger.begin(), // loop¸¦ µ¹ ½ÃÀÛ iterator // m_listActiveTrigger.end(), // loop¸¦ Á¾·áÇÒ iterator // std::bind1st(std::mem_fun(_func), _left) // °¢ ³ëµå¿¡ ´ëÇÑ Ã³¸® function // ); // } // // 2) »ç¿ëÀº ´ÙÀ½°ú °°Àº Çü½ÄÀ» ÃëÇÏ¸é µÈ´Ù. // ~ TriggerManagerEx::Update() // { // ForeachActiveTriggerWithDelete( _Update, this ); // } // // 3) °¢ ³ëµå¿¡ ´ëÇÑ Ã³¸® fucntionÀº ´ÙÀ½°ú °°ÀÌ Ã³¸®ÇÏ¸é µÈ´Ù. // BOOL TriggerManagerEx::_Update( sTRIGGER_LIST_NODE rPair ) // { // BaseTrigger* pTrigger = rPair.second; // if( !pTrigger->Update() ) // { // ~~; // return TRUE; // Á¦°ÅÇÒ °æ¿ì, // } // return FALSE; // Á¦°ÅÇÏÁö ¾ÊÀ» °æ¿ì // } // Usage Spec2 : // // 1) Wrapper´Â ´ÙÀ½°ú °°Àº Çü½ÄÀ» ÃëÇÏ¸é µÈ´Ù. // template inline // VOID TriggerManagerEx::ForeachActiveTriggerWithReleaseDelete( _FN _func, const _OBJ& _left, _FNforRELEASE _func2, const _OBJforRELEASE& _left2 ) // { // Foreach_IfTrueThenReleaseAndDeleteNode_SequentialDS( // m_listActiveTrigger, // loop¸¦ µ¹ ÀڷᱸÁ¶ // m_listActiveTrigger.begin(), // loop¸¦ µ¹ ½ÃÀÛ iterator // m_listActiveTrigger.end(), // loop¸¦ Á¾·áÇÒ iterator // std::bind1st(std::mem_fun(_func), _left) // °¢ ³ëµå¿¡ ´ëÇÑ Ã³¸® function // std::bind1st(std::mem_fun(_func2), _left2) // °Ë»ç °á°ú TRUE½Ã 2¹øÂ° function È£Ãâ // ); // } // // 2) »ç¿ëÀº ´ÙÀ½°ú °°Àº Çü½ÄÀ» ÃëÇÏ¸é µÈ´Ù. // ~ TriggerManagerEx::Update() // { // ForeachActiveTriggerWithReleaseDelete( _Update, this, _Release, this ); // } // // 3) Á¦°ÅÇÒ ³ëµå¿¡ ´ëÇÑ Ãß°¡ È£Ãâ functionÀº ´ÙÀ½°ú °°ÀÌ Ã³¸®ÇÏ¸é µÈ´Ù. // ANY_TYPE TriggerManagerEx::_Release( sTRIGGER_LIST_NODE rPair ) // { // BaseTrigger* pTrigger = rPair.second; // FreeTrigger( pTrigger ); // return ANY_TYPE; (VOIDÆ÷ÇÔ) // } // Usage Operator: // // ¸â¹ö¿¡ ÇØ´ç ¿ÜºÎ Á¢±ÙÀ» ºÒÇãÇÒ °æ¿ì ·¦ÆÛ´Â ´ÙÀ½°ú °°ÀÌ ÁÙÀÏ ¼ö´Â ÀÖ´Ù. // template inline // VOID TriggerManagerEx::ForeachActiveTriggerWithReleaseDelete( _FN _func, _FNforRELEASE _func2 ) // { // Foreach_IfTrueThenReleaseAndDeleteNode_SequentialDS( // m_listActiveTrigger, // loop¸¦ µ¹ ÀڷᱸÁ¶ // m_listActiveTrigger.begin(), // loop¸¦ µ¹ ½ÃÀÛ iterator // m_listActiveTrigger.end(), // loop¸¦ Á¾·áÇÒ iterator // std::bind1st(std::mem_fun(_func), this) // °¢ ³ëµå¿¡ ´ëÇÑ Ã³¸® function // std::bind1st(std::mem_fun(_func2), this) // °Ë»ç °á°ú TRUE½Ã 2¹øÂ° function È£Ãâ // ); // } // // ÇÏÁö¸¸ ·çÇÁ¿¡ ´ëÇÑ Àü¹®ÀûÀÎ Operator¸¦ µÎ´Â °Ô ´õ ÁÁÀ» °æ¿ì°¡ ÀÖ´Ù. // // ¿¹¸¦ µé¾î, °¢ ³ëµå¸¦ ó¸®ÇÒ ¶§, Àӽà º¯¼ö¸¦ µÎ´Â°Ô ÇÊ¿äÇÒ °æ¿ì... // // 1) ~.h¿¡ Operator¸¦ ¼±¾ðÇÑ´Ù. // class TriggerManagerEx // { // ~~; // private: class Operator; // friend class Operator; // }; // // 2) ~.cpp¿¡ Operator¸¦ ±¸ÇöÇÑ´Ù. // class TriggerManagerEx::Operator // { // public: Operator( TriggerManagerEx* pMgr ) : m_pMGR(pMgr) {} // // routine process node // public: BOOL _Update( sTRIGGER_LIST_NODE rPair ) // { // ~~; // } // // BOOL _Release( sTRIGGER_LIST_NODE rPair ) // { // RELEASE_COUNT.Set( RELEASE_COUNT+1 ); // } // private: TriggerManagerEx* m_pMGR; // public: PROPERTY RELEASE_COUNT; // }; // //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_Default // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : VOID _OBJ::Method( *_ITERATOR ) template inline VOID Foreach_Default( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcNodeProcess ) { __TOUCHED(_ds); //intercepted debugging factility while( _it != _itend ) _funcNodeProcess(*_it++); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_AnyConditionTrue // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ Çϳª¶óµµ TRUEÀÏ °æ¿ì TRUE ¹ÝȯÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) template inline BOOL Foreach_AnyConditionTrue( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcCheckCondition ) { BOOL bRET = FALSE; while( _it != _itend ) { if( _funcCheckCondition(*_it) ) bRET = TRUE; ++_it; } return bRET; } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_AllConditionTrue // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ¸ðµÎ TRUEÀÏ °æ¿ì TRUE ¹ÝȯÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) template inline BOOL Foreach_AllConditionTrue( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcCheckCondition ) { BOOL bRET = TRUE; while( _it != _itend ) { if( !_funcCheckCondition(*_it) ) bRET = FALSE; ++_it; } return bRET; } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenFuncCall // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì Ãß°¡ ¸Þ¼Òµå¸¦ ½ÇÇàÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : Ãß°¡ µî·ÏµÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù // È£ÃâÇü½Ä : anytype _OBJ::Method( *_ITERATOR ) // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. template inline VOID Foreach_IfTrueThenFuncCall( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcCheckTrue, _OBJFUNC _funcIfTrueCase ) { while( _it != _itend ) { if( _funcCheckTrue(*_it) ) _funcIfTrueCase(*_it); ++_it; } } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenContinue // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì °è¼Ó ·çÇÁ¸¦ ½ÇÇàÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ·çÇÁ¸¦ Á¾·áÇÑ´Ù. template inline VOID Foreach_IfTrueThenContinue( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsContinue ) { while( _it != _itend ) { if( !_funcIsContinue(*_it) ) break; ++_it; } } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenBreak // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ·çÇÁ¸¦ Á¾·áÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ·çÇÁ¸¦ Á¾·áÇÑ´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. template inline VOID Foreach_IfTrueThenBreak( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsBreak ) { while( _it != _itend ) { if( _funcIsBreak(*_it) ) break; ++_it; } } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenDeleteNode // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenDeleteNode( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete ) { while( _it != _itend ) (!_funcIsDelete(*_it)) ? ++_it : _it = _ds.erase( _it ); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenReleaseAndDeleteNode // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenReleaseAndDeleteNode( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete, _OBJFUNC _funcRelease ) { while( _it != _itend ) { if(!_funcIsDelete(*_it)) ++_it; else { _funcRelease( *_it ); _it = _ds.erase( _it ); } } } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenDeleteNode_Sequential_DS // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenDeleteNode_SequentialDS( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete ) { Foreach_IfTrueThenDeleteNode( _ds, _it, _itend, _funcIsDelete ); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenReleaseAndDeleteNode_Sequential_DS // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenReleaseAndDeleteNode_SequentialDS( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete, _OBJFUNC _funcRelease ) { Foreach_IfTrueThenReleaseAndDeleteNode( _ds, _it, _itend, _funcIsDelete, _funcRelease ); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenDeleteNode_TreeDS // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenDeleteNode_TreeDS( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete ) { Foreach_IfTrueThenDeleteNode( _ds, _it, _itend, _funcIsDelete ); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // Foreach_IfTrueThenReleaseAndDeleteNode_TreeDS // (WAVERIX)(NOTE) // ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç, Á¶°ÇÀÌ ÂüÀÏ °æ¿ì ÇØ´ç ³ëµå¸¦ Á¦°ÅÇÑ´Ù. // 1) ÁöÁ¤ ¹üÀ§ÀÇ ·çÇÁ¸¦ ¼öÇàÇϸç ÁöÁ¤µÈ ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. // È£ÃâÇü½Ä : BOOL _OBJ::Method( *_ITERATOR ) // 2) È£ÃâµÈ ÇÔ¼ö °á°ú¿¡ µû¶ó ºÐ±âÇÑ´Ù. // TRUE : ÇØ´ç ³ëµå¸¦ »èÁ¦ ÈÄ ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // FALSE : ´ÙÀ½ ³ëµå·Î ³Ñ¾î°£´Ù. // (WAVERIX)(WARNING) // ÀÌ ·ÎÁ÷Àº ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ º°µµ·Î delete, insertµîÀ» ¼öÇàÇÏ´Â °æ¿ì¿¡ Á¤»óÀûÀÎ µ¿ÀÛÀ» 100%º¸ÀåÇÏÁö ¸øÇÑ´Ù. // ÀÏ´Ü ÀÚ±â ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â °æ¿ì´Â Àý´ë·Î ÇÇÇØ¾ß ÇÑ´Ù. template inline VOID Foreach_IfTrueThenReleaseAndDeleteNode_TreeDS( _STLDS& _ds, _ITERATOR _it, _ITERATOR _itend, _OBJFUNC _funcIsDelete, _OBJFUNC _funcRelease ) { Foreach_IfTrueThenReleaseAndDeleteNode( _ds, _it, _itend, _funcIsDelete, _funcRelease ); } //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // Loop ±âÁØ, iteratorÀÇ ¹«°á¼ºÀ» º¸ÀåÇϱâ À§ÇÑ WrapperŬ·¡½º // (WAVERIX)(WARNING) // ÀÌ°É ¾²±â Àü¿¡ ±¸Á¶ÀûÀ¸·Î °³¼±ÇÒ ¼ö ÀÖÀ»ÁöÀÇ ¿©ºÎ¸¦ ŸÀüÇ϶ó. // À̰ÍÀº ¹®Á¦°¡ ÀÖ´Â ±¸Á¶¿¡¼­ ¹®Á¦Á¡À» ¾ß±âÇÏÁö ¾Êµµ·Ï º¸¿ÏÇϱâ À§Çؼ­ °í¾ÈµÈ °ÍÀÏ »ÓÀÌ´Ù. // // ´ÙÀ½°ú °°Àº »óȲÀÌ ¹ß»ýÇÒ ¶§ »ç¿ëÇØµµ ¾ÈÀüÇϵµ·Ï ±¸¼ºÇß´Ù. // - Loop¾È¿¡¼­ Insert/Delete°¡ ºó¹øÈ÷ ÀϾ´Ù. (ÀÚ±â ÀÚ½ÅÀ» »èÁ¦ÇÒ ¼ö ÀÖÀ» Áö ¸ð¸¥´Ù.) // - Loop¾È¿¡¼­ µ¿ÀÏÇÑ ÀڷᱸÁ¶¿¡ ´ëÇØ loop°¡ ¶Ç ¹ß»ýÇÑ´Ù. (ÀÌ µÑ ¸ðµÎ°¡ Insert/Delete°¡ ¹ß»ýÇÒ °æ¿ì) // - Insert/Delete°¡ ¹ß»ýÇÏ´Â loop¿¡¼­ subloop¹ß»ý½Ã, ÇØ´ç loop°¡ Insert/Delete¹ß»ýÇÏÁö ¾ÊÀ¸¸é ÀÏ¹Ý ·çÇÁ·Îµµ °¡´É // // typedef SyncIterator SyncStatusIterator; // typedef SyncStatusIterator::Transaction SyncTransaction; // // // loop¸¦ µµ´Â ½ÃÁ¡ // SyncTransaction trans( m_SyncIterator ); // loop¸¦ µ¹±âÀü ¹Ýµå½Ã transactionÀ» °É¾î¶ó. // SyncStatusIterator::Iterator it = m_SyncIterator.SetIterator( m_StatusTable.begin() ); // create wrap_iterator // STATUS_TABLE_IT itend = m_StatusTable.end(); // for( ; it!=itend ; ++it ) // { // BaseStatus* pStatus = it->second; // ... // // // ·çÇÁ ¾È remove (¾Æ·¡ sampleÀº key·Î Æò°¡ÇÒ ¶§) // if( m_SyncIterator.IsTransaction() && (m_SyncIterator.CurrentIterator()->first == eStateID) ) // m_SyncIterator.EraseCurrentIterator( m_StatusTable ); // else // m_StatusTable.erase( eStateID ); // // // iterator·Î Á¦°ÅÇÒ ¼ö ÀÖ´Ù¸é (m_SyncIterator.CurrentIterator() == deliterator)·Î Æò°¡Ç϶ó // if( m_SyncIterator.IsTransaction() && (m_SyncIterator.CurrentIterator() == deliterator) ) // m_SyncIterator.EraseCurrentIterator( m_StatusTable ); // else // m_StatusTable.erase( deliterator ); // template class SyncIterator { typedef _ITERATOR iterator_type; static const DWORD TRANSACTION_DEPTH = _TRANSACTION_DEPTH; public: SyncIterator() : m_Depth(0) { ZeroMemory(m_bTransaction, sizeof(m_bTransaction)); //fill_n( &m_bTransaction[0], (INT)(sizeof(m_bTransaction)/sizeof(m_bTransaction[0])), false ); } ////////////////////////////////////////////////////////////////////////// // public: ////////////////////////////////////////////////////////////////////////// // class Transaction { public: Transaction( SyncIterator& r ) : m_rSync(r) { m_rSync._EnterTransaction(); } ~Transaction() { m_rSync._LeaveTransaction(); } private: SyncIterator& m_rSync; }; friend class Transaction; ////////////////////////////////////////////////////////////////////////// // class Iterator { public: typedef _ITERATOR iterator_type; typedef Iterator this_type; typedef typename iterator_type::pointer pointer; typedef typename iterator_type::reference reference; private: friend class SyncIterator; Iterator( const iterator_type& r ) : m_rCurIterator(const_cast(r)) {} public: operator const iterator_type&() { return m_rCurIterator; } reference operator*() { return *m_rCurIterator; } pointer operator->() const { return m_rCurIterator.operator->(); } this_type& operator++() { ++m_rCurIterator; return (*this); } this_type operator++(int) { return m_rCurIterator++; } this_type& operator--() { --m_rCurIterator; return (*this); } this_type operator--(int) { return m_rCurIterator--; } BOOL operator == ( const iterator_type& _Right ) const { return (m_rCurIterator == _Right); } BOOL operator != ( const iterator_type& _Right ) const { return (!(m_rCurIterator == _Right)); } iterator_type& m_rCurIterator; }; public: __forceinline bool IsTransaction() { return !m_Depth ? false : m_bTransaction[m_Depth-1]; } __forceinline Iterator SetIterator( iterator_type _it ) { return m_CurIterators[m_Depth-1] = _it; } //const Iterator CurrentIterator() { return m_CurIterators[m_Depth-1]; } template VOID EraseIterator( _TABLE& table, const iterator_type& itr ) { if( 0 == m_Depth ) table.erase(itr); else { iterator_type tmp = itr; iterator_type next = table.erase(itr); --next; replace( &m_CurIterators[0], &m_CurIterators[m_Depth], tmp, next ); } } private: __forceinline VOID _LeaveTransaction() { m_bTransaction[--m_Depth] = false; } __forceinline bool _EnterTransaction() { if(m_Depth < TRANSACTION_DEPTH) return m_bTransaction[m_Depth++] = true; else { __debugbreak(); return false; } } private: WORD m_Depth; bool m_bTransaction[TRANSACTION_DEPTH]; // loop transaction ¿©ºÎ ÆÇº°¿ë iterator_type m_CurIterators[TRANSACTION_DEPTH]; // loop transaction½Ã »ç¿ëµÇ´Â iterator }; //¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬ // // #include "SunSTL.UtiltiyTMP.h" // // #endif //__SUN_STL_UTILITY__