/* ==================================================================== * ÆÄ ÀÏ : IndexGenerator.h * ¸ñ Àû : ¼­·Î °ãÄ¡Áö ¾Ê´Â À妽º¸¦ Á¦°ø * ÀÛ ¼º ÀÚ : À̹ý¼® * ÀÛ ¼º ÀÏ : 2006.01 * ÁÖÀÇ»çÇ× : ¾²·¹µå¿¡¼­ÀÇ »ç¿ëÀº ÀÏ´Ü °í·Á ¾ÈÇÑ´Ù. * ¸¸¾à, ¾²·¹µå »ç¿ëÀ» Æ÷ÇÔÇÑ´Ù¸é µ¿±âÈ­¸¦ À§ÇÑ Å©¸®Æ¼Äà ¼½¼ÇÀ» ³Ö¾î¶ó * =================================================================== */ #pragma once template class cIndexGenerator { public: cIndexGenerator( T initilize = 100 ); ~cIndexGenerator(); /// À妽º¸¦ Á¦°ø T GenerateIndex(); /// À妽º¸¦ ¹Ýȯ void RestoreIndex( T idx ); void RestoreAll(); private: /// ¹ÝȯµÈ À妽º¸¦ º¸°üÇÑ´Ù. NiTPrimitiveQueue* mpKeeper; /// Áö±Ý±îÁö Á¦°øÇÑ À妽ºÀÇ ÃÖÁ¾°ª T mLastIndexValue; T mInitValue; }; template inline cIndexGenerator::cIndexGenerator( T initilize ) { /// ¸Þ¸ð¸®¸¦ Àâ´Â´Ù. mpKeeper = NiNew NiTPrimitiveQueue( initilize ); mInitValue = initilize; mLastIndexValue = 0; } template inline cIndexGenerator::~cIndexGenerator() { SAFE_DELETE(mpKeeper); } template inline void cIndexGenerator::RestoreAll() { mLastIndexValue = 0; while( mpKeeper->IsEmpty() == false ) mpKeeper->Remove(); } /* ------------------------------------------------------------------ * ÇÔ¼öÀ̸§ : GenerateIndex() * ¸ñ Àû : À妽º Á¦°ø * ÁÖÀÇ»çÇ× : * ------------------------------------------------------------------ */ template inline T cIndexGenerator::GenerateIndex() { // if( mpKeeper->GetSize() < 10000 ) // { if( mLastIndexValue < mLastIndexValue+1 ) { mLastIndexValue += 1; return mLastIndexValue; } // if( mpKeeper->IsEmpty() ) // assert(0); // } return mpKeeper->Remove(); } /* ------------------------------------------------------------------ * ÇÔ¼öÀ̸§ : RestoreIndex( unsigned int idx ) * ¸ñ Àû : »ç¿ëµÈ À妽ºÀÇ ¹Ýȯ * ÁÖÀÇ»çÇ× : * ------------------------------------------------------------------ */ template inline void cIndexGenerator::RestoreIndex( T idx ) { /// ÀÌ ÇÔ¼ö´Â ¹Ýȯ À妽º°¡ ¸¹À»¼ö·Ï ´À¸®´Ù. // mpKeeper->AddUnique( idx ); /// ¸¸¾à, À妽º°¡ °ãÃļ­ Á¦°øµÈ´Ù°í »ý°¢ÇÑ´Ù¸é, °Ë»çÇØºÁ¶ó!! mpKeeper->Add( idx ); }