_Use_decl_annotations_ void* CDataBlock::Allocate(uint32_t bufferSize, CDataBlock **ppBlock) { void *pRetValue; uint32_t temp = m_size + bufferSize; if (temp < m_size) return nullptr; *ppBlock = this; if (m_maxSize == 0) { // This is a brand new DataBlock, fill it up m_maxSize = std::max<uint32_t>(8192, bufferSize); m_pData = new uint8_t[m_maxSize]; if (!m_pData) return nullptr; memset(m_pData, 0xDD, m_maxSize); } else if (temp > m_maxSize) { assert(nullptr == m_pNext); // make sure we're not overwriting anything // Couldn't fit data into this block, spill over into next m_pNext = new CDataBlock(); if (!m_pNext) return nullptr; if (m_IsAligned) { m_pNext->EnableAlignment(); } return m_pNext->Allocate(bufferSize, ppBlock); } assert(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); pRetValue = m_pData + m_size; if (m_IsAligned) { assert(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); m_size = AlignToPowerOf2(temp, c_DataAlignment); } else { m_size = temp; } return pRetValue; }
void* CDataBlock::Allocate(UINT bufferSize, CDataBlock **ppBlock) { void *pRetValue; UINT temp = m_size + bufferSize; if (temp < m_size) return NULL; *ppBlock = this; if (m_maxSize == 0) { // This is a brand new DataBlock, fill it up m_maxSize = max(8192, bufferSize); m_pData = NEW BYTE[m_maxSize]; if (!m_pData) return NULL; memset(m_pData, 0xDD, m_maxSize); } else if (temp > m_maxSize) { D3DXASSERT(NULL == m_pNext); // make sure we're not overwriting anything // Couldn't fit data into this block, spill over into next m_pNext = NEW CDataBlock(); if (!m_pNext) return NULL; if (m_IsAligned) { m_pNext->EnableAlignment(); } return m_pNext->Allocate(bufferSize, ppBlock); } D3DXASSERT(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); pRetValue = m_pData + m_size; if (m_IsAligned) { D3DXASSERT(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); m_size = AlignToPowerOf2(temp, c_DataAlignment); } else { m_size = temp; } return pRetValue; }
_Use_decl_annotations_ HRESULT CDataBlock::AddData(const void *pvNewData, uint32_t bufferSize, CDataBlock **ppBlock) { HRESULT hr = S_OK; uint32_t bytesToCopy; const uint8_t *pNewData = (const uint8_t*) pvNewData; if (m_maxSize == 0) { // This is a brand new DataBlock, fill it up m_maxSize = std::max<uint32_t>(8192, bufferSize); VN( m_pData = new uint8_t[m_maxSize] ); } assert(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); bytesToCopy = std::min(m_maxSize - m_size, bufferSize); memcpy(m_pData + m_size, pNewData, bytesToCopy); pNewData += bytesToCopy; if (m_IsAligned) { assert(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); m_size += AlignToPowerOf2(bytesToCopy, c_DataAlignment); } else { m_size += bytesToCopy; } bufferSize -= bytesToCopy; *ppBlock = this; if (bufferSize != 0) { assert(nullptr == m_pNext); // make sure we're not overwriting anything // Couldn't fit all data into this block, spill over into next VN( m_pNext = new CDataBlock() ); if (m_IsAligned) { m_pNext->EnableAlignment(); } VH( m_pNext->AddData(pNewData, bufferSize, ppBlock) ); } lExit: return hr; }
HRESULT CDataBlock::AddData(const void *pvNewData, UINT bufferSize, CDataBlock **ppBlock) { HRESULT hr = S_OK; UINT bytesToCopy; const BYTE *pNewData = (const BYTE*) pvNewData; if (m_maxSize == 0) { // This is a brand new DataBlock, fill it up m_maxSize = max(8192, bufferSize); VN( m_pData = NEW BYTE[m_maxSize] ); } D3DXASSERT(m_pData == AlignToPowerOf2(m_pData, c_DataAlignment)); bytesToCopy = min(m_maxSize - m_size, bufferSize); memcpy(m_pData + m_size, pNewData, bytesToCopy); pNewData += bytesToCopy; if (m_IsAligned) { D3DXASSERT(m_size == AlignToPowerOf2(m_size, c_DataAlignment)); m_size += AlignToPowerOf2(bytesToCopy, c_DataAlignment); } else { m_size += bytesToCopy; } bufferSize -= bytesToCopy; *ppBlock = this; if (bufferSize != 0) { D3DXASSERT(NULL == m_pNext); // make sure we're not overwriting anything // Couldn't fit all data into this block, spill over into next VN( m_pNext = NEW CDataBlock() ); if (m_IsAligned) { m_pNext->EnableAlignment(); } VH( m_pNext->AddData(pNewData, bufferSize, ppBlock) ); } lExit: return hr; }