Convert positioned tabs to std::vector

This Cl changes from an CFX_ArrayTemplate to a std::vector and cleans up the
supporting code.

Change-Id: If07cb4fbd5fb9bcb078b5792a74ea62527cdd9a4
Reviewed-on: https://pdfium-review.googlesource.com/2884
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Nicolás Peña <npm@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fgas/layout/fgas_rtfbreak.cpp b/xfa/fgas/layout/fgas_rtfbreak.cpp
index fdc9a57..6488978 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.cpp
+++ b/xfa/fgas/layout/fgas_rtfbreak.cpp
@@ -41,7 +41,6 @@
       m_iFontHeight(240),
       m_iFontSize(240),
       m_iTabWidth(720000),
-      m_PositionedTabs(),
       m_wDefChar(0xFEFF),
       m_iDefChar(0),
       m_wLineBreakChar(L'\n'),
@@ -65,7 +64,6 @@
 
 CFX_RTFBreak::~CFX_RTFBreak() {
   Reset();
-  m_PositionedTabs.RemoveAll();
 }
 
 void CFX_RTFBreak::SetLineBoundary(FX_FLOAT fLineStart, FX_FLOAT fLineEnd) {
@@ -122,20 +120,13 @@
 }
 
 void CFX_RTFBreak::AddPositionedTab(FX_FLOAT fTabPos) {
-  int32_t iLineEnd = m_iBoundaryEnd;
-  int32_t iTabPos = FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart;
-  if (iTabPos > iLineEnd)
-    iTabPos = iLineEnd;
-  if (m_PositionedTabs.Find(iTabPos, 0) > -1)
+  int32_t iTabPos = std::min(FXSYS_round(fTabPos * 20000.0f) + m_iBoundaryStart,
+                             m_iBoundaryEnd);
+  auto it = std::lower_bound(m_PositionedTabs.begin(), m_PositionedTabs.end(),
+                             iTabPos);
+  if (it != m_PositionedTabs.end() && *it == iTabPos)
     return;
-
-  int32_t iCount = m_PositionedTabs.GetSize();
-  int32_t iFind = 0;
-  for (; iFind < iCount; iFind++) {
-    if (m_PositionedTabs[iFind] > iTabPos)
-      break;
-  }
-  m_PositionedTabs.InsertAt(iFind, iTabPos);
+  m_PositionedTabs.insert(it, iTabPos);
 }
 
 void CFX_RTFBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
@@ -222,21 +213,17 @@
 }
 
 int32_t CFX_RTFBreak::GetLastPositionedTab() const {
-  int32_t iCount = m_PositionedTabs.GetSize();
-  if (iCount < 1)
-    return m_iBoundaryStart;
-  return m_PositionedTabs[iCount - 1];
+  return m_PositionedTabs.empty() ? m_iBoundaryStart : m_PositionedTabs.back();
 }
 
 bool CFX_RTFBreak::GetPositionedTab(int32_t* iTabPos) const {
-  int32_t iCount = m_PositionedTabs.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    if (m_PositionedTabs[i] > *iTabPos) {
-      *iTabPos = m_PositionedTabs[i];
-      return true;
-    }
-  }
-  return false;
+  auto it = std::upper_bound(m_PositionedTabs.begin(), m_PositionedTabs.end(),
+                             *iTabPos);
+  if (it == m_PositionedTabs.end())
+    return false;
+
+  *iTabPos = *it;
+  return true;
 }
 
 CFX_RTFBreakType CFX_RTFBreak::AppendChar(FX_WCHAR wch) {
@@ -739,7 +726,7 @@
 
   CFX_RTFChar* pCharArray = tca.data();
   CFX_RTFChar* pCur = pCharArray + iLength;
-  iLength--;
+  --iLength;
   if (bAllChars)
     pCur->m_nBreakType = FX_LBT_UNKNOWN;
 
@@ -922,12 +909,11 @@
     iWidth = pText->pWidths[i];
     dwProps = FX_GetUnicodeProperties(wch);
     dwCharType = (dwProps & FX_CHARTYPEBITSMASK);
-    if (dwCharType == FX_CHARTYPE_ArabicAlef && iWidth == 0) {
-      wPrev = 0xFEFF;
+    if (iWidth == 0) {
+      if (dwCharType == FX_CHARTYPE_ArabicAlef)
+        wPrev = 0xFEFF;
       continue;
     }
-    if (iWidth == 0)
-      continue;
 
     iCharWidth = FXSYS_abs(iWidth);
     bEmptyChar =
diff --git a/xfa/fgas/layout/fgas_rtfbreak.h b/xfa/fgas/layout/fgas_rtfbreak.h
index 55b99ae..2b6c2cf 100644
--- a/xfa/fgas/layout/fgas_rtfbreak.h
+++ b/xfa/fgas/layout/fgas_rtfbreak.h
@@ -208,7 +208,7 @@
   int32_t m_iFontHeight;
   int32_t m_iFontSize;
   int32_t m_iTabWidth;
-  CFX_ArrayTemplate<int32_t> m_PositionedTabs;
+  std::vector<int32_t> m_PositionedTabs;
   FX_WCHAR m_wDefChar;
   int32_t m_iDefChar;
   FX_WCHAR m_wLineBreakChar;