반응형
template<class T> class TPtrList
{
protected:
// 포인터를 저장할 Linked List
CPtrList PtrList;
public:
// 아이템 개수 알아내기
int GetCount() { return PtrList.GetCount(); }
// 포인터 추가하기
int Add(T* pPtr)
{
ASSERT(pPtr != NULL);
if (pPtr) PtrList.AddTail(pPtr);
return GetCount();
}
// 특정 아이템 앞에 삽입하기
int InsertBefore(int nIndex, T* pPtr)
{
if (GetCount() == 0) return Add(pPtr);
ASSERT(pPtr != NULL);
POSITION pos = PtrList.FindIndex(nIndex);
if (pos) PtrList.InsertBefore(pos,pPtr);
return GetCount();
}
// 특정 아이템 뒤에 삽입하기
int InsertAfter(int nIndex, T* pPtr)
{
if (GetCount() == 0) return Add(pPtr);
ASSERT(pPtr != NULL);
POSITION pos = PtrList.FindIndex(nIndex);
if (pos) PtrList.InsertAfter(pos,pPtr);
return GetCount();
}
// 특정 인덱스번째 포인터 가져오기
T* GetItem(int nIndex)
{
ASSERT(nIndex < GetCount());
T* pPtr = NULL;
POSITION pos = PtrList.FindIndex(nIndex);
if (pos) pPtr = (T*)PtrList.GetAt(pos);
return pPtr;
}
// 특정 인덱스번째 포인터 가져오기
T* operator[](int nIndex)
{
return GetItem(nIndex);
}
// 특정 포인터가 몇번째 인덱스인지 알아내기
int FindIndex(T* pPtr)
{
ASSERT(pPtr != NULL);
int nResultIndex = -1;
T* pPtrTemp;
for (int nIndex = 0; nIndex < GetCount(); nIndex++)
{
pPtrTemp = GetItem(nIndex);
if (pPtr == pPtrTemp)
{
nResultIndex = nIndex;
break;
}
}
return nResultIndex;
}
// 특정 인덱스번째 포인터 재설정하기
void SetItem(int nIndex, T* pPtr)
{
ASSERT(nIndex < GetCount());
ASSERT(pPtr != NULL);
if (pPtr)
{
POSITION pos = PtrList.FindIndex(nIndex);
if (pos) PtrList.SetAt(pos, pPtr);
}
}
// 두 아이템을 서로 바꾸기
void SwapItem(int nIndex1, int nIndex2)
{
T* pPtr1 = GetItem(nIndex1);
T* pPtr2 = GetItem(nIndex2);
SetItem(nIndex2, pPtr1);
SetItem(nIndex1, pPtr2);
}
// 특정 포인터를 메모리 해제하고 아이템 삭제하기
void FreeAt(int nIndex)
{
ASSERT(nIndex < GetCount());
T* pPtr = NULL;
POSITION pos = PtrList.FindIndex(nIndex);
if (pos)
{
pPtr = (T*)PtrList.GetAt(pos);
if (pPtr)
{
delete pPtr;
pPtr = NULL;
}
PtrList.RemoveAt(pos);
}
}
// 포인터를 메모리 해제하고 모든 아이템 삭제하기
void FreePtr()
{
for (int nIndex = GetCount() - 1; nIndex >= 0; nIndex--) FreeAt(nIndex);
}
// 특정 위치의 아이템 삭제하기
void RemoveAt(int nIndex)
{
ASSERT(nIndex < GetCount());
POSITION pos = PtrList.FindIndex(nIndex);
if (pos) PtrList.RemoveAt(pos);
}
// 포인터 목록 초기화
void RemoveAll() { PtrList.RemoveAll(); }
// 기본 생성자
TPtrList() { }
// 소멸자
~TPtrList() { RemoveAll(); }
};
반응형
'[====== Development ======] > C++' 카테고리의 다른 글
[MFC] Resize에 따른 컨트롤 위치 이동 (0) | 2021.07.23 |
---|---|
GetVersionExA 에러 (0) | 2021.07.22 |
C++ MBCS 경고 무시 (0) | 2021.06.08 |
C++ Multibyte to Unicode (0) | 2021.06.04 |
C++ 관리자 권할 실행여부 확인 (0) | 2021.05.24 |