From 9317f8f5336f989aade75ceb925391262b1ccdca Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Thu, 21 Sep 2017 16:19:19 -0400 Subject: Move CFX_SharedCopyOnWrite to SharedCopyOnWrite This CL renames CFX_SharedCopyOnWrite to SharedCopyOnWrite and moves to the fxcrt namespace. Bug: pdfium:898 Change-Id: Iced796b9f341407720e2a88f11d1916df56fe68c Reviewed-on: https://pdfium-review.googlesource.com/14617 Commit-Queue: dsinclair Reviewed-by: Tom Sepez --- BUILD.gn | 4 +- core/fpdfapi/page/cpdf_clippath.h | 4 +- core/fpdfapi/page/cpdf_colorstate.h | 4 +- core/fpdfapi/page/cpdf_contentmark.h | 4 +- core/fpdfapi/page/cpdf_generalstate.h | 4 +- core/fpdfapi/page/cpdf_path.h | 4 +- core/fpdfapi/page/cpdf_textstate.h | 4 +- core/fxcrt/cfx_shared_copy_on_write.h | 85 --------------- core/fxcrt/cfx_shared_copy_on_write_unittest.cpp | 128 ----------------------- core/fxcrt/shared_copy_on_write.h | 91 ++++++++++++++++ core/fxcrt/shared_copy_on_write_unittest.cpp | 128 +++++++++++++++++++++++ core/fxge/cfx_graphstate.h | 4 +- 12 files changed, 235 insertions(+), 229 deletions(-) delete mode 100644 core/fxcrt/cfx_shared_copy_on_write.h delete mode 100644 core/fxcrt/cfx_shared_copy_on_write_unittest.cpp create mode 100644 core/fxcrt/shared_copy_on_write.h create mode 100644 core/fxcrt/shared_copy_on_write_unittest.cpp diff --git a/BUILD.gn b/BUILD.gn index 5ba2d78f6b..eb67898cd4 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -821,7 +821,6 @@ static_library("fxcrt") { "core/fxcrt/cfx_fixedbufgrow.h", "core/fxcrt/cfx_memorystream.cpp", "core/fxcrt/cfx_memorystream.h", - "core/fxcrt/cfx_shared_copy_on_write.h", "core/fxcrt/cfx_string_data_template.h", "core/fxcrt/cfx_string_pool_template.h", "core/fxcrt/cfx_unowned_ptr.h", @@ -857,6 +856,7 @@ static_library("fxcrt") { "core/fxcrt/maybe_owned.h", "core/fxcrt/observable.h", "core/fxcrt/retain_ptr.h", + "core/fxcrt/shared_copy_on_write.h", "core/fxcrt/string_view_template.h", "core/fxcrt/widestring.cpp", "core/fxcrt/widestring.h", @@ -1920,7 +1920,6 @@ test("pdfium_unittests") { "core/fxcodec/jbig2/JBig2_BitStream_unittest.cpp", "core/fxcodec/jbig2/JBig2_Image_unittest.cpp", "core/fxcrt/bytestring_unittest.cpp", - "core/fxcrt/cfx_shared_copy_on_write_unittest.cpp", "core/fxcrt/cfx_string_pool_template_unittest.cpp", "core/fxcrt/cfx_unowned_ptr_unittest.cpp", "core/fxcrt/cfx_weak_ptr_unittest.cpp", @@ -1934,6 +1933,7 @@ test("pdfium_unittests") { "core/fxcrt/maybe_owned_unittest.cpp", "core/fxcrt/observable_unittest.cpp", "core/fxcrt/retain_ptr_unittest.cpp", + "core/fxcrt/shared_copy_on_write_unittest.cpp", "core/fxcrt/widestring_unittest.cpp", "core/fxge/dib/cstretchengine_unittest.cpp", "fpdfsdk/fpdfdoc_unittest.cpp", diff --git a/core/fpdfapi/page/cpdf_clippath.h b/core/fpdfapi/page/cpdf_clippath.h index 0105270b35..740342f14b 100644 --- a/core/fpdfapi/page/cpdf_clippath.h +++ b/core/fpdfapi/page/cpdf_clippath.h @@ -12,8 +12,8 @@ #include #include "core/fpdfapi/page/cpdf_path.h" -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/shared_copy_on_write.h" class CPDF_Path; class CPDF_TextObject; @@ -56,7 +56,7 @@ class CPDF_ClipPath { std::vector> m_TextList; }; - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FPDFAPI_PAGE_CPDF_CLIPPATH_H_ diff --git a/core/fpdfapi/page/cpdf_colorstate.h b/core/fpdfapi/page/cpdf_colorstate.h index cf63d24ea3..36a2c2d260 100644 --- a/core/fpdfapi/page/cpdf_colorstate.h +++ b/core/fpdfapi/page/cpdf_colorstate.h @@ -8,8 +8,8 @@ #define CORE_FPDFAPI_PAGE_CPDF_COLORSTATE_H_ #include "core/fpdfapi/page/cpdf_color.h" -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/fx_system.h" +#include "core/fxcrt/shared_copy_on_write.h" class CPDF_Color; class CPDF_ColorSpace; @@ -66,7 +66,7 @@ class CPDF_ColorState { float* pValue, uint32_t nValues); - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FPDFAPI_PAGE_CPDF_COLORSTATE_H_ diff --git a/core/fpdfapi/page/cpdf_contentmark.h b/core/fpdfapi/page/cpdf_contentmark.h index 1b2fe79e3c..f702859065 100644 --- a/core/fpdfapi/page/cpdf_contentmark.h +++ b/core/fpdfapi/page/cpdf_contentmark.h @@ -10,8 +10,8 @@ #include #include "core/fpdfapi/page/cpdf_contentmarkitem.h" -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/fx_system.h" +#include "core/fxcrt/shared_copy_on_write.h" class CPDF_Dictionary; @@ -55,7 +55,7 @@ class CPDF_ContentMark { std::vector m_Marks; }; - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTMARK_H_ diff --git a/core/fpdfapi/page/cpdf_generalstate.h b/core/fpdfapi/page/cpdf_generalstate.h index a55f1a7b33..8721a45268 100644 --- a/core/fpdfapi/page/cpdf_generalstate.h +++ b/core/fpdfapi/page/cpdf_generalstate.h @@ -7,10 +7,10 @@ #ifndef CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ #define CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/cfx_unowned_ptr.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_string.h" +#include "core/fxcrt/shared_copy_on_write.h" #include "core/fxge/fx_dib.h" class CPDF_Object; @@ -106,7 +106,7 @@ class CPDF_GeneralState { float m_Smoothness; }; - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FPDFAPI_PAGE_CPDF_GENERALSTATE_H_ diff --git a/core/fpdfapi/page/cpdf_path.h b/core/fpdfapi/page/cpdf_path.h index f604abdfe2..613d715b03 100644 --- a/core/fpdfapi/page/cpdf_path.h +++ b/core/fpdfapi/page/cpdf_path.h @@ -9,8 +9,8 @@ #include -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/fx_system.h" +#include "core/fxcrt/shared_copy_on_write.h" #include "core/fxge/cfx_defaultrenderdevice.h" #include "core/fxge/cfx_pathdata.h" #include "core/fxge/cfx_renderdevice.h" @@ -43,7 +43,7 @@ class CPDF_Path { const CFX_PathData* GetObject() const { return m_Ref.GetObject(); } private: - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FPDFAPI_PAGE_CPDF_PATH_H_ diff --git a/core/fpdfapi/page/cpdf_textstate.h b/core/fpdfapi/page/cpdf_textstate.h index e7239e1f91..1e9ea04e6a 100644 --- a/core/fpdfapi/page/cpdf_textstate.h +++ b/core/fpdfapi/page/cpdf_textstate.h @@ -7,8 +7,8 @@ #ifndef CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_ #define CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_ -#include "core/fxcrt/cfx_shared_copy_on_write.h" #include "core/fxcrt/cfx_unowned_ptr.h" +#include "core/fxcrt/shared_copy_on_write.h" class CPDF_Document; class CPDF_Font; @@ -84,7 +84,7 @@ class CPDF_TextState { void ReleaseFont(); }; - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode); diff --git a/core/fxcrt/cfx_shared_copy_on_write.h b/core/fxcrt/cfx_shared_copy_on_write.h deleted file mode 100644 index f897368813..0000000000 --- a/core/fxcrt/cfx_shared_copy_on_write.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ -#define CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ - -#include "core/fxcrt/fx_system.h" -#include "core/fxcrt/retain_ptr.h" - -// A shared object with Copy on Write semantics that makes it appear as -// if each one were independent. -template -class CFX_SharedCopyOnWrite { - public: - CFX_SharedCopyOnWrite() {} - CFX_SharedCopyOnWrite(const CFX_SharedCopyOnWrite& other) - : m_pObject(other.m_pObject) {} - ~CFX_SharedCopyOnWrite() {} - - template - ObjClass* Emplace(Args... params) { - m_pObject.Reset(new CountedObj(params...)); - return m_pObject.Get(); - } - - CFX_SharedCopyOnWrite& operator=(const CFX_SharedCopyOnWrite& that) { - if (*this != that) - m_pObject = that.m_pObject; - return *this; - } - - void SetNull() { m_pObject.Reset(); } - const ObjClass* GetObject() const { return m_pObject.Get(); } - - template - ObjClass* GetPrivateCopy(Args... params) { - if (!m_pObject) - return Emplace(params...); - if (!m_pObject->HasOneRef()) - m_pObject.Reset(new CountedObj(*m_pObject)); - return m_pObject.Get(); - } - - bool operator==(const CFX_SharedCopyOnWrite& that) const { - return m_pObject == that.m_pObject; - } - bool operator!=(const CFX_SharedCopyOnWrite& that) const { - return !(*this == that); - } - explicit operator bool() const { return !!m_pObject; } - - private: - class CountedObj : public ObjClass { - public: - template - // NOLINTNEXTLINE(runtime/explicit) - CountedObj(Args... params) : ObjClass(params...), m_RefCount(0) {} - - CountedObj(const CountedObj& src) : ObjClass(src), m_RefCount(0) {} - ~CountedObj() { m_RefCount = 0; } - - bool HasOneRef() const { return m_RefCount == 1; } - void Retain() { m_RefCount++; } - void Release() { - ASSERT(m_RefCount); - if (--m_RefCount == 0) - delete this; - } - - private: - // To ensure ref counts do not overflow, consider the worst possible case: - // the entire address space contains nothing but pointers to this object. - // Since the count increments with each new pointer, the largest value is - // the number of pointers that can fit into the address space. The size of - // the address space itself is a good upper bound on it. - intptr_t m_RefCount; - }; - - RetainPtr m_pObject; -}; - -#endif // CORE_FXCRT_CFX_SHARED_COPY_ON_WRITE_H_ diff --git a/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp b/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp deleted file mode 100644 index 797837465b..0000000000 --- a/core/fxcrt/cfx_shared_copy_on_write_unittest.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/fxcrt/cfx_shared_copy_on_write.h" - -#include -#include - -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -class Observer { - public: - void OnConstruct(const std::string& name) { construction_counts_[name]++; } - void OnDestruct(const std::string& name) { destruction_counts_[name]++; } - int GetConstructionCount(const std::string& name) { - return construction_counts_[name]; - } - int GetDestructionCount(const std::string& name) { - return destruction_counts_[name]; - } - - private: - std::map construction_counts_; - std::map destruction_counts_; -}; - -class Object { - public: - Object(Observer* observer, const std::string& name) - : name_(name), observer_(observer) { - observer->OnConstruct(name_); - } - Object(const Object& that) : name_(that.name_), observer_(that.observer_) { - observer_->OnConstruct(name_); - } - ~Object() { observer_->OnDestruct(name_); } - - private: - std::string name_; - Observer* observer_; -}; - -} // namespace - -TEST(fxcrt, SharedCopyOnWriteNull) { - Observer observer; - { - CFX_SharedCopyOnWrite ptr; - EXPECT_EQ(nullptr, ptr.GetObject()); - } -} - -TEST(fxcrt, SharedCopyOnWriteCopy) { - Observer observer; - { - CFX_SharedCopyOnWrite ptr1; - ptr1.Emplace(&observer, std::string("one")); - { - CFX_SharedCopyOnWrite ptr2 = ptr1; - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - } - { - CFX_SharedCopyOnWrite ptr3(ptr1); - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - } - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - } - EXPECT_EQ(1, observer.GetDestructionCount("one")); -} - -TEST(fxcrt, SharedCopyOnWriteAssignOverOld) { - Observer observer; - { - CFX_SharedCopyOnWrite ptr1; - ptr1.Emplace(&observer, std::string("one")); - ptr1.Emplace(&observer, std::string("two")); - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(1, observer.GetConstructionCount("two")); - EXPECT_EQ(1, observer.GetDestructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("two")); - } - EXPECT_EQ(1, observer.GetDestructionCount("two")); -} - -TEST(fxcrt, SharedCopyOnWriteAssignOverRetained) { - Observer observer; - { - CFX_SharedCopyOnWrite ptr1; - ptr1.Emplace(&observer, std::string("one")); - CFX_SharedCopyOnWrite ptr2(ptr1); - ptr1.Emplace(&observer, std::string("two")); - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(1, observer.GetConstructionCount("two")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("two")); - } - EXPECT_EQ(1, observer.GetDestructionCount("one")); - EXPECT_EQ(1, observer.GetDestructionCount("two")); -} - -TEST(fxcrt, SharedCopyOnWriteGetModify) { - Observer observer; - { - CFX_SharedCopyOnWrite ptr; - EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - - EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); - EXPECT_EQ(1, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - { - CFX_SharedCopyOnWrite other(ptr); - EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); - EXPECT_EQ(2, observer.GetConstructionCount("one")); - EXPECT_EQ(0, observer.GetDestructionCount("one")); - } - EXPECT_EQ(2, observer.GetConstructionCount("one")); - EXPECT_EQ(1, observer.GetDestructionCount("one")); - } - EXPECT_EQ(2, observer.GetDestructionCount("one")); -} diff --git a/core/fxcrt/shared_copy_on_write.h b/core/fxcrt/shared_copy_on_write.h new file mode 100644 index 0000000000..c04730d5e0 --- /dev/null +++ b/core/fxcrt/shared_copy_on_write.h @@ -0,0 +1,91 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_SHARED_COPY_ON_WRITE_H_ +#define CORE_FXCRT_SHARED_COPY_ON_WRITE_H_ + +#include "core/fxcrt/fx_system.h" +#include "core/fxcrt/retain_ptr.h" + +namespace fxcrt { + +// A shared object with Copy on Write semantics that makes it appear as +// if each one were independent. +template +class SharedCopyOnWrite { + public: + SharedCopyOnWrite() {} + SharedCopyOnWrite(const SharedCopyOnWrite& other) + : m_pObject(other.m_pObject) {} + ~SharedCopyOnWrite() {} + + template + ObjClass* Emplace(Args... params) { + m_pObject.Reset(new CountedObj(params...)); + return m_pObject.Get(); + } + + SharedCopyOnWrite& operator=(const SharedCopyOnWrite& that) { + if (*this != that) + m_pObject = that.m_pObject; + return *this; + } + + void SetNull() { m_pObject.Reset(); } + const ObjClass* GetObject() const { return m_pObject.Get(); } + + template + ObjClass* GetPrivateCopy(Args... params) { + if (!m_pObject) + return Emplace(params...); + if (!m_pObject->HasOneRef()) + m_pObject.Reset(new CountedObj(*m_pObject)); + return m_pObject.Get(); + } + + bool operator==(const SharedCopyOnWrite& that) const { + return m_pObject == that.m_pObject; + } + bool operator!=(const SharedCopyOnWrite& that) const { + return !(*this == that); + } + explicit operator bool() const { return !!m_pObject; } + + private: + class CountedObj : public ObjClass { + public: + template + // NOLINTNEXTLINE(runtime/explicit) + CountedObj(Args... params) : ObjClass(params...), m_RefCount(0) {} + + CountedObj(const CountedObj& src) : ObjClass(src), m_RefCount(0) {} + ~CountedObj() { m_RefCount = 0; } + + bool HasOneRef() const { return m_RefCount == 1; } + void Retain() { m_RefCount++; } + void Release() { + ASSERT(m_RefCount); + if (--m_RefCount == 0) + delete this; + } + + private: + // To ensure ref counts do not overflow, consider the worst possible case: + // the entire address space contains nothing but pointers to this object. + // Since the count increments with each new pointer, the largest value is + // the number of pointers that can fit into the address space. The size of + // the address space itself is a good upper bound on it. + intptr_t m_RefCount; + }; + + RetainPtr m_pObject; +}; + +} // namespace fxcrt + +using fxcrt::SharedCopyOnWrite; + +#endif // CORE_FXCRT_SHARED_COPY_ON_WRITE_H_ diff --git a/core/fxcrt/shared_copy_on_write_unittest.cpp b/core/fxcrt/shared_copy_on_write_unittest.cpp new file mode 100644 index 0000000000..a683767054 --- /dev/null +++ b/core/fxcrt/shared_copy_on_write_unittest.cpp @@ -0,0 +1,128 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/shared_copy_on_write.h" + +#include +#include + +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class Observer { + public: + void OnConstruct(const std::string& name) { construction_counts_[name]++; } + void OnDestruct(const std::string& name) { destruction_counts_[name]++; } + int GetConstructionCount(const std::string& name) { + return construction_counts_[name]; + } + int GetDestructionCount(const std::string& name) { + return destruction_counts_[name]; + } + + private: + std::map construction_counts_; + std::map destruction_counts_; +}; + +class Object { + public: + Object(Observer* observer, const std::string& name) + : name_(name), observer_(observer) { + observer->OnConstruct(name_); + } + Object(const Object& that) : name_(that.name_), observer_(that.observer_) { + observer_->OnConstruct(name_); + } + ~Object() { observer_->OnDestruct(name_); } + + private: + std::string name_; + Observer* observer_; +}; + +} // namespace + +TEST(SharedCopyOnWrite, Null) { + Observer observer; + { + SharedCopyOnWrite ptr; + EXPECT_EQ(nullptr, ptr.GetObject()); + } +} + +TEST(SharedCopyOnWrite, Copy) { + Observer observer; + { + SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + { + SharedCopyOnWrite ptr2 = ptr1; + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + { + SharedCopyOnWrite ptr3(ptr1); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); +} + +TEST(SharedCopyOnWrite, AssignOverOld) { + Observer observer; + { + SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(SharedCopyOnWrite, AssignOverRetained) { + Observer observer; + { + SharedCopyOnWrite ptr1; + ptr1.Emplace(&observer, std::string("one")); + SharedCopyOnWrite ptr2(ptr1); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(SharedCopyOnWrite, GetModify) { + Observer observer; + { + SharedCopyOnWrite ptr; + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + { + SharedCopyOnWrite other(ptr); + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetDestructionCount("one")); +} diff --git a/core/fxge/cfx_graphstate.h b/core/fxge/cfx_graphstate.h index b023ce790d..bf4fccd47d 100644 --- a/core/fxge/cfx_graphstate.h +++ b/core/fxge/cfx_graphstate.h @@ -7,7 +7,7 @@ #ifndef CORE_FXGE_CFX_GRAPHSTATE_H_ #define CORE_FXGE_CFX_GRAPHSTATE_H_ -#include "core/fxcrt/cfx_shared_copy_on_write.h" +#include "core/fxcrt/shared_copy_on_write.h" #include "core/fxge/cfx_graphstatedata.h" class CPDF_Array; @@ -38,7 +38,7 @@ class CFX_GraphState { const CFX_GraphStateData* GetObject() const { return m_Ref.GetObject(); } private: - CFX_SharedCopyOnWrite m_Ref; + SharedCopyOnWrite m_Ref; }; #endif // CORE_FXGE_CFX_GRAPHSTATE_H_ -- cgit v1.2.3