windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/inc/d3dtempl.hpp
2020-09-26 16:20:57 +08:00

116 lines
2.8 KiB
C++

/*==========================================================================;
*
* Copyright (C) 1995-2000 Microsoft Corporation. All Rights Reserved.
*
* File: d3dtempl.hpp
* Content: Direct3D templates include file
*
*
***************************************************************************/
#ifndef __D3DTEMPL_HPP
#define __D3DTEMPL_HPP
#include <d3dutil.h>
#include "d3dmem.h"
//--------------------------------------------------------------------------
//
// Template for growable arrays
//
//--------------------------------------------------------------------------
template <class ARRAY_ELEMENT>
class GArrayT
{
public:
GArrayT()
{
m_pArray = NULL;
m_dwArraySize = 0;
m_dwGrowSize = 8;
}
~GArrayT()
{
if( m_pArray )
{
DDASSERT( (m_dwArraySize != 0) && (m_pArray != NULL) );
delete[] m_pArray;
}
else
{
DDASSERT( (m_dwArraySize == 0) && (m_pArray == NULL) );
}
}
LPVOID GetArrayPointer() const {return m_pArray;}
virtual void SetGrowSize( DWORD dwGrowSize)
{
m_dwGrowSize = dwGrowSize;
}
#if 0
virtual HRESULT Init( DWORD dwInitialSize, DWORD dwGrowSize)
{
m_pArray = AllocArray( dwInitialSize );
if( m_pArray == NULL ) return E_OUTOFMEMORY;
m_dwArraySize = dwInitialSize;
m_dwGrowSize = dwGrowSize;
return S_OK;
}
#endif
virtual HRESULT Grow( DWORD dwIndex )
{
if( dwIndex < m_dwArraySize ) return S_OK;
DWORD dwNewArraySize = m_dwArraySize;
while( dwNewArraySize <= dwIndex ) dwNewArraySize += m_dwGrowSize;
ARRAY_ELEMENT *pNewArray = AllocArray( dwNewArraySize );
if( pNewArray == NULL ) return E_OUTOFMEMORY;
for( DWORD i = 0; i<m_dwArraySize; i++ )
{
pNewArray[i] = m_pArray[i];
m_pArray[i].m_pObj = NULL; // To prevent deleting the object
}
delete[] m_pArray;
m_pArray = pNewArray;
m_dwArraySize = dwNewArraySize;
return S_OK;
}
virtual ARRAY_ELEMENT *AllocArray( DWORD dwSize ) const
{
return new ARRAY_ELEMENT[dwSize];
}
virtual ARRAY_ELEMENT& operator []( DWORD dwIndex ) const
{
DDASSERT(dwIndex < m_dwArraySize);
return m_pArray[dwIndex];
}
virtual BOOL Check( DWORD dwIndex ) const
{
return (dwIndex < m_dwArraySize);
}
virtual DWORD GetSize() const
{
return m_dwArraySize;
}
virtual DWORD GetGrowSize() const
{
return m_dwGrowSize;
}
protected:
ARRAY_ELEMENT *m_pArray;
DWORD m_dwArraySize;
DWORD m_dwGrowSize;
};
#endif //__D3DTEMPL_HPP