Index: core/fpdfapi/parser/cpdf_array.h |
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h |
index b7aec7e190327dbf66cd206aaaa7fadd8f6252b8..125cb4cbf8c51cfaba89debb733575f9b15527d3 100644 |
--- a/core/fpdfapi/parser/cpdf_array.h |
+++ b/core/fpdfapi/parser/cpdf_array.h |
@@ -9,6 +9,7 @@ |
#include <memory> |
#include <set> |
+#include <type_traits> |
#include <vector> |
#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" |
@@ -23,6 +24,7 @@ class CPDF_Array : public CPDF_Object { |
std::vector<std::unique_ptr<CPDF_Object>>::const_iterator; |
CPDF_Array(); |
+ explicit CPDF_Array(const CFX_WeakPtr<CFX_ByteStringPool>& pPool); |
~CPDF_Array() override; |
// CPDF_Object: |
@@ -52,18 +54,44 @@ class CPDF_Array : public CPDF_Object { |
CPDF_Object* InsertAt(size_t index, std::unique_ptr<CPDF_Object> pObj); |
// Creates object owned by the array, returns unowned pointer to it. |
+ // We have special cases for objects that can intern strings from |
+ // a ByteStringPool. |
template <typename T, typename... Args> |
- T* AddNew(Args... args) { |
+ typename std::enable_if<!CanInternStrings<T>::value, T*>::type AddNew( |
+ Args... args) { |
return static_cast<T*>(Add(pdfium::MakeUnique<T>(args...))); |
} |
template <typename T, typename... Args> |
- T* SetNewAt(size_t index, Args... args) { |
+ typename std::enable_if<CanInternStrings<T>::value, T*>::type AddNew( |
+ Args... args) { |
+ return static_cast<T*>(Add(pdfium::MakeUnique<T>(m_pPool, args...))); |
+ } |
+ template <typename T, typename... Args> |
+ typename std::enable_if<!CanInternStrings<T>::value, T*>::type SetNewAt( |
+ size_t index, |
+ Args... args) { |
return static_cast<T*>(SetAt(index, pdfium::MakeUnique<T>(args...))); |
} |
template <typename T, typename... Args> |
- T* InsertNewAt(size_t index, Args... args) { |
+ typename std::enable_if<CanInternStrings<T>::value, T*>::type SetNewAt( |
+ size_t index, |
+ Args... args) { |
+ return static_cast<T*>( |
+ SetAt(index, pdfium::MakeUnique<T>(m_pPool, args...))); |
+ } |
+ template <typename T, typename... Args> |
+ typename std::enable_if<!CanInternStrings<T>::value, T*>::type InsertNewAt( |
+ size_t index, |
+ Args... args) { |
return static_cast<T*>(InsertAt(index, pdfium::MakeUnique<T>(args...))); |
} |
+ template <typename T, typename... Args> |
+ typename std::enable_if<CanInternStrings<T>::value, T*>::type InsertNewAt( |
+ size_t index, |
+ Args... args) { |
+ return static_cast<T*>( |
+ InsertAt(index, pdfium::MakeUnique<T>(m_pPool, args...))); |
+ } |
void RemoveAt(size_t index, size_t nCount = 1); |
void ConvertToIndirectObjectAt(size_t index, CPDF_IndirectObjectHolder* pDoc); |
@@ -77,6 +105,7 @@ class CPDF_Array : public CPDF_Object { |
std::set<const CPDF_Object*>* pVisited) const override; |
std::vector<std::unique_ptr<CPDF_Object>> m_Objects; |
+ CFX_WeakPtr<CFX_ByteStringPool> m_pPool; |
}; |
inline CPDF_Array* ToArray(CPDF_Object* obj) { |