From 5913a6ca71c85401e3f5317758d44a9fc4a667b2 Mon Sep 17 00:00:00 2001 From: tsepez Date: Wed, 16 Nov 2016 17:31:18 -0800 Subject: Make CPDF_Object subclass constructors intern strings Make CDPF_Arrays intern the object they create. Allow passing nullptr as a CFX_WeakPtr shortcut as well. Review-Url: https://codereview.chromium.org/2509123002 --- core/fpdfapi/parser/cpdf_array.h | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'core/fpdfapi/parser/cpdf_array.h') diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h index b7aec7e190..125cb4cbf8 100644 --- a/core/fpdfapi/parser/cpdf_array.h +++ b/core/fpdfapi/parser/cpdf_array.h @@ -9,6 +9,7 @@ #include #include +#include #include #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" @@ -23,6 +24,7 @@ class CPDF_Array : public CPDF_Object { std::vector>::const_iterator; CPDF_Array(); + explicit CPDF_Array(const CFX_WeakPtr& 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 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 - T* AddNew(Args... args) { + typename std::enable_if::value, T*>::type AddNew( + Args... args) { return static_cast(Add(pdfium::MakeUnique(args...))); } template - T* SetNewAt(size_t index, Args... args) { + typename std::enable_if::value, T*>::type AddNew( + Args... args) { + return static_cast(Add(pdfium::MakeUnique(m_pPool, args...))); + } + template + typename std::enable_if::value, T*>::type SetNewAt( + size_t index, + Args... args) { return static_cast(SetAt(index, pdfium::MakeUnique(args...))); } template - T* InsertNewAt(size_t index, Args... args) { + typename std::enable_if::value, T*>::type SetNewAt( + size_t index, + Args... args) { + return static_cast( + SetAt(index, pdfium::MakeUnique(m_pPool, args...))); + } + template + typename std::enable_if::value, T*>::type InsertNewAt( + size_t index, + Args... args) { return static_cast(InsertAt(index, pdfium::MakeUnique(args...))); } + template + typename std::enable_if::value, T*>::type InsertNewAt( + size_t index, + Args... args) { + return static_cast( + InsertAt(index, pdfium::MakeUnique(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* pVisited) const override; std::vector> m_Objects; + CFX_WeakPtr m_pPool; }; inline CPDF_Array* ToArray(CPDF_Object* obj) { -- cgit v1.2.3