Remove Release() from IFX_CharIter, use unique_ptrs.

Review-Url: https://codereview.chromium.org/1986373002
diff --git a/xfa/fee/fde_txtedtbuf.cpp b/xfa/fee/fde_txtedtbuf.cpp
index c9ad392..def9201 100644
--- a/xfa/fee/fde_txtedtbuf.cpp
+++ b/xfa/fee/fde_txtedtbuf.cpp
@@ -29,10 +29,9 @@
       m_Alias(wcAlias) {
   ASSERT(m_pBuf);
 }
+
 CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() {}
-void CFDE_TxtEdtBufIter::Release() {
-  delete this;
-}
+
 FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev) {
   if (bPrev) {
     if (m_nIndex == 0) {
diff --git a/xfa/fee/fde_txtedtbuf.h b/xfa/fee/fde_txtedtbuf.h
index 673d2b9..bcfb66a 100644
--- a/xfa/fee/fde_txtedtbuf.h
+++ b/xfa/fee/fde_txtedtbuf.h
@@ -10,23 +10,19 @@
 #include "xfa/fee/ifde_txtedtengine.h"
 #include "xfa/fgas/crt/fgas_memory.h"
 
-class IFX_CharIter;
 class CFDE_TxtEdtBuf;
 
 class CFDE_TxtEdtBufIter : public IFX_CharIter {
  public:
   CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias = 0);
+  ~CFDE_TxtEdtBufIter() override;
 
-  virtual void Release();
-  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
-  virtual FX_WCHAR GetChar();
-  virtual void SetAt(int32_t nIndex);
-  virtual int32_t GetAt() const;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
-  virtual IFX_CharIter* Clone();
-
- protected:
-  ~CFDE_TxtEdtBufIter();
+  FX_BOOL Next(FX_BOOL bPrev = FALSE) override;
+  FX_WCHAR GetChar() override;
+  void SetAt(int32_t nIndex) override;
+  int32_t GetAt() const override;
+  FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const override;
+  IFX_CharIter* Clone() override;
 
  private:
   CFDE_TxtEdtBuf* m_pBuf;
@@ -35,6 +31,7 @@
   int32_t m_nIndex;
   FX_WCHAR m_Alias;
 };
+
 class CFDE_TxtEdtBuf {
  public:
   CFDE_TxtEdtBuf();
diff --git a/xfa/fee/fde_txtedtengine.cpp b/xfa/fee/fde_txtedtengine.cpp
index 71f5102..826f0ce 100644
--- a/xfa/fee/fde_txtedtengine.cpp
+++ b/xfa/fee/fde_txtedtengine.cpp
@@ -954,7 +954,8 @@
   FX_WCHAR wChar = L' ';
   int32_t nParagStart = 0;
   int32_t nIndex = 0;
-  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)m_pTxtBuf);
+  std::unique_ptr<IFX_CharIter> pIter(
+      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(m_pTxtBuf)));
   pIter->SetAt(0);
   do {
     wChar = pIter->GetChar();
@@ -968,7 +969,6 @@
       nParagStart = nIndex + 1;
     }
   } while (pIter->Next());
-  pIter->Release();
 }
 
 void CFDE_TxtEdtEngine::RemoveAllParags() {
diff --git a/xfa/fee/fde_txtedtpage.cpp b/xfa/fee/fde_txtedtpage.cpp
index d46e1a1..87d128a 100644
--- a/xfa/fee/fde_txtedtpage.cpp
+++ b/xfa/fee/fde_txtedtpage.cpp
@@ -143,8 +143,6 @@
   m_PieceMassArr.RemoveAll(TRUE);
   delete m_pTextSet;
   delete[] m_pCharWidth;
-  if (m_pIter)
-    m_pIter->Release();
 }
 
 void CFDE_TxtEdtPage::Release() {
@@ -357,13 +355,11 @@
   if (nIndex < 0) {
     return -1;
   }
-  CFX_WordBreak* pIter = new CFX_WordBreak;
+  std::unique_ptr<CFX_WordBreak> pIter(new CFX_WordBreak);
   pIter->Attach(new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf));
   pIter->SetAt(nIndex);
   nCount = pIter->GetWordLength();
-  int32_t nRet = pIter->GetWordPos();
-  pIter->Release();
-  return nRet;
+  return pIter->GetWordPos();
 }
 FX_BOOL CFDE_TxtEdtPage::IsLoaded(const CFX_RectF* pClipBox) {
   return m_bLoaded;
@@ -376,14 +372,12 @@
   }
   CFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
   const FDE_TXTEDTPARAMS* pParams = m_pEditEngine->GetEditParams();
-  if (m_pIter != NULL) {
-    m_pIter->Release();
-  }
   FX_WCHAR wcAlias = 0;
   if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
     wcAlias = m_pEditEngine->GetAliasChar();
   }
-  m_pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias);
+  m_pIter.reset(
+      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(pBuf), wcAlias));
   CFX_TxtBreak* pBreak = m_pEditEngine->GetTextBreak();
   pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
   pBreak->ClearBreakPieces();
@@ -429,7 +423,7 @@
   m_nCharCount = nPageEnd - nPageStart + 1;
   FX_BOOL bReload = FALSE;
   FX_FLOAT fDefCharWidth = 0;
-  IFX_CharIter* pIter = m_pIter->Clone();
+  std::unique_ptr<IFX_CharIter> pIter(m_pIter->Clone());
   pIter->SetAt(nPageStart);
   m_pIter->SetAt(nPageStart);
   FX_BOOL bFirstPiece = TRUE;
@@ -543,7 +537,6 @@
     FDE_TEXTEDITPIECE* pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
     pPiece->rtPiece.height = pParams->fFontSize;
   }
-  pIter->Release();
   m_nRefCount = 1;
   m_bLoaded = TRUE;
   return 0;
@@ -560,16 +553,15 @@
   m_pTextSet = nullptr;
   delete[] m_pCharWidth;
   m_pCharWidth = nullptr;
-  if (m_pBgnParag)
+  if (m_pBgnParag) {
     m_pBgnParag->UnloadParag();
-  if (m_pEndParag)
-    m_pEndParag->UnloadParag();
-  if (m_pIter) {
-    m_pIter->Release();
-    m_pIter = nullptr;
+    m_pBgnParag = nullptr;
   }
-  m_pBgnParag = nullptr;
-  m_pEndParag = nullptr;
+  if (m_pEndParag) {
+    m_pEndParag->UnloadParag();
+    m_pEndParag = nullptr;
+  }
+  m_pIter.reset();
 }
 
 const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() {
diff --git a/xfa/fee/fde_txtedtpage.h b/xfa/fee/fde_txtedtpage.h
index 8ac104c..81f29fe 100644
--- a/xfa/fee/fde_txtedtpage.h
+++ b/xfa/fee/fde_txtedtpage.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FEE_FDE_TXTEDTPAGE_H_
 #define XFA_FEE_FDE_TXTEDTPAGE_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_string.h"
 #include "xfa/fde/fde_visualset.h"
@@ -147,7 +149,7 @@
                         const CFX_RectF& rtF,
                         FX_FLOAT fTolerance) const;
 
-  IFX_CharIter* m_pIter;
+  std::unique_ptr<IFX_CharIter> m_pIter;
   CFDE_TxtEdtTextSet* m_pTextSet;
   CFDE_TxtEdtEngine* m_pEditEngine;
   CFDE_TXTEDTPieceMassArray m_PieceMassArr;
diff --git a/xfa/fee/fde_txtedtparag.cpp b/xfa/fee/fde_txtedtparag.cpp
index f49f431..4f5b5a1 100644
--- a/xfa/fee/fde_txtedtparag.cpp
+++ b/xfa/fee/fde_txtedtparag.cpp
@@ -37,8 +37,8 @@
   if (pParam->dwMode & FDE_TEXTEDITMODE_Password) {
     wcAlias = m_pEngine->GetAliasChar();
   }
-  IFX_CharIter* pIter =
-      new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf, wcAlias);
+  std::unique_ptr<IFX_CharIter> pIter(
+      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(pTxtBuf), wcAlias));
   pIter->SetAt(m_nCharStart);
   int32_t nEndIndex = m_nCharStart + m_nCharCount;
   CFX_ArrayTemplate<int32_t> LineBaseArr;
@@ -71,7 +71,6 @@
       pIter->Next(TRUE);
     }
   } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
-  pIter->Release();
   pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
   pTxtBreak->ClearBreakPieces();
   int32_t nLineCount = LineBaseArr.GetSize();
@@ -102,10 +101,11 @@
 void CFDE_TxtEdtParag::CalcLines() {
   CFX_TxtBreak* pTxtBreak = m_pEngine->GetTextBreak();
   CFDE_TxtEdtBuf* pTxtBuf = m_pEngine->GetTextBuf();
-  IFX_CharIter* pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pTxtBuf);
   int32_t nCount = 0;
   uint32_t dwBreakStatus = FX_TXTBREAK_None;
   int32_t nEndIndex = m_nCharStart + m_nCharCount;
+  std::unique_ptr<IFX_CharIter> pIter(
+      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(pTxtBuf)));
   pIter->SetAt(m_nCharStart);
   FX_BOOL bReload = FALSE;
   do {
@@ -129,7 +129,6 @@
       pIter->Next(TRUE);
     }
   } while (pIter->Next(FALSE) && (pIter->GetAt() < nEndIndex));
-  pIter->Release();
   pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
   pTxtBreak->ClearBreakPieces();
   m_nLineCount = nCount;
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreak.h b/xfa/fee/fx_wordbreak/fx_wordbreak.h
index 7192700..e1b1787 100644
--- a/xfa/fee/fx_wordbreak/fx_wordbreak.h
+++ b/xfa/fee/fx_wordbreak/fx_wordbreak.h
@@ -7,33 +7,34 @@
 #ifndef XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
 #define XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
 #include "xfa/fee/ifde_txtedtengine.h"
 
 class CFX_CharIter : public IFX_CharIter {
  public:
-  CFX_CharIter(const CFX_WideString& wsText);
-  virtual void Release();
-  virtual FX_BOOL Next(FX_BOOL bPrev = FALSE);
-  virtual FX_WCHAR GetChar();
-  virtual void SetAt(int32_t nIndex);
-  virtual int32_t GetAt() const;
-  virtual FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const;
-  virtual IFX_CharIter* Clone();
+  explicit CFX_CharIter(const CFX_WideString& wsText);
+  ~CFX_CharIter() override;
 
- protected:
-  ~CFX_CharIter();
+  FX_BOOL Next(FX_BOOL bPrev = FALSE) override;
+  FX_WCHAR GetChar() override;
+  void SetAt(int32_t nIndex) override;
+  int32_t GetAt() const override;
+  FX_BOOL IsEOF(FX_BOOL bTail = TRUE) const override;
+  IFX_CharIter* Clone() override;
 
  private:
   const CFX_WideString& m_wsText;
   int32_t m_nIndex;
 };
+
 class CFX_WordBreak {
  public:
   CFX_WordBreak();
+  ~CFX_WordBreak();
 
-  void Release();
   void Attach(IFX_CharIter* pIter);
   void Attach(const CFX_WideString& wsText);
   FX_BOOL Next(FX_BOOL bPrev);
@@ -44,14 +45,13 @@
   FX_BOOL IsEOF(FX_BOOL bTail) const;
 
  protected:
-  ~CFX_WordBreak();
   FX_BOOL FindNextBreakPos(IFX_CharIter* pIter,
                            FX_BOOL bPrev,
                            FX_BOOL bFromNext = TRUE);
 
  private:
-  IFX_CharIter* m_pPreIter;
-  IFX_CharIter* m_pCurIter;
+  std::unique_ptr<IFX_CharIter> m_pPreIter;
+  std::unique_ptr<IFX_CharIter> m_pCurIter;
 };
 
 #endif  // XFA_FEE_FX_WORDBREAK_FX_WORDBREAK_H_
diff --git a/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp
index 408558a..eda5368 100644
--- a/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp
+++ b/xfa/fee/fx_wordbreak/fx_wordbreak_impl.cpp
@@ -12,14 +12,14 @@
   return (FX_WordBreakProp)(((wcCodePoint)&1) ? (dwProperty & 0x0F)
                                               : (dwProperty >> 4));
 }
+
 CFX_CharIter::CFX_CharIter(const CFX_WideString& wsText)
     : m_wsText(wsText), m_nIndex(0) {
   ASSERT(!wsText.IsEmpty());
 }
+
 CFX_CharIter::~CFX_CharIter() {}
-void CFX_CharIter::Release() {
-  delete this;
-}
+
 FX_BOOL CFX_CharIter::Next(FX_BOOL bPrev) {
   if (bPrev) {
     if (m_nIndex <= 0) {
@@ -54,60 +54,46 @@
   pIter->m_nIndex = m_nIndex;
   return pIter;
 }
-CFX_WordBreak::CFX_WordBreak() : m_pPreIter(NULL), m_pCurIter(NULL) {}
-CFX_WordBreak::~CFX_WordBreak() {
-  if (m_pPreIter) {
-    m_pPreIter->Release();
-    m_pPreIter = NULL;
-  }
-  if (m_pCurIter) {
-    m_pCurIter->Release();
-    m_pCurIter = NULL;
-  }
-}
-void CFX_WordBreak::Release() {
-  delete this;
-}
+
+CFX_WordBreak::CFX_WordBreak() {}
+
+CFX_WordBreak::~CFX_WordBreak() {}
+
 void CFX_WordBreak::Attach(IFX_CharIter* pIter) {
   ASSERT(pIter);
-  m_pCurIter = pIter;
+  m_pCurIter.reset(pIter);
 }
 void CFX_WordBreak::Attach(const CFX_WideString& wsText) {
-  m_pCurIter = new CFX_CharIter(wsText);
+  m_pCurIter.reset(new CFX_CharIter(wsText));
 }
 FX_BOOL CFX_WordBreak::Next(FX_BOOL bPrev) {
-  IFX_CharIter* pIter = bPrev ? m_pPreIter->Clone() : m_pCurIter->Clone();
-  if (pIter->IsEOF(!bPrev)) {
+  std::unique_ptr<IFX_CharIter> pIter(
+      (bPrev ? m_pPreIter : m_pCurIter)->Clone());
+  if (pIter->IsEOF(!bPrev))
     return FALSE;
-  }
+
   pIter->Next(bPrev);
-  if (!FindNextBreakPos(pIter, bPrev, TRUE)) {
-    pIter->Release();
+  if (!FindNextBreakPos(pIter.get(), bPrev, TRUE))
     return FALSE;
-  }
+
   if (bPrev) {
-    m_pCurIter->Release();
-    m_pCurIter = m_pPreIter;
+    m_pCurIter = std::move(m_pPreIter);
     m_pCurIter->Next(TRUE);
-    m_pPreIter = pIter;
+    m_pPreIter = std::move(pIter);
   } else {
-    m_pPreIter->Release();
-    m_pPreIter = m_pCurIter;
+    m_pPreIter = std::move(m_pCurIter);
     m_pPreIter->Next();
-    m_pCurIter = pIter;
+    m_pCurIter = std::move(pIter);
   }
   return TRUE;
 }
 void CFX_WordBreak::SetAt(int32_t nIndex) {
-  if (m_pPreIter) {
-    m_pPreIter->Release();
-    m_pPreIter = NULL;
-  }
+  m_pPreIter.reset();
   m_pCurIter->SetAt(nIndex);
-  FindNextBreakPos(m_pCurIter, TRUE, FALSE);
-  m_pPreIter = m_pCurIter;
-  m_pCurIter = m_pPreIter->Clone();
-  FindNextBreakPos(m_pCurIter, FALSE, FALSE);
+  FindNextBreakPos(m_pCurIter.get(), TRUE, FALSE);
+  m_pPreIter = std::move(m_pCurIter);
+  m_pCurIter.reset(m_pPreIter->Clone());
+  FindNextBreakPos(m_pCurIter.get(), FALSE, FALSE);
 }
 int32_t CFX_WordBreak::GetWordPos() const {
   return m_pPreIter->GetAt();
@@ -121,16 +107,13 @@
     return;
   }
   FX_WCHAR* lpBuf = wsWord.GetBuffer(nWordLength);
-  IFX_CharIter* pTempIter = m_pPreIter->Clone();
+  std::unique_ptr<IFX_CharIter> pTempIter(m_pPreIter->Clone());
   int32_t i = 0;
   while (pTempIter->GetAt() <= m_pCurIter->GetAt()) {
     lpBuf[i++] = pTempIter->GetChar();
-    FX_BOOL bEnd = pTempIter->Next();
-    if (!bEnd) {
+    if (!pTempIter->Next())
       break;
-    }
   }
-  pTempIter->Release();
   wsWord.ReleaseBuffer(nWordLength);
 }
 FX_BOOL CFX_WordBreak::IsEOF(FX_BOOL bTail) const {
diff --git a/xfa/fee/ifde_txtedtengine.h b/xfa/fee/ifde_txtedtengine.h
index 1855f6f..54e96b8 100644
--- a/xfa/fee/ifde_txtedtengine.h
+++ b/xfa/fee/ifde_txtedtengine.h
@@ -142,7 +142,7 @@
 class IFX_CharIter {
  public:
   virtual ~IFX_CharIter() {}
-  virtual void Release() = 0;
+
   virtual FX_BOOL Next(FX_BOOL bPrev = FALSE) = 0;
   virtual FX_WCHAR GetChar() = 0;
   virtual void SetAt(int32_t nIndex) = 0;