/* Template TList ÇüÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Â À¯»ç TList. Áï 4¹ÙÀÌÆ®ÀÇ Æ÷ÀÎÆ®³ª °ª¸¸À» ÀúÀåÇÏ´Â TList °¡ ¾Æ´Ï¶ó, TList ¿Í »ç¿ë¹ýÀº ºñ½ÁÇϸ鼭 ¾Æ¹«ÇüÀ̳ª ±× ÇüÀÚü¸¦ ÀúÀåÇÒ¼ö ÀÖ´Â °ÍÀÌ Æ²¸®´Ù. WTL 7.5ÀÇ CSimpleArray¸¦ ±â¹ÝÀ¸·Î TList ½ºÅ¸ÀÏ·Î ¼öÁ¤Çؼ­ ¸¸µê. Ư¡ ÅÛÇø´À¸·Î ±¸ÇöµÇ¾úÀ¸¹Ç·Î Çü ÀÚü¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. VCL ½ºÅ¸ÀÏ Å¬·¡½º°¡ ¾Æ´Ï¹Ç·Î ½ºÅÿ¡ »ý¼ºÇÒ¼ö ÀÖ´Ù. ¾ÆÀÌÅÛ »èÁ¦³ª °´Ã¼¼Ò¸ê½Ã °¢ °³º° °´Ã¼¿¡ ´ëÇØ ÀÚµ¿À¸·Î ¼Ò¸êÀÚ¸¦ È£Ãâ ÇÑ´Ù. À̾îÁø ¸Þ¸ð¸®°æ°è¸¦ °¡Áø µ¿Àû ¹è¿­ÀÌ´Ù. µ¿Àû ¹è¿­À̹ǷΠSTL·Î º¯È¯ÇØ ´Ù·ç±â ½±´Ù. ver1.1 Written by ±èżº jsdkts@korea.com */ #ifndef TTListH #define TTListH //--------------------------------------------------------------------------- template class TTList { public: // C++Builder Only. __property int Count = { read=m_nSize }; public: TTList() : m_aT(NULL), m_nSize(0), m_nAllocSize(0) { } virtual ~TTList() { Clear(); } TTList(const TTList& src) : m_aT(NULL), m_nSize(0), m_nAllocSize(0) { m_aT = (T*)malloc(src.GetSize() * sizeof(T)); if (m_aT != NULL) { m_nAllocSize = src.GetSize(); for(int i=0; i < src.GetSize(); i++) Add(src[i]); } } TTList& operator=(const TTList& src) { if (GetSize() != src.GetSize()) { Clear(); m_aT = (T*)malloc(src.GetSize() * sizeof(T)); if (m_aT != NULL) m_nAllocSize = src.GetSize(); } else { for(int i = GetSize(); i > 0; i--) Delete(i - 1); } for (int i=0; i < src.GetSize(); i++) Add(src[i]); return *this; } int Add(const T& t) { if (m_nSize == m_nAllocSize) { T* aT; int nNewAllocSize = (m_nAllocSize == 0) ? 1 : (m_nSize * 2); aT = (T*)realloc(m_aT, nNewAllocSize * sizeof(T)); if(aT == NULL) return -1; m_nAllocSize = nNewAllocSize; m_aT = aT; } InternalSetAtIndex(m_nSize, t); return m_nSize++; } bool Delete(int nIndex) { if (nIndex < 0 || nIndex >= m_nSize) return false; m_aT[nIndex].~T(); if (nIndex != (m_nSize - 1)) memmove((void*)(m_aT + nIndex), (void*)(m_aT + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(T)); m_nSize--; return true; } // ÀÏÄ¡ÇÏ´Â °ªÀ» °¡Áø ù¹ø° Ç׸ñÀ» Áö¿î´Ù. bool DeleteValue(const T& t) { int nIndex = IndexOf(t); if (nIndex == -1) return false; return Delete(nIndex); } // ÁÖ¾îÁø À妽º ¹øÈ£¿¡ Ç׸ñÀ» ³¢¿ö ³Ö´Â´Ù. bool Insert(int nIndex, const T& t) { if (nIndex < 0 || nIndex >= m_nSize) return false; if (Add(t) == -1) // °ø°£È®º¸¿ë. return false; System::Move(m_aT + nIndex, m_aT + nIndex + 1, (m_nSize - nIndex - 1) * sizeof(T)); InternalSetAtIndex(nIndex, t); return true; } // µÎÇ׸ñÀÇ ÀúÀåÀ§Ä¡¸¦ ¹Ù²Û´Ù. void Exchange(int index1, int index2) { if (index1 < 0 || index1 >= m_nSize) return; if (index2 < 0 || index2 >= m_nSize) return; byte *p = new byte[sizeof(T)]; // »ý¼ºÀÚ¸¦ °¡Á¤ÇÒ¼ö ¾øÀ¸¹Ç·Î °ø°£¸¸ È®º¸ÇÑ´Ù. // ¸¸ÀÏ StringÀ̶ó¸é String³¢¸®´Â = ¿¬»êÀÚ¿¡ ÀÇÇØ ¹®ÀÚ¿­ ġȯÀÌ ÀϾ¹Ç·Î. // ´Ü¼øÈ÷ ¸Þ¸ð¸® À§Ä¡¸¦ ¹Ù²Ù´Â ³õ´Â Äڵ尡 ÇÊ¿äÇÏ´Ù. memmove((void*)p, (void*)(m_aT + index1), sizeof(T)); memmove((void*)(m_aT + index1), (void*)(m_aT + index2), sizeof(T)); memmove((void*)(m_aT + index2), (void*)p, sizeof(T)); delete[] p; } void Clear() { if(m_aT != NULL) { for(int i = 0; i < m_nSize; i++) m_aT[i].~T(); free(m_aT); m_aT = NULL; } m_nSize = 0; m_nAllocSize = 0; } // TListÀÇ Get, PutÀº C++¿¡¼­´Â ¾Æ·¡ []·Î ´õ Æí¸®ÇÏ°Ô »ç¿ë°¡´ÉÇÔ. const T& operator[] (int nIndex) const { if(nIndex < 0 || nIndex >= m_nSize) { _RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED); } return m_aT[nIndex]; } T& operator[] (int nIndex) { if(nIndex < 0 || nIndex >= m_nSize) { _RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED); } return m_aT[nIndex]; } T* begin() const // like STL { return m_aT; } T* end() const // like STL { return m_aT + m_nSize; } int IndexOf(const T& t) const { for(int i = 0; i < m_nSize; i++) { if (TEqual::IsEqual(m_aT[i], t)) return i; } return -1; // not found } bool SetAtIndex(int nIndex, const T& t) { if (nIndex < 0 || nIndex >= m_nSize) return false; InternalSetAtIndex(nIndex, t); return true; } private: // = ¿¬»êÀÚ¸¦ ¾µ°æ¿ì ¿¬»êÀÚ¿À¹ö·ÎµùÀÌ µÇ¾î ÀÖÀ¸¸é ¶æÇÏÁö ¾Ê´Â ÇàÀ§¸¦ ÇϹǷΠÀÌ·± new¿¬»êÀÚ ·¡ÇÎŬ·¡½º¸¦ ¾´´Ù. class Wrapper { public: Wrapper(const T& _t) : t(_t) { } template void * __cdecl operator new(size_t, _Ty* p) { return p; } T t; }; void InternalSetAtIndex(int nIndex, const T& t) { new(m_aT + nIndex) Wrapper(t); } private: int m_nSize; int m_nAllocSize; // Operations, VC++°úÀÇ È£È¯¼ºÀ» À§ÇØ ±×´ë·Î µÐ´Ù. int GetSize() const { return m_nSize; } public: T* m_aT; inline void __declspec(noreturn) _RaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE ) { RaiseException( dwExceptionCode, dwExceptionFlags, 0, NULL ); } }; //--------------------------------------------------------------------------- #endif