Index: xfa/src/fgas/src/crt/fx_utils.cpp |
diff --git a/xfa/src/fgas/src/crt/fx_utils.cpp b/xfa/src/fgas/src/crt/fx_utils.cpp |
index e8be0d8d5f14567c060d6463104fefc50e3ef84c..7f62eb09939b492b0a11e00b70fa7fca4e4ce42c 100644 |
--- a/xfa/src/fgas/src/crt/fx_utils.cpp |
+++ b/xfa/src/fgas/src/crt/fx_utils.cpp |
@@ -1,432 +1,432 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
- |
-#include <algorithm> |
- |
-#include "xfa/src/fgas/include/fx_utl.h" |
-#include "xfa/src/fgas/src/fgas_base.h" |
-#include "fx_utils.h" |
- |
-CFX_ThreadLock::CFX_ThreadLock() { |
-} |
-CFX_ThreadLock::~CFX_ThreadLock() {} |
-void CFX_ThreadLock::Lock() {} |
-void CFX_ThreadLock::Unlock() {} |
-class FX_BASEARRAYDATA : public CFX_Target { |
- public: |
- FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize) |
- : iGrowSize(growsize), |
- iBlockSize(blocksize), |
- iTotalCount(0), |
- iBlockCount(0), |
- pBuffer(nullptr) {} |
- |
- ~FX_BASEARRAYDATA() { FX_Free(pBuffer); } |
- |
- int32_t iGrowSize; |
- int32_t iBlockSize; |
- int32_t iTotalCount; |
- int32_t iBlockCount; |
- uint8_t* pBuffer; |
-}; |
-CFX_BaseArray::CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize) { |
- FXSYS_assert(iGrowSize > 0 && iBlockSize > 0); |
- m_pData = new FX_BASEARRAYDATA(iGrowSize, iBlockSize); |
-} |
-CFX_BaseArray::~CFX_BaseArray() { |
- RemoveAll(); |
- delete m_pData; |
-} |
-int32_t CFX_BaseArray::GetSize() const { |
- return m_pData->iBlockCount; |
-} |
-int32_t CFX_BaseArray::GetBlockSize() const { |
- return m_pData->iBlockSize; |
-} |
-uint8_t* CFX_BaseArray::AddSpaceTo(int32_t index) { |
- FXSYS_assert(index > -1); |
- uint8_t*& pBuffer = m_pData->pBuffer; |
- int32_t& iTotalCount = m_pData->iTotalCount; |
- int32_t iBlockSize = m_pData->iBlockSize; |
- if (index >= iTotalCount) { |
- int32_t iGrowSize = m_pData->iGrowSize; |
- iTotalCount = (index / iGrowSize + 1) * iGrowSize; |
- int32_t iNewSize = iTotalCount * iBlockSize; |
- if (!pBuffer) { |
- pBuffer = FX_Alloc(uint8_t, iNewSize); |
- } else { |
- pBuffer = FX_Realloc(uint8_t, pBuffer, iNewSize); |
- } |
- } |
- int32_t& iBlockCount = m_pData->iBlockCount; |
- if (index >= iBlockCount) { |
- iBlockCount = index + 1; |
- } |
- return pBuffer + index * iBlockSize; |
-} |
-uint8_t* CFX_BaseArray::GetAt(int32_t index) const { |
- FXSYS_assert(index > -1 && index < m_pData->iBlockCount); |
- return m_pData->pBuffer + index * m_pData->iBlockSize; |
-} |
-uint8_t* CFX_BaseArray::GetBuffer() const { |
- return m_pData->pBuffer; |
-} |
-int32_t CFX_BaseArray::Append(const CFX_BaseArray& src, |
- int32_t iStart, |
- int32_t iCount) { |
- int32_t iBlockSize = m_pData->iBlockSize; |
- FXSYS_assert(iBlockSize == src.m_pData->iBlockSize); |
- int32_t& iBlockCount = m_pData->iBlockCount; |
- int32_t iAdded = src.GetSize(); |
- FXSYS_assert(iStart > -1 && iStart < iAdded); |
- if (iCount < 0) { |
- iCount = iAdded; |
- } |
- if (iStart + iCount > iAdded) { |
- iCount = iAdded - iStart; |
- } |
- if (iCount < 1) { |
- return 0; |
- } |
- uint8_t* pDst = m_pData->pBuffer + iBlockCount * iBlockSize; |
- AddSpaceTo(iBlockCount + iCount - 1); |
- FX_memcpy(pDst, src.m_pData->pBuffer + iStart * iBlockSize, |
- iCount * iBlockSize); |
- return iCount; |
-} |
-int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src, |
- int32_t iStart, |
- int32_t iCount) { |
- int32_t iBlockSize = m_pData->iBlockSize; |
- FXSYS_assert(iBlockSize == src.m_pData->iBlockSize); |
- int32_t iCopied = src.GetSize(); |
- FXSYS_assert(iStart > -1 && iStart < iCopied); |
- if (iCount < 0) { |
- iCount = iCopied; |
- } |
- if (iStart + iCount > iCopied) { |
- iCount = iCopied - iStart; |
- } |
- if (iCount < 1) { |
- return 0; |
- } |
- RemoveAll(TRUE); |
- AddSpaceTo(iCount - 1); |
- FX_memcpy(m_pData->pBuffer, src.m_pData->pBuffer + iStart * iBlockSize, |
- iCount * iBlockSize); |
- return iCount; |
-} |
-int32_t CFX_BaseArray::RemoveLast(int32_t iCount) { |
- int32_t& iBlockCount = m_pData->iBlockCount; |
- if (iCount < 0 || iCount > iBlockCount) { |
- iCount = iBlockCount; |
- iBlockCount = 0; |
- } else { |
- iBlockCount -= iCount; |
- } |
- return iCount; |
-} |
-void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) { |
- if (!bLeaveMemory) { |
- uint8_t*& pBuffer = m_pData->pBuffer; |
- if (pBuffer != NULL) { |
- FX_Free(pBuffer); |
- pBuffer = NULL; |
- } |
- m_pData->iTotalCount = 0; |
- } |
- m_pData->iBlockCount = 0; |
-} |
-CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(int32_t iChunkSize, |
- int32_t iBlockSize) |
- : m_iChunkSize(iChunkSize), |
- m_iBlockSize(iBlockSize), |
- m_iChunkCount(0), |
- m_iBlockCount(0) { |
- FXSYS_assert(m_iChunkSize > 0 && m_iBlockSize > 0); |
- m_pData = new CFX_PtrArray; |
- m_pData->SetSize(16); |
-} |
-CFX_BaseMassArrayImp::~CFX_BaseMassArrayImp() { |
- RemoveAll(); |
- delete m_pData; |
-} |
-uint8_t* CFX_BaseMassArrayImp::AddSpaceTo(int32_t index) { |
- FXSYS_assert(index > -1); |
- uint8_t* pChunk; |
- if (index < m_iBlockCount) { |
- pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
- } else { |
- int32_t iMemSize = m_iChunkSize * m_iBlockSize; |
- while (TRUE) { |
- if (index < m_iChunkCount * m_iChunkSize) { |
- pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
- break; |
- } else { |
- pChunk = FX_Alloc(uint8_t, iMemSize); |
- if (m_iChunkCount < m_pData->GetSize()) { |
- m_pData->SetAt(m_iChunkCount, pChunk); |
- } else { |
- m_pData->Add(pChunk); |
- } |
- m_iChunkCount++; |
- } |
- } |
- } |
- FXSYS_assert(pChunk != NULL); |
- m_iBlockCount = index + 1; |
- return pChunk + (index % m_iChunkSize) * m_iBlockSize; |
-} |
-uint8_t* CFX_BaseMassArrayImp::GetAt(int32_t index) const { |
- FXSYS_assert(index > -1 && index < m_iBlockCount); |
- uint8_t* pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
- FXSYS_assert(pChunk != NULL); |
- return pChunk + (index % m_iChunkSize) * m_iBlockSize; |
-} |
-int32_t CFX_BaseMassArrayImp::Append(const CFX_BaseMassArrayImp& src, |
- int32_t iStart, |
- int32_t iCount) { |
- FXSYS_assert(m_iBlockSize == src.m_iBlockSize); |
- int32_t iAdded = src.m_iBlockCount; |
- FXSYS_assert(iStart > -1 && iStart < iAdded); |
- if (iCount < 0) { |
- iCount = iAdded; |
- } |
- if (iStart + iCount > iAdded) { |
- iCount = iAdded - iStart; |
- } |
- if (iCount < 1) { |
- return m_iBlockCount; |
- } |
- int32_t iBlockCount = m_iBlockCount; |
- int32_t iTotal = m_iBlockCount + iCount; |
- AddSpaceTo(iTotal - 1); |
- Append(iBlockCount, src, iStart, iCount); |
- return m_iBlockCount; |
-} |
-int32_t CFX_BaseMassArrayImp::Copy(const CFX_BaseMassArrayImp& src, |
- int32_t iStart, |
- int32_t iCount) { |
- FXSYS_assert(m_iBlockSize == src.m_iBlockSize); |
- int32_t iCopied = src.m_iBlockCount; |
- FXSYS_assert(iStart > -1); |
- if (iStart >= iCopied) { |
- return 0; |
- } |
- RemoveAll(TRUE); |
- if (iCount < 0) { |
- iCount = iCopied; |
- } |
- if (iStart + iCount > iCopied) { |
- iCount = iCopied - iStart; |
- } |
- if (iCount < 1) { |
- return 0; |
- } |
- if (m_iBlockCount < iCount) { |
- AddSpaceTo(iCount - 1); |
- } |
- Append(0, src, iStart, iCount); |
- return m_iBlockCount; |
-} |
-void CFX_BaseMassArrayImp::Append(int32_t iDstStart, |
- const CFX_BaseMassArrayImp& src, |
- int32_t iSrcStart, |
- int32_t iSrcCount) { |
- FXSYS_assert(iDstStart > -1 && m_iBlockSize == src.m_iBlockSize); |
- int32_t iSrcTotal = src.m_iBlockCount; |
- FXSYS_assert(iSrcTotal > 0 && m_iBlockCount >= iDstStart + iSrcCount); |
- FXSYS_assert(iSrcStart > -1 && iSrcStart < iSrcTotal && iSrcCount > 0 && |
- iSrcStart + iSrcCount <= iSrcTotal); |
- int32_t iDstChunkIndex = iDstStart / m_iChunkSize; |
- int32_t iSrcChunkIndex = iSrcStart / src.m_iChunkSize; |
- uint8_t* pDstChunk = (uint8_t*)GetAt(iDstStart); |
- uint8_t* pSrcChunk = (uint8_t*)src.GetAt(iSrcStart); |
- int32_t iDstChunkSize = m_iChunkSize - (iDstStart % m_iChunkSize); |
- int32_t iSrcChunkSize = src.m_iChunkSize - (iSrcStart % src.m_iChunkSize); |
- int32_t iCopySize = |
- std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize)); |
- int32_t iCopyBytes = iCopySize * m_iBlockSize; |
- while (iSrcCount > 0) { |
- FXSYS_assert(pDstChunk != NULL && pSrcChunk != NULL); |
- FXSYS_memcpy(pDstChunk, pSrcChunk, iCopyBytes); |
- iSrcCount -= iCopySize; |
- iSrcChunkSize -= iCopySize; |
- if (iSrcChunkSize < 1) { |
- iSrcChunkSize = src.m_iChunkSize; |
- iSrcChunkIndex++; |
- pSrcChunk = (uint8_t*)src.m_pData->GetAt(iSrcChunkIndex); |
- } else { |
- pSrcChunk += iCopyBytes; |
- } |
- iDstChunkSize -= iCopySize; |
- if (iDstChunkSize < 1) { |
- iDstChunkSize = m_iChunkSize; |
- iDstChunkIndex++; |
- pDstChunk = (uint8_t*)m_pData->GetAt(iDstChunkIndex); |
- } else { |
- pDstChunk += iCopyBytes; |
- } |
- iCopySize = std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize)); |
- iCopyBytes = iCopySize * m_iBlockSize; |
- } |
-} |
-int32_t CFX_BaseMassArrayImp::RemoveLast(int32_t iCount) { |
- if (iCount < 0 || iCount >= m_iBlockCount) { |
- m_iBlockCount = 0; |
- } else { |
- m_iBlockCount -= iCount; |
- } |
- return m_iBlockCount; |
-} |
-void CFX_BaseMassArrayImp::RemoveAll(FX_BOOL bLeaveMemory) { |
- if (bLeaveMemory) { |
- m_iBlockCount = 0; |
- return; |
- } |
- for (int32_t i = 0; i < m_iChunkCount; i++) { |
- void* p = m_pData->GetAt(i); |
- if (p == NULL) { |
- continue; |
- } |
- FX_Free(p); |
- } |
- m_pData->RemoveAll(); |
- m_iChunkCount = 0; |
- m_iBlockCount = 0; |
-} |
-CFX_BaseMassArray::CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize) { |
- m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize); |
-} |
-CFX_BaseMassArray::~CFX_BaseMassArray() { |
- delete m_pData; |
-} |
-int32_t CFX_BaseMassArray::GetSize() const { |
- return m_pData->m_iBlockCount; |
-} |
-uint8_t* CFX_BaseMassArray::AddSpaceTo(int32_t index) { |
- return m_pData->AddSpaceTo(index); |
-} |
-uint8_t* CFX_BaseMassArray::GetAt(int32_t index) const { |
- return m_pData->GetAt(index); |
-} |
-int32_t CFX_BaseMassArray::Append(const CFX_BaseMassArray& src, |
- int32_t iStart, |
- int32_t iCount) { |
- return m_pData->Append(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); |
-} |
-int32_t CFX_BaseMassArray::Copy(const CFX_BaseMassArray& src, |
- int32_t iStart, |
- int32_t iCount) { |
- return m_pData->Copy(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); |
-} |
-int32_t CFX_BaseMassArray::RemoveLast(int32_t iCount) { |
- return m_pData->RemoveLast(iCount); |
-} |
-void CFX_BaseMassArray::RemoveAll(FX_BOOL bLeaveMemory) { |
- m_pData->RemoveAll(bLeaveMemory); |
-} |
-typedef struct _FX_BASEDISCRETEARRAYDATA { |
- int32_t iBlockSize; |
- int32_t iChunkSize; |
- int32_t iChunkCount; |
- CFX_PtrArray ChunkBuffer; |
-} FX_BASEDISCRETEARRAYDATA, *FX_LPBASEDISCRETEARRAYDATA; |
-typedef FX_BASEDISCRETEARRAYDATA const* FX_LPCBASEDISCRETEARRAYDATA; |
-CFX_BaseDiscreteArray::CFX_BaseDiscreteArray(int32_t iChunkSize, |
- int32_t iBlockSize) { |
- FXSYS_assert(iChunkSize > 0 && iBlockSize > 0); |
- FX_LPBASEDISCRETEARRAYDATA pData; |
- m_pData = pData = new FX_BASEDISCRETEARRAYDATA; |
- pData->ChunkBuffer.SetSize(16); |
- pData->iChunkCount = 0; |
- pData->iChunkSize = iChunkSize; |
- pData->iBlockSize = iBlockSize; |
-} |
-CFX_BaseDiscreteArray::~CFX_BaseDiscreteArray() { |
- RemoveAll(); |
- delete (FX_LPBASEDISCRETEARRAYDATA) m_pData; |
-} |
-uint8_t* CFX_BaseDiscreteArray::AddSpaceTo(int32_t index) { |
- FXSYS_assert(index > -1); |
- FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
- int32_t& iChunkCount = pData->iChunkCount; |
- int32_t iChunkSize = pData->iChunkSize; |
- uint8_t* pChunk = NULL; |
- int32_t iChunk = index / iChunkSize; |
- if (iChunk < iChunkCount) { |
- pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk); |
- } |
- if (!pChunk) { |
- pChunk = FX_Alloc2D(uint8_t, iChunkSize, pData->iBlockSize); |
- FXSYS_memset(pChunk, 0, iChunkSize * pData->iBlockSize); |
- pData->ChunkBuffer.SetAtGrow(iChunk, pChunk); |
- if (iChunkCount <= iChunk) { |
- iChunkCount = iChunk + 1; |
- } |
- } |
- return pChunk + (index % iChunkSize) * pData->iBlockSize; |
-} |
-uint8_t* CFX_BaseDiscreteArray::GetAt(int32_t index) const { |
- FXSYS_assert(index > -1); |
- FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
- int32_t iChunkSize = pData->iChunkSize; |
- int32_t iChunk = index / iChunkSize; |
- if (iChunk >= pData->iChunkCount) { |
- return NULL; |
- } |
- uint8_t* pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk); |
- if (pChunk == NULL) { |
- return NULL; |
- } |
- return pChunk + (index % iChunkSize) * pData->iBlockSize; |
-} |
-void CFX_BaseDiscreteArray::RemoveAll() { |
- FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
- CFX_PtrArray& ChunkBuffer = pData->ChunkBuffer; |
- int32_t& iChunkCount = pData->iChunkCount; |
- for (int32_t i = 0; i < iChunkCount; i++) { |
- void* p = ChunkBuffer.GetAt(i); |
- if (p == NULL) { |
- continue; |
- } |
- FX_Free(p); |
- } |
- ChunkBuffer.RemoveAll(); |
- iChunkCount = 0; |
-} |
-CFX_BaseStack::CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize) { |
- m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize); |
-} |
-CFX_BaseStack::~CFX_BaseStack() { |
- delete (CFX_BaseMassArrayImp*)m_pData; |
-} |
-uint8_t* CFX_BaseStack::Push() { |
- return m_pData->AddSpace(); |
-} |
-void CFX_BaseStack::Pop() { |
- int32_t& iBlockCount = m_pData->m_iBlockCount; |
- if (iBlockCount < 1) { |
- return; |
- } |
- iBlockCount--; |
-} |
-uint8_t* CFX_BaseStack::GetTopElement() const { |
- int32_t iSize = m_pData->m_iBlockCount; |
- if (iSize < 1) { |
- return NULL; |
- } |
- return m_pData->GetAt(iSize - 1); |
-} |
-int32_t CFX_BaseStack::GetSize() const { |
- return m_pData->m_iBlockCount; |
-} |
-uint8_t* CFX_BaseStack::GetAt(int32_t index) const { |
- return m_pData->GetAt(index); |
-} |
-void CFX_BaseStack::RemoveAll(FX_BOOL bLeaveMemory) { |
- m_pData->RemoveAll(bLeaveMemory); |
-} |
+// Copyright 2014 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+ |
+#include <algorithm> |
+ |
+#include "xfa/src/fgas/include/fx_utl.h" |
+#include "xfa/src/fgas/src/fgas_base.h" |
+#include "fx_utils.h" |
+ |
+CFX_ThreadLock::CFX_ThreadLock() { |
+} |
+CFX_ThreadLock::~CFX_ThreadLock() {} |
+void CFX_ThreadLock::Lock() {} |
+void CFX_ThreadLock::Unlock() {} |
+class FX_BASEARRAYDATA : public CFX_Target { |
+ public: |
+ FX_BASEARRAYDATA(int32_t growsize, int32_t blocksize) |
+ : iGrowSize(growsize), |
+ iBlockSize(blocksize), |
+ iTotalCount(0), |
+ iBlockCount(0), |
+ pBuffer(nullptr) {} |
+ |
+ ~FX_BASEARRAYDATA() { FX_Free(pBuffer); } |
+ |
+ int32_t iGrowSize; |
+ int32_t iBlockSize; |
+ int32_t iTotalCount; |
+ int32_t iBlockCount; |
+ uint8_t* pBuffer; |
+}; |
+CFX_BaseArray::CFX_BaseArray(int32_t iGrowSize, int32_t iBlockSize) { |
+ FXSYS_assert(iGrowSize > 0 && iBlockSize > 0); |
+ m_pData = new FX_BASEARRAYDATA(iGrowSize, iBlockSize); |
+} |
+CFX_BaseArray::~CFX_BaseArray() { |
+ RemoveAll(); |
+ delete m_pData; |
+} |
+int32_t CFX_BaseArray::GetSize() const { |
+ return m_pData->iBlockCount; |
+} |
+int32_t CFX_BaseArray::GetBlockSize() const { |
+ return m_pData->iBlockSize; |
+} |
+uint8_t* CFX_BaseArray::AddSpaceTo(int32_t index) { |
+ FXSYS_assert(index > -1); |
+ uint8_t*& pBuffer = m_pData->pBuffer; |
+ int32_t& iTotalCount = m_pData->iTotalCount; |
+ int32_t iBlockSize = m_pData->iBlockSize; |
+ if (index >= iTotalCount) { |
+ int32_t iGrowSize = m_pData->iGrowSize; |
+ iTotalCount = (index / iGrowSize + 1) * iGrowSize; |
+ int32_t iNewSize = iTotalCount * iBlockSize; |
+ if (!pBuffer) { |
+ pBuffer = FX_Alloc(uint8_t, iNewSize); |
+ } else { |
+ pBuffer = FX_Realloc(uint8_t, pBuffer, iNewSize); |
+ } |
+ } |
+ int32_t& iBlockCount = m_pData->iBlockCount; |
+ if (index >= iBlockCount) { |
+ iBlockCount = index + 1; |
+ } |
+ return pBuffer + index * iBlockSize; |
+} |
+uint8_t* CFX_BaseArray::GetAt(int32_t index) const { |
+ FXSYS_assert(index > -1 && index < m_pData->iBlockCount); |
+ return m_pData->pBuffer + index * m_pData->iBlockSize; |
+} |
+uint8_t* CFX_BaseArray::GetBuffer() const { |
+ return m_pData->pBuffer; |
+} |
+int32_t CFX_BaseArray::Append(const CFX_BaseArray& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ int32_t iBlockSize = m_pData->iBlockSize; |
+ FXSYS_assert(iBlockSize == src.m_pData->iBlockSize); |
+ int32_t& iBlockCount = m_pData->iBlockCount; |
+ int32_t iAdded = src.GetSize(); |
+ FXSYS_assert(iStart > -1 && iStart < iAdded); |
+ if (iCount < 0) { |
+ iCount = iAdded; |
+ } |
+ if (iStart + iCount > iAdded) { |
+ iCount = iAdded - iStart; |
+ } |
+ if (iCount < 1) { |
+ return 0; |
+ } |
+ uint8_t* pDst = m_pData->pBuffer + iBlockCount * iBlockSize; |
+ AddSpaceTo(iBlockCount + iCount - 1); |
+ FX_memcpy(pDst, src.m_pData->pBuffer + iStart * iBlockSize, |
+ iCount * iBlockSize); |
+ return iCount; |
+} |
+int32_t CFX_BaseArray::Copy(const CFX_BaseArray& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ int32_t iBlockSize = m_pData->iBlockSize; |
+ FXSYS_assert(iBlockSize == src.m_pData->iBlockSize); |
+ int32_t iCopied = src.GetSize(); |
+ FXSYS_assert(iStart > -1 && iStart < iCopied); |
+ if (iCount < 0) { |
+ iCount = iCopied; |
+ } |
+ if (iStart + iCount > iCopied) { |
+ iCount = iCopied - iStart; |
+ } |
+ if (iCount < 1) { |
+ return 0; |
+ } |
+ RemoveAll(TRUE); |
+ AddSpaceTo(iCount - 1); |
+ FX_memcpy(m_pData->pBuffer, src.m_pData->pBuffer + iStart * iBlockSize, |
+ iCount * iBlockSize); |
+ return iCount; |
+} |
+int32_t CFX_BaseArray::RemoveLast(int32_t iCount) { |
+ int32_t& iBlockCount = m_pData->iBlockCount; |
+ if (iCount < 0 || iCount > iBlockCount) { |
+ iCount = iBlockCount; |
+ iBlockCount = 0; |
+ } else { |
+ iBlockCount -= iCount; |
+ } |
+ return iCount; |
+} |
+void CFX_BaseArray::RemoveAll(FX_BOOL bLeaveMemory) { |
+ if (!bLeaveMemory) { |
+ uint8_t*& pBuffer = m_pData->pBuffer; |
+ if (pBuffer != NULL) { |
+ FX_Free(pBuffer); |
+ pBuffer = NULL; |
+ } |
+ m_pData->iTotalCount = 0; |
+ } |
+ m_pData->iBlockCount = 0; |
+} |
+CFX_BaseMassArrayImp::CFX_BaseMassArrayImp(int32_t iChunkSize, |
+ int32_t iBlockSize) |
+ : m_iChunkSize(iChunkSize), |
+ m_iBlockSize(iBlockSize), |
+ m_iChunkCount(0), |
+ m_iBlockCount(0) { |
+ FXSYS_assert(m_iChunkSize > 0 && m_iBlockSize > 0); |
+ m_pData = new CFX_PtrArray; |
+ m_pData->SetSize(16); |
+} |
+CFX_BaseMassArrayImp::~CFX_BaseMassArrayImp() { |
+ RemoveAll(); |
+ delete m_pData; |
+} |
+uint8_t* CFX_BaseMassArrayImp::AddSpaceTo(int32_t index) { |
+ FXSYS_assert(index > -1); |
+ uint8_t* pChunk; |
+ if (index < m_iBlockCount) { |
+ pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
+ } else { |
+ int32_t iMemSize = m_iChunkSize * m_iBlockSize; |
+ while (TRUE) { |
+ if (index < m_iChunkCount * m_iChunkSize) { |
+ pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
+ break; |
+ } else { |
+ pChunk = FX_Alloc(uint8_t, iMemSize); |
+ if (m_iChunkCount < m_pData->GetSize()) { |
+ m_pData->SetAt(m_iChunkCount, pChunk); |
+ } else { |
+ m_pData->Add(pChunk); |
+ } |
+ m_iChunkCount++; |
+ } |
+ } |
+ } |
+ FXSYS_assert(pChunk != NULL); |
+ m_iBlockCount = index + 1; |
+ return pChunk + (index % m_iChunkSize) * m_iBlockSize; |
+} |
+uint8_t* CFX_BaseMassArrayImp::GetAt(int32_t index) const { |
+ FXSYS_assert(index > -1 && index < m_iBlockCount); |
+ uint8_t* pChunk = (uint8_t*)m_pData->GetAt(index / m_iChunkSize); |
+ FXSYS_assert(pChunk != NULL); |
+ return pChunk + (index % m_iChunkSize) * m_iBlockSize; |
+} |
+int32_t CFX_BaseMassArrayImp::Append(const CFX_BaseMassArrayImp& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ FXSYS_assert(m_iBlockSize == src.m_iBlockSize); |
+ int32_t iAdded = src.m_iBlockCount; |
+ FXSYS_assert(iStart > -1 && iStart < iAdded); |
+ if (iCount < 0) { |
+ iCount = iAdded; |
+ } |
+ if (iStart + iCount > iAdded) { |
+ iCount = iAdded - iStart; |
+ } |
+ if (iCount < 1) { |
+ return m_iBlockCount; |
+ } |
+ int32_t iBlockCount = m_iBlockCount; |
+ int32_t iTotal = m_iBlockCount + iCount; |
+ AddSpaceTo(iTotal - 1); |
+ Append(iBlockCount, src, iStart, iCount); |
+ return m_iBlockCount; |
+} |
+int32_t CFX_BaseMassArrayImp::Copy(const CFX_BaseMassArrayImp& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ FXSYS_assert(m_iBlockSize == src.m_iBlockSize); |
+ int32_t iCopied = src.m_iBlockCount; |
+ FXSYS_assert(iStart > -1); |
+ if (iStart >= iCopied) { |
+ return 0; |
+ } |
+ RemoveAll(TRUE); |
+ if (iCount < 0) { |
+ iCount = iCopied; |
+ } |
+ if (iStart + iCount > iCopied) { |
+ iCount = iCopied - iStart; |
+ } |
+ if (iCount < 1) { |
+ return 0; |
+ } |
+ if (m_iBlockCount < iCount) { |
+ AddSpaceTo(iCount - 1); |
+ } |
+ Append(0, src, iStart, iCount); |
+ return m_iBlockCount; |
+} |
+void CFX_BaseMassArrayImp::Append(int32_t iDstStart, |
+ const CFX_BaseMassArrayImp& src, |
+ int32_t iSrcStart, |
+ int32_t iSrcCount) { |
+ FXSYS_assert(iDstStart > -1 && m_iBlockSize == src.m_iBlockSize); |
+ int32_t iSrcTotal = src.m_iBlockCount; |
+ FXSYS_assert(iSrcTotal > 0 && m_iBlockCount >= iDstStart + iSrcCount); |
+ FXSYS_assert(iSrcStart > -1 && iSrcStart < iSrcTotal && iSrcCount > 0 && |
+ iSrcStart + iSrcCount <= iSrcTotal); |
+ int32_t iDstChunkIndex = iDstStart / m_iChunkSize; |
+ int32_t iSrcChunkIndex = iSrcStart / src.m_iChunkSize; |
+ uint8_t* pDstChunk = (uint8_t*)GetAt(iDstStart); |
+ uint8_t* pSrcChunk = (uint8_t*)src.GetAt(iSrcStart); |
+ int32_t iDstChunkSize = m_iChunkSize - (iDstStart % m_iChunkSize); |
+ int32_t iSrcChunkSize = src.m_iChunkSize - (iSrcStart % src.m_iChunkSize); |
+ int32_t iCopySize = |
+ std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize)); |
+ int32_t iCopyBytes = iCopySize * m_iBlockSize; |
+ while (iSrcCount > 0) { |
+ FXSYS_assert(pDstChunk != NULL && pSrcChunk != NULL); |
+ FXSYS_memcpy(pDstChunk, pSrcChunk, iCopyBytes); |
+ iSrcCount -= iCopySize; |
+ iSrcChunkSize -= iCopySize; |
+ if (iSrcChunkSize < 1) { |
+ iSrcChunkSize = src.m_iChunkSize; |
+ iSrcChunkIndex++; |
+ pSrcChunk = (uint8_t*)src.m_pData->GetAt(iSrcChunkIndex); |
+ } else { |
+ pSrcChunk += iCopyBytes; |
+ } |
+ iDstChunkSize -= iCopySize; |
+ if (iDstChunkSize < 1) { |
+ iDstChunkSize = m_iChunkSize; |
+ iDstChunkIndex++; |
+ pDstChunk = (uint8_t*)m_pData->GetAt(iDstChunkIndex); |
+ } else { |
+ pDstChunk += iCopyBytes; |
+ } |
+ iCopySize = std::min(iSrcCount, std::min(iSrcChunkSize, iDstChunkSize)); |
+ iCopyBytes = iCopySize * m_iBlockSize; |
+ } |
+} |
+int32_t CFX_BaseMassArrayImp::RemoveLast(int32_t iCount) { |
+ if (iCount < 0 || iCount >= m_iBlockCount) { |
+ m_iBlockCount = 0; |
+ } else { |
+ m_iBlockCount -= iCount; |
+ } |
+ return m_iBlockCount; |
+} |
+void CFX_BaseMassArrayImp::RemoveAll(FX_BOOL bLeaveMemory) { |
+ if (bLeaveMemory) { |
+ m_iBlockCount = 0; |
+ return; |
+ } |
+ for (int32_t i = 0; i < m_iChunkCount; i++) { |
+ void* p = m_pData->GetAt(i); |
+ if (p == NULL) { |
+ continue; |
+ } |
+ FX_Free(p); |
+ } |
+ m_pData->RemoveAll(); |
+ m_iChunkCount = 0; |
+ m_iBlockCount = 0; |
+} |
+CFX_BaseMassArray::CFX_BaseMassArray(int32_t iChunkSize, int32_t iBlockSize) { |
+ m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize); |
+} |
+CFX_BaseMassArray::~CFX_BaseMassArray() { |
+ delete m_pData; |
+} |
+int32_t CFX_BaseMassArray::GetSize() const { |
+ return m_pData->m_iBlockCount; |
+} |
+uint8_t* CFX_BaseMassArray::AddSpaceTo(int32_t index) { |
+ return m_pData->AddSpaceTo(index); |
+} |
+uint8_t* CFX_BaseMassArray::GetAt(int32_t index) const { |
+ return m_pData->GetAt(index); |
+} |
+int32_t CFX_BaseMassArray::Append(const CFX_BaseMassArray& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ return m_pData->Append(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); |
+} |
+int32_t CFX_BaseMassArray::Copy(const CFX_BaseMassArray& src, |
+ int32_t iStart, |
+ int32_t iCount) { |
+ return m_pData->Copy(*(CFX_BaseMassArrayImp*)src.m_pData, iStart, iCount); |
+} |
+int32_t CFX_BaseMassArray::RemoveLast(int32_t iCount) { |
+ return m_pData->RemoveLast(iCount); |
+} |
+void CFX_BaseMassArray::RemoveAll(FX_BOOL bLeaveMemory) { |
+ m_pData->RemoveAll(bLeaveMemory); |
+} |
+typedef struct _FX_BASEDISCRETEARRAYDATA { |
+ int32_t iBlockSize; |
+ int32_t iChunkSize; |
+ int32_t iChunkCount; |
+ CFX_PtrArray ChunkBuffer; |
+} FX_BASEDISCRETEARRAYDATA, *FX_LPBASEDISCRETEARRAYDATA; |
+typedef FX_BASEDISCRETEARRAYDATA const* FX_LPCBASEDISCRETEARRAYDATA; |
+CFX_BaseDiscreteArray::CFX_BaseDiscreteArray(int32_t iChunkSize, |
+ int32_t iBlockSize) { |
+ FXSYS_assert(iChunkSize > 0 && iBlockSize > 0); |
+ FX_LPBASEDISCRETEARRAYDATA pData; |
+ m_pData = pData = new FX_BASEDISCRETEARRAYDATA; |
+ pData->ChunkBuffer.SetSize(16); |
+ pData->iChunkCount = 0; |
+ pData->iChunkSize = iChunkSize; |
+ pData->iBlockSize = iBlockSize; |
+} |
+CFX_BaseDiscreteArray::~CFX_BaseDiscreteArray() { |
+ RemoveAll(); |
+ delete (FX_LPBASEDISCRETEARRAYDATA) m_pData; |
+} |
+uint8_t* CFX_BaseDiscreteArray::AddSpaceTo(int32_t index) { |
+ FXSYS_assert(index > -1); |
+ FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
+ int32_t& iChunkCount = pData->iChunkCount; |
+ int32_t iChunkSize = pData->iChunkSize; |
+ uint8_t* pChunk = NULL; |
+ int32_t iChunk = index / iChunkSize; |
+ if (iChunk < iChunkCount) { |
+ pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk); |
+ } |
+ if (!pChunk) { |
+ pChunk = FX_Alloc2D(uint8_t, iChunkSize, pData->iBlockSize); |
+ FXSYS_memset(pChunk, 0, iChunkSize * pData->iBlockSize); |
+ pData->ChunkBuffer.SetAtGrow(iChunk, pChunk); |
+ if (iChunkCount <= iChunk) { |
+ iChunkCount = iChunk + 1; |
+ } |
+ } |
+ return pChunk + (index % iChunkSize) * pData->iBlockSize; |
+} |
+uint8_t* CFX_BaseDiscreteArray::GetAt(int32_t index) const { |
+ FXSYS_assert(index > -1); |
+ FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
+ int32_t iChunkSize = pData->iChunkSize; |
+ int32_t iChunk = index / iChunkSize; |
+ if (iChunk >= pData->iChunkCount) { |
+ return NULL; |
+ } |
+ uint8_t* pChunk = (uint8_t*)pData->ChunkBuffer.GetAt(iChunk); |
+ if (pChunk == NULL) { |
+ return NULL; |
+ } |
+ return pChunk + (index % iChunkSize) * pData->iBlockSize; |
+} |
+void CFX_BaseDiscreteArray::RemoveAll() { |
+ FX_LPBASEDISCRETEARRAYDATA pData = (FX_LPBASEDISCRETEARRAYDATA)m_pData; |
+ CFX_PtrArray& ChunkBuffer = pData->ChunkBuffer; |
+ int32_t& iChunkCount = pData->iChunkCount; |
+ for (int32_t i = 0; i < iChunkCount; i++) { |
+ void* p = ChunkBuffer.GetAt(i); |
+ if (p == NULL) { |
+ continue; |
+ } |
+ FX_Free(p); |
+ } |
+ ChunkBuffer.RemoveAll(); |
+ iChunkCount = 0; |
+} |
+CFX_BaseStack::CFX_BaseStack(int32_t iChunkSize, int32_t iBlockSize) { |
+ m_pData = new CFX_BaseMassArrayImp(iChunkSize, iBlockSize); |
+} |
+CFX_BaseStack::~CFX_BaseStack() { |
+ delete (CFX_BaseMassArrayImp*)m_pData; |
+} |
+uint8_t* CFX_BaseStack::Push() { |
+ return m_pData->AddSpace(); |
+} |
+void CFX_BaseStack::Pop() { |
+ int32_t& iBlockCount = m_pData->m_iBlockCount; |
+ if (iBlockCount < 1) { |
+ return; |
+ } |
+ iBlockCount--; |
+} |
+uint8_t* CFX_BaseStack::GetTopElement() const { |
+ int32_t iSize = m_pData->m_iBlockCount; |
+ if (iSize < 1) { |
+ return NULL; |
+ } |
+ return m_pData->GetAt(iSize - 1); |
+} |
+int32_t CFX_BaseStack::GetSize() const { |
+ return m_pData->m_iBlockCount; |
+} |
+uint8_t* CFX_BaseStack::GetAt(int32_t index) const { |
+ return m_pData->GetAt(index); |
+} |
+void CFX_BaseStack::RemoveAll(FX_BOOL bLeaveMemory) { |
+ m_pData->RemoveAll(bLeaveMemory); |
+} |