반응형
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

+ Recent posts