www.pudn.com > ImageVidwer.rar > ByteArray.h


#ifndef __BYTE_ARRAY__H__ 
#define __BYTE_ARRAY__H__ 
 
#define OUT_OF_MEMORY_QUITING _T("Fatal Error: Out of memory. Quiting.") 
 
class ByteArray { 
 
public: 
	BYTE* m_pBuffer; 
 
	ByteArray(const int nGrowBy = 50) : 
		m_nGrowBy(nGrowBy), m_nBufferSize(0), m_nSize(0) 
	{ 
		//m_pBuffer = new BYTE[m_nSize];	 
		m_pBuffer = (BYTE*)::malloc(m_nSize); 
		//if (! m_pBuffer) { 
		//	::AfxMessageBox(OUT_OF_MEMORY_QUITING); 
		//	::PostQuitMessage(1); 
		//} 
	} 
 
	inline int GetSize() const { 
		return m_nSize;	 
	} 
 
	inline bool Add(const BYTE b) { 
		if (m_nSize >= m_nBufferSize) { 
			if (! GrowBuffer()) { 
				return false;			 
			} 
		}	 
		m_pBuffer[m_nSize++] = b; 
		return true; 
	} 
 
	inline bool Append(const BYTE* pArray, const int nSize) { 
		while ((m_nSize + nSize) > m_nBufferSize) { 
			if (! GrowBuffer()) { 
				return false;			 
			} 
		} 
		::memcpy((m_pBuffer + m_nSize), pArray, sizeof(BYTE) * nSize); 
		m_nSize += nSize; 
		return true; 
	} 
 
	BYTE* GetData() const { 
		return m_pBuffer;	 
	} 
 
	~ByteArray() { 
		//delete m_pBuffer;	 
		::free(m_pBuffer); 
	} 
 
 
private: 
	int m_nBufferSize; 
	int m_nGrowBy; 
	int m_nSize; 
 
	bool GrowBuffer()  
	{ 
		ASSERT(m_pBuffer); 
 
		int nNewBufferSize = m_nBufferSize + m_nGrowBy; 
		//BYTE* pNewBuffer = new BYTE[nNewBufferSize]; 
		BYTE* pNewBuffer = (BYTE*)::malloc(sizeof(BYTE)*nNewBufferSize); 
		if (! pNewBuffer) { 
			return false;		 
		} 
		memcpy(pNewBuffer, m_pBuffer, sizeof(BYTE) * m_nSize); 
		//delete m_pBuffer; 
		::free(m_pBuffer); 
		m_pBuffer = pNewBuffer; 
		m_nBufferSize = nNewBufferSize; 
		return true; 
	} 
 
}; 
 
#endif