Move {Byte,Wide}String::Insert() to StringTemplate<T>

Change-Id: I42e006f5e26b492fd6ea44dc9440e4b3846b2b8e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/116654
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 2b17975..4516f81 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -332,20 +332,6 @@
   m_pData->m_String[index] = c;
 }
 
-size_t ByteString::Insert(size_t index, char ch) {
-  const size_t cur_length = GetLength();
-  if (!IsValidLength(index))
-    return cur_length;
-
-  const size_t new_length = cur_length + 1;
-  ReallocBeforeWrite(new_length);
-  FXSYS_memmove(m_pData->m_String + index + 1, m_pData->m_String + index,
-                new_length - index);
-  m_pData->m_String[index] = ch;
-  m_pData->m_nDataLength = new_length;
-  return new_length;
-}
-
 std::optional<size_t> ByteString::Find(char ch, size_t start) const {
   if (!m_pData)
     return std::nullopt;
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index b985adc..20de629 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -102,10 +102,6 @@
 
   void SetAt(size_t index, char c);
 
-  size_t Insert(size_t index, char ch);
-  size_t InsertAtFront(char ch) { return Insert(0, ch); }
-  size_t InsertAtBack(char ch) { return Insert(GetLength(), ch); }
-
   void Reserve(size_t len);
 
   ByteString Substr(size_t offset) const;
diff --git a/core/fxcrt/string_template.cpp b/core/fxcrt/string_template.cpp
index f2be1ee..8eb95cf 100644
--- a/core/fxcrt/string_template.cpp
+++ b/core/fxcrt/string_template.cpp
@@ -101,6 +101,21 @@
 }
 
 template <typename T>
+size_t StringTemplate<T>::Insert(size_t index, T ch) {
+  const size_t cur_length = GetLength();
+  if (!IsValidLength(index)) {
+    return cur_length;
+  }
+  const size_t new_length = cur_length + 1;
+  ReallocBeforeWrite(new_length);
+  fxcrt::spanmove(m_pData->capacity_span().subspan(index + 1),
+                  m_pData->capacity_span().subspan(index, new_length - index));
+  m_pData->m_String[index] = ch;
+  m_pData->m_nDataLength = new_length;
+  return new_length;
+}
+
+template <typename T>
 size_t StringTemplate<T>::Delete(size_t index, size_t count) {
   if (!m_pData) {
     return 0;
diff --git a/core/fxcrt/string_template.h b/core/fxcrt/string_template.h
index b81aaef..4df22ce 100644
--- a/core/fxcrt/string_template.h
+++ b/core/fxcrt/string_template.h
@@ -104,6 +104,11 @@
   // to GetBuffer(), to indicate how much of the buffer was actually used.
   void ReleaseBuffer(size_t nNewLength);
 
+  // Returns size of string following insertion.
+  size_t Insert(size_t index, T ch);
+  size_t InsertAtFront(T ch) { return Insert(0, ch); }
+  size_t InsertAtBack(T ch) { return Insert(GetLength(), ch); }
+
   // Returns number of instances of `ch` removed.
   size_t Remove(T ch);
 
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 79ffa10..cdbf47d 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -647,20 +647,6 @@
   return Substr(GetLength() - count, count);
 }
 
-size_t WideString::Insert(size_t index, wchar_t ch) {
-  const size_t cur_length = GetLength();
-  if (!IsValidLength(index))
-    return cur_length;
-
-  const size_t new_length = cur_length + 1;
-  ReallocBeforeWrite(new_length);
-  FXSYS_wmemmove(m_pData->m_String + index + 1, m_pData->m_String + index,
-                 new_length - index);
-  m_pData->m_String[index] = ch;
-  m_pData->m_nDataLength = new_length;
-  return new_length;
-}
-
 std::optional<size_t> WideString::Find(wchar_t ch, size_t start) const {
   if (!m_pData)
     return std::nullopt;
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index e671dd1..8c18b00 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -116,10 +116,6 @@
   WideString First(size_t count) const;
   WideString Last(size_t count) const;
 
-  size_t Insert(size_t index, wchar_t ch);
-  size_t InsertAtFront(wchar_t ch) { return Insert(0, ch); }
-  size_t InsertAtBack(wchar_t ch) { return Insert(GetLength(), ch); }
-
   void MakeLower();
   void MakeUpper();