⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stash.h

📁 面向软件工程的Visual C++网络程序开发
💻 H
字号:
// Stash.h
#ifndef STASH_H
#define STASH_H

#include "afxtempl.h"
template <class T>
class AFX_EXT_CLASS CStash {
	int m_nNum;
	int m_nSize;
	int m_nAccSize;
	T*  m_p;
public:
	CStash() : m_nNum(0), m_nAccSize(100), m_nSize(0), m_p(NULL){
	}
	~CStash(){
		FreeStash();
	}
/////////////////////////////////
	T*  GetPtr() {
		return m_p;
	}

/////////////////////////////////
	int GetNum() {
		return m_nNum;
	}
/////////////////////////////////
	int GetSize() {
		return m_nSize;
	}
/////////////////////////////////
	int GetAccSize() {
		return m_nAccSize;
	}
/////////////////////////////////
	void SetAccSize(int nSize) {
		m_nAccSize = nSize;
	}
/////////////////////////////////
	T	 operator[](int n) {
		return *(m_p + n);
	}
/////////////////////////////////
	T*  PointAt(int n) {
		return (T*)(m_p + n);
	}
/////////////////////////////////
	BOOL SetAt(int n, T& t) {
		if(n > m_nSize) return FALSE;
		memcpy(m_p+n, &t, sizeof(T));
		return TRUE;
	}
/////////////////////////////////
	BOOL Add(T& t);
/////////////////////////////////
	BOOL Add(T* pt, int nSize);
/////////////////////////////////
	BOOL Delete(int nIndex, int nDelNum);

/////////////////////////////////
	void FreeStash(){
		if(m_p != NULL) {
			free(m_p);
			m_p = NULL;
		}
		m_nNum = m_nSize = 0;
	}

	void ClearStash(){
		m_nNum = 0;
	}
};

/////////////////////////////////
template <class T> 
BOOL CStash<T>::Add(T& t)
{
	if(m_nNum >= m_nSize) {
		int nSize = m_nSize + m_nAccSize;
		ASSERT((m_p = (T*)realloc(m_p, nSize * sizeof(T))) != NULL);
		m_nSize = nSize;
	}
	SetAt(m_nNum, t);
	m_nNum++;
	return TRUE;
}

/////////////////////////////////
template <class T> 
BOOL CStash<T>::Add(T* pt, int nSize)
{
	int n = m_nNum + nSize;
	if(n > m_nSize) {
		int nAdd = ((n - m_nSize) / m_nAccSize + 1) * m_nAccSize;
		ASSERT((m_p = (T*)realloc(m_p, (m_nSize + nAdd) * sizeof(T))) != NULL);
		m_nSize += nAdd;
	}
	memcpy(m_p+m_nNum, pt, sizeof(T) * nSize);
	m_nNum = n;
	return TRUE;
}

/////////////////////////////////
template <class T>
BOOL CStash<T>::Delete(int nIndex, int nDelNum)
{
	int nleft = m_nNum - nIndex;
	if(nleft <= nDelNum) {m_nNum = nIndex; return TRUE;}
	int nIndex1 = nIndex + nDelNum;
	nleft = m_nNum - nIndex;
	if(memmove(m_p+nIndex, m_p+nIndex1, nleft*sizeof(T)) == NULL)
		return FALSE;
	m_nNum -= nDelNum;
	return TRUE;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -