summaryrefslogtreecommitdiff
path: root/core/fxcrt
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcrt')
-rw-r--r--core/fxcrt/cfx_blockbuffer.cpp138
-rw-r--r--core/fxcrt/cfx_blockbuffer.h31
2 files changed, 79 insertions, 90 deletions
diff --git a/core/fxcrt/cfx_blockbuffer.cpp b/core/fxcrt/cfx_blockbuffer.cpp
index 354f415282..efae014982 100644
--- a/core/fxcrt/cfx_blockbuffer.cpp
+++ b/core/fxcrt/cfx_blockbuffer.cpp
@@ -7,57 +7,58 @@
#include "core/fxcrt/cfx_blockbuffer.h"
#include <algorithm>
+#include <utility>
#include "third_party/base/stl_util.h"
-CFX_BlockBuffer::CFX_BlockBuffer(int32_t iAllocStep)
- : m_iDataLength(0),
- m_iBufferSize(0),
- m_iAllocStep(iAllocStep),
- m_iStartPosition(0) {}
+namespace {
-CFX_BlockBuffer::~CFX_BlockBuffer() {
- ClearBuffer();
+const int kAllocStep = 1024 * 1024;
+
+} // namespace
+
+CFX_BlockBuffer::CFX_BlockBuffer()
+ : m_iDataLength(0), m_iBufferSize(0), m_iStartPosition(0) {}
+
+CFX_BlockBuffer::~CFX_BlockBuffer() {}
+
+int32_t CFX_BlockBuffer::GetAllocStep() const {
+ return kAllocStep;
}
-wchar_t* CFX_BlockBuffer::GetAvailableBlock(int32_t& iIndexInBlock) {
- iIndexInBlock = 0;
+std::pair<wchar_t*, int32_t> CFX_BlockBuffer::GetAvailableBlock() {
if (m_BlockArray.empty())
- return nullptr;
+ return {nullptr, 0};
int32_t iRealIndex = m_iStartPosition + m_iDataLength;
if (iRealIndex == m_iBufferSize) {
- m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
- m_iBufferSize += m_iAllocStep;
- return m_BlockArray.back().get();
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, kAllocStep));
+ m_iBufferSize += kAllocStep;
+ return {m_BlockArray.back().get(), 0};
}
- iIndexInBlock = iRealIndex % m_iAllocStep;
- return m_BlockArray[iRealIndex / m_iAllocStep].get();
+ return {m_BlockArray[iRealIndex / kAllocStep].get(), iRealIndex % kAllocStep};
}
-bool CFX_BlockBuffer::InitBuffer(int32_t iBufferSize) {
- ClearBuffer();
- int32_t iNumOfBlock = (iBufferSize - 1) / m_iAllocStep + 1;
- for (int32_t i = 0; i < iNumOfBlock; i++)
- m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
-
- m_iBufferSize = iNumOfBlock * m_iAllocStep;
+bool CFX_BlockBuffer::InitBuffer() {
+ m_BlockArray.clear();
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, kAllocStep));
+ m_iBufferSize = kAllocStep;
return true;
}
void CFX_BlockBuffer::SetTextChar(int32_t iIndex, wchar_t ch) {
- if (iIndex < 0) {
+ if (iIndex < 0)
return;
- }
+
int32_t iRealIndex = m_iStartPosition + iIndex;
- int32_t iBlockIndex = iRealIndex / m_iAllocStep;
- int32_t iInnerIndex = iRealIndex % m_iAllocStep;
+ int32_t iBlockIndex = iRealIndex / kAllocStep;
+ int32_t iInnerIndex = iRealIndex % kAllocStep;
int32_t iBlockSize = pdfium::CollectionSize<int32_t>(m_BlockArray);
if (iBlockIndex >= iBlockSize) {
int32_t iNewBlocks = iBlockIndex - iBlockSize + 1;
do {
- m_BlockArray.emplace_back(FX_Alloc(wchar_t, m_iAllocStep));
- m_iBufferSize += m_iAllocStep;
+ m_BlockArray.emplace_back(FX_Alloc(wchar_t, kAllocStep));
+ m_iBufferSize += kAllocStep;
} while (--iNewBlocks);
}
wchar_t* pTextData = m_BlockArray[iBlockIndex].get();
@@ -65,7 +66,7 @@ void CFX_BlockBuffer::SetTextChar(int32_t iIndex, wchar_t ch) {
m_iDataLength = std::max(m_iDataLength, iIndex + 1);
}
-int32_t CFX_BlockBuffer::DeleteTextChars(int32_t iCount, bool bDirection) {
+int32_t CFX_BlockBuffer::DeleteTextChars(int32_t iCount) {
if (iCount <= 0)
return m_iDataLength;
@@ -73,68 +74,57 @@ int32_t CFX_BlockBuffer::DeleteTextChars(int32_t iCount, bool bDirection) {
Reset(false);
return 0;
}
- if (bDirection) {
- m_iStartPosition += iCount;
- m_iDataLength -= iCount;
- } else {
- m_iDataLength -= iCount;
- }
+ m_iDataLength -= iCount;
return m_iDataLength;
}
-void CFX_BlockBuffer::GetTextData(CFX_WideString& wsTextData,
- int32_t iStart,
- int32_t iLength) const {
- wsTextData.clear();
+CFX_WideString CFX_BlockBuffer::GetTextData(int32_t iStart,
+ int32_t iLength) const {
int32_t iMaybeDataLength = m_iBufferSize - 1 - m_iStartPosition;
- if (iStart < 0 || iStart > iMaybeDataLength) {
- return;
- }
- if (iLength == -1 || iLength > iMaybeDataLength) {
+ if (iStart < 0 || iStart > iMaybeDataLength)
+ return CFX_WideString();
+ if (iLength == -1 || iLength > iMaybeDataLength)
iLength = iMaybeDataLength;
- }
- if (iLength <= 0) {
- return;
- }
+ if (iLength <= 0)
+ return CFX_WideString();
+
+ CFX_WideString wsTextData;
wchar_t* pBuf = wsTextData.GetBuffer(iLength);
- if (!pBuf) {
- return;
- }
- int32_t iStartBlockIndex = 0;
- int32_t iStartInnerIndex = 0;
- TextDataIndex2BufIndex(iStart, iStartBlockIndex, iStartInnerIndex);
- int32_t iEndBlockIndex = 0;
- int32_t iEndInnerIndex = 0;
- TextDataIndex2BufIndex(iStart + iLength, iEndBlockIndex, iEndInnerIndex);
+ if (!pBuf)
+ return CFX_WideString();
+
+ int32_t iStartBlock = 0;
+ int32_t iStartInner = 0;
+ std::tie(iStartBlock, iStartInner) = TextDataIndex2BufIndex(iStart);
+
+ int32_t iEndBlock = 0;
+ int32_t iEndInner = 0;
+ std::tie(iEndBlock, iEndInner) = TextDataIndex2BufIndex(iStart + iLength);
+
int32_t iPointer = 0;
- for (int32_t i = iStartBlockIndex; i <= iEndBlockIndex; i++) {
+ for (int32_t i = iStartBlock; i <= iEndBlock; i++) {
int32_t iBufferPointer = 0;
- int32_t iCopyLength = m_iAllocStep;
- if (i == iStartBlockIndex) {
- iCopyLength -= iStartInnerIndex;
- iBufferPointer = iStartInnerIndex;
- }
- if (i == iEndBlockIndex) {
- iCopyLength -= ((m_iAllocStep - 1) - iEndInnerIndex);
+ int32_t iCopyLength = kAllocStep;
+ if (i == iStartBlock) {
+ iCopyLength -= iStartInner;
+ iBufferPointer = iStartInner;
}
+ if (i == iEndBlock)
+ iCopyLength -= ((kAllocStep - 1) - iEndInner);
+
wchar_t* pBlockBuf = m_BlockArray[i].get();
memcpy(pBuf + iPointer, pBlockBuf + iBufferPointer,
iCopyLength * sizeof(wchar_t));
iPointer += iCopyLength;
}
wsTextData.ReleaseBuffer(iLength);
+ return wsTextData;
}
-void CFX_BlockBuffer::TextDataIndex2BufIndex(const int32_t iIndex,
- int32_t& iBlockIndex,
- int32_t& iInnerIndex) const {
+std::pair<int32_t, int32_t> CFX_BlockBuffer::TextDataIndex2BufIndex(
+ const int32_t iIndex) const {
ASSERT(iIndex >= 0);
- int32_t iRealIndex = m_iStartPosition + iIndex;
- iBlockIndex = iRealIndex / m_iAllocStep;
- iInnerIndex = iRealIndex % m_iAllocStep;
-}
-void CFX_BlockBuffer::ClearBuffer() {
- m_iBufferSize = 0;
- m_BlockArray.clear();
+ int32_t iRealIndex = m_iStartPosition + iIndex;
+ return {iRealIndex / kAllocStep, iRealIndex % kAllocStep};
}
diff --git a/core/fxcrt/cfx_blockbuffer.h b/core/fxcrt/cfx_blockbuffer.h
index dbf01a938a..e7e493ca86 100644
--- a/core/fxcrt/cfx_blockbuffer.h
+++ b/core/fxcrt/cfx_blockbuffer.h
@@ -10,44 +10,43 @@
#include <stdint.h>
#include <memory>
+#include <utility>
#include <vector>
#include "core/fxcrt/fx_string.h"
class CFX_BlockBuffer {
public:
- explicit CFX_BlockBuffer(int32_t iAllocStep = 1024 * 1024);
+ CFX_BlockBuffer();
~CFX_BlockBuffer();
- bool InitBuffer(int32_t iBufferSize = 1024 * 1024);
- bool IsInitialized() { return m_iBufferSize / m_iAllocStep >= 1; }
+ bool InitBuffer();
+ bool IsInitialized() { return m_iBufferSize / GetAllocStep() >= 1; }
- wchar_t* GetAvailableBlock(int32_t& iIndexInBlock);
- inline int32_t GetAllocStep() const { return m_iAllocStep; }
- inline int32_t& GetDataLengthRef() { return m_iDataLength; }
+ std::pair<wchar_t*, int32_t> GetAvailableBlock();
+ int32_t GetAllocStep() const;
- inline void Reset(bool bReserveData = true) {
+ // This is ... scary. This returns a ref, which the XMLSyntaxParser stores
+ // and modifies.
+ int32_t& GetDataLengthRef() { return m_iDataLength; }
+
+ void Reset(bool bReserveData) {
if (!bReserveData)
m_iStartPosition = 0;
m_iDataLength = 0;
}
void SetTextChar(int32_t iIndex, wchar_t ch);
- int32_t DeleteTextChars(int32_t iCount, bool bDirection = true);
- void GetTextData(CFX_WideString& wsTextData,
- int32_t iStart = 0,
- int32_t iLength = -1) const;
+ int32_t DeleteTextChars(int32_t iCount);
+ CFX_WideString GetTextData(int32_t iStart, int32_t iLength) const;
private:
- inline void TextDataIndex2BufIndex(const int32_t iIndex,
- int32_t& iBlockIndex,
- int32_t& iInnerIndex) const;
- void ClearBuffer();
+ std::pair<int32_t, int32_t> TextDataIndex2BufIndex(
+ const int32_t iIndex) const;
std::vector<std::unique_ptr<wchar_t, FxFreeDeleter>> m_BlockArray;
int32_t m_iDataLength;
int32_t m_iBufferSize;
- int32_t m_iAllocStep;
int32_t m_iStartPosition;
};