/* Template TList ÇüÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Â À¯»ç TList. Áï 4¹ÙÀÌÆ®ÀÇ Æ÷ÀÎÆ®³ª °ª¸¸À» ÀúÀåÇÏ´Â TList °¡ ¾Æ´Ï¶ó, TList ¿Í »ç¿ë¹ýÀº ºñ½ÁÇϸ鼭 ¾Æ¹«ÇüÀ̳ª ±× ÇüÀÚü¸¦ ÀúÀåÇÒ¼ö ÀÖ´Â °ÍÀÌ Æ²¸®´Ù. WTL 7.5ÀÇ CSimpleArray¸¦ ±â¹ÝÀ¸·Î TList ½ºÅ¸ÀÏ·Î ¼öÁ¤Çؼ­ ¸¸µê. Ư¡ ÅÛÇø´À¸·Î ±¸ÇöµÇ¾úÀ¸¹Ç·Î Çü ÀÚü¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. VCL ½ºÅ¸ÀÏ Å¬·¡½º°¡ ¾Æ´Ï¹Ç·Î ½ºÅÿ¡ »ý¼ºÇÒ¼ö ÀÖ´Ù. ¾ÆÀÌÅÛ »èÁ¦³ª °´Ã¼¼Ò¸ê½Ã °¢ °³º° °´Ã¼¿¡ ´ëÇØ ÀÚµ¿À¸·Î ¼Ò¸êÀÚ¸¦ È£Ãâ ÇÑ´Ù. À̾îÁø ¸Þ¸ð¸®°æ°è¸¦ °¡Áø µ¿Àû ¹è¿­ÀÌ´Ù. µ¿Àû ¹è¿­À̹ǷΠSTL·Î º¯È¯ÇØ ´Ù·ç±â ½±´Ù. ver1.2 ¸Þ¸ð¸® ´©¼ö¾øÀÌ µ¿ÀÛÇÔ. ¾Ë·ÁÁø ¹ö±×´Â ¸ðµÎ ¼öÁ¤ÇÔ. Written by ±èżº jsdkts@korea.com */ #ifndef TTListH #define TTListH //--------------------------------------------------------------------------- template class TTList { public: // C++Builder Only. __property int Count = { read=m_nSize }; //__property T& Items[int nIndex] = { read=Get, write=Put }; // NoComplie. 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)]; // »ý¼ºÀÚ¸¦ °¡Á¤ÇÒ¼ö ¾øÀ¸¹Ç·Î °ø°£¸¸ È®º¸ÇÑ´Ù. 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; // Âü°í : À§¿¡¼­ *((T *)p) = m_aT[index1]; °ú °°ÀÌ ÇÏ¸é ¸Þ¸ð¸® ´©¼ö°¡ ÀϾ´Ù. } 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& Get(int nIndex) { return m_aT[nIndex]; } void Put(int nIndex, T& t) { if(nIndex < 0 || nIndex >= m_nSize) { _RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED); } SetAtIndex(nIndex, t) } */ 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: // Implementation class Wrapper { public: Wrapper(const T& _t) : t(_t) { } template void * __cdecl operator new(size_t, _Ty* p) { return p; } T t; }; // Implementation 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 ); } }; //--------------------------------------------------------------------------- typedef TTList TSimpleStringList; //--------------------------------------------------------------------------- // TList¿Í TStringList Ŭ·¡½ºÀÇ ½ºÅûý¼º °¡´ÉÇÑ ¹öÀü class KTList { private: TList *p; public: KTList() { p = new TList; } ~KTList() { delete p; } // ¿¬»êÀÚ ¿À¹ö·Îµù. KTList & operator=(const KTList& src) { p->Assign(src.p); return *this; } TList * operator->() { return p; } TList & operator*() { return *p; } operator TList*() { return p; } }; class KTStringList { private: TStringList *p; public: KTStringList() { p = new TStringList; } ~KTStringList() { delete p; } // ¿¬»êÀÚ ¿À¹ö·Îµù. KTStringList & operator=(const KTStringList& src) { p->Assign(src.p); return *this; } TStringList * operator->() { return p; } TStringList & operator*() { return *p; } operator TStringList*() { return p; } }; //--------------------------------------------------------------------------- #endif