From 65ecca4bc9c8e043b355c459486870ac1518095d Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Thu, 21 Sep 2017 15:25:32 -0400 Subject: Move CFX_Observable to Observable This CL renames CFX_Observable to Observable and moves into the fxcrt namespace. The test suite names were updated to ObservedPtr from fxcrt. Bug: pdfium:898 Change-Id: Ia507482bc0a1d6d8bbf12c0c55c4a88f6c8910e2 Reviewed-on: https://pdfium-review.googlesource.com/14615 Reviewed-by: Tom Sepez Commit-Queue: dsinclair --- core/fxcrt/cfx_observable.h | 81 --------------- core/fxcrt/cfx_observable_unittest.cpp | 185 --------------------------------- core/fxcrt/observable.h | 87 ++++++++++++++++ core/fxcrt/observable_unittest.cpp | 185 +++++++++++++++++++++++++++++++++ 4 files changed, 272 insertions(+), 266 deletions(-) delete mode 100644 core/fxcrt/cfx_observable.h delete mode 100644 core/fxcrt/cfx_observable_unittest.cpp create mode 100644 core/fxcrt/observable.h create mode 100644 core/fxcrt/observable_unittest.cpp (limited to 'core/fxcrt') diff --git a/core/fxcrt/cfx_observable.h b/core/fxcrt/cfx_observable.h deleted file mode 100644 index 8dc0907cae..0000000000 --- a/core/fxcrt/cfx_observable.h +++ /dev/null @@ -1,81 +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. - -#ifndef CORE_FXCRT_CFX_OBSERVABLE_H_ -#define CORE_FXCRT_CFX_OBSERVABLE_H_ - -#include - -#include "core/fxcrt/fx_system.h" -#include "third_party/base/stl_util.h" - -template -class CFX_Observable { - public: - class ObservedPtr { - public: - ObservedPtr() : m_pObservable(nullptr) {} - explicit ObservedPtr(T* pObservable) : m_pObservable(pObservable) { - if (m_pObservable) - m_pObservable->AddObservedPtr(this); - } - ObservedPtr(const ObservedPtr& that) : ObservedPtr(that.Get()) {} - ~ObservedPtr() { - if (m_pObservable) - m_pObservable->RemoveObservedPtr(this); - } - void Reset(T* pObservable = nullptr) { - if (m_pObservable) - m_pObservable->RemoveObservedPtr(this); - m_pObservable = pObservable; - if (m_pObservable) - m_pObservable->AddObservedPtr(this); - } - void OnDestroy() { - ASSERT(m_pObservable); - m_pObservable = nullptr; - } - ObservedPtr& operator=(const ObservedPtr& that) { - Reset(that.Get()); - return *this; - } - bool operator==(const ObservedPtr& that) const { - return m_pObservable == that.m_pObservable; - } - bool operator!=(const ObservedPtr& that) const { return !(*this == that); } - explicit operator bool() const { return !!m_pObservable; } - T* Get() const { return m_pObservable; } - T& operator*() const { return *m_pObservable; } - T* operator->() const { return m_pObservable; } - - private: - T* m_pObservable; - }; - - CFX_Observable() {} - CFX_Observable(const CFX_Observable& that) = delete; - ~CFX_Observable() { NotifyObservedPtrs(); } - void AddObservedPtr(ObservedPtr* pObservedPtr) { - ASSERT(!pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); - m_ObservedPtrs.insert(pObservedPtr); - } - void RemoveObservedPtr(ObservedPtr* pObservedPtr) { - ASSERT(pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); - m_ObservedPtrs.erase(pObservedPtr); - } - void NotifyObservedPtrs() { - for (auto* pObservedPtr : m_ObservedPtrs) - pObservedPtr->OnDestroy(); - m_ObservedPtrs.clear(); - } - CFX_Observable& operator=(const CFX_Observable& that) = delete; - - protected: - size_t ActiveObservedPtrsForTesting() const { return m_ObservedPtrs.size(); } - - private: - std::set m_ObservedPtrs; -}; - -#endif // CORE_FXCRT_CFX_OBSERVABLE_H_ diff --git a/core/fxcrt/cfx_observable_unittest.cpp b/core/fxcrt/cfx_observable_unittest.cpp deleted file mode 100644 index f7c78c1112..0000000000 --- a/core/fxcrt/cfx_observable_unittest.cpp +++ /dev/null @@ -1,185 +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_observable.h" - -#include -#include - -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -class PseudoObservable : public CFX_Observable { - public: - PseudoObservable() {} - int SomeMethod() { return 42; } - size_t ActiveObservedPtrs() const { return ActiveObservedPtrsForTesting(); } -}; - -} // namespace - -TEST(fxcrt, ObservePtrNull) { - PseudoObservable::ObservedPtr ptr; - EXPECT_EQ(nullptr, ptr.Get()); -} - -TEST(fxcrt, ObservePtrLivesLonger) { - PseudoObservable* pObs = new PseudoObservable; - PseudoObservable::ObservedPtr ptr(pObs); - EXPECT_NE(nullptr, ptr.Get()); - EXPECT_EQ(1u, pObs->ActiveObservedPtrs()); - delete pObs; - EXPECT_EQ(nullptr, ptr.Get()); -} - -TEST(fxcrt, ObservePtrLivesShorter) { - PseudoObservable obs; - { - PseudoObservable::ObservedPtr ptr(&obs); - EXPECT_NE(nullptr, ptr.Get()); - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObserveCopyConstruct) { - PseudoObservable obs; - { - PseudoObservable::ObservedPtr ptr(&obs); - EXPECT_NE(nullptr, ptr.Get()); - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - { - PseudoObservable::ObservedPtr ptr2(ptr); - EXPECT_NE(nullptr, ptr2.Get()); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObserveCopyAssign) { - PseudoObservable obs; - { - PseudoObservable::ObservedPtr ptr(&obs); - EXPECT_NE(nullptr, ptr.Get()); - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - { - PseudoObservable::ObservedPtr ptr2; - ptr2 = ptr; - EXPECT_NE(nullptr, ptr2.Get()); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObserveVector) { - PseudoObservable obs; - { - std::vector vec1; - std::vector vec2; - vec1.emplace_back(&obs); - vec1.emplace_back(&obs); - EXPECT_NE(nullptr, vec1[0].Get()); - EXPECT_NE(nullptr, vec1[1].Get()); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - vec2 = vec1; - EXPECT_NE(nullptr, vec2[0].Get()); - EXPECT_NE(nullptr, vec2[1].Get()); - EXPECT_EQ(4u, obs.ActiveObservedPtrs()); - vec1.clear(); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - vec2.resize(10000); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - vec2.resize(0); - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObserveVectorAutoClear) { - std::vector vec1; - { - PseudoObservable obs; - vec1.emplace_back(&obs); - vec1.emplace_back(&obs); - EXPECT_NE(nullptr, vec1[0].Get()); - EXPECT_NE(nullptr, vec1[1].Get()); - EXPECT_EQ(2u, obs.ActiveObservedPtrs()); - } - EXPECT_EQ(nullptr, vec1[0].Get()); - EXPECT_EQ(nullptr, vec1[1].Get()); -} - -TEST(fxcrt, ObservePtrResetNull) { - PseudoObservable obs; - PseudoObservable::ObservedPtr ptr(&obs); - EXPECT_EQ(1u, obs.ActiveObservedPtrs()); - ptr.Reset(); - EXPECT_EQ(0u, obs.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObservePtrReset) { - PseudoObservable obs1; - PseudoObservable obs2; - PseudoObservable::ObservedPtr ptr(&obs1); - EXPECT_EQ(1u, obs1.ActiveObservedPtrs()); - EXPECT_EQ(0u, obs2.ActiveObservedPtrs()); - ptr.Reset(&obs2); - EXPECT_EQ(0u, obs1.ActiveObservedPtrs()); - EXPECT_EQ(1u, obs2.ActiveObservedPtrs()); -} - -TEST(fxcrt, ObservePtrEquals) { - PseudoObservable obj1; - PseudoObservable obj2; - PseudoObservable::ObservedPtr null_ptr1; - PseudoObservable::ObservedPtr obj1_ptr1(&obj1); - PseudoObservable::ObservedPtr obj2_ptr1(&obj2); - { - PseudoObservable::ObservedPtr null_ptr2; - EXPECT_TRUE(null_ptr1 == null_ptr2); - - PseudoObservable::ObservedPtr obj1_ptr2(&obj1); - EXPECT_TRUE(obj1_ptr1 == obj1_ptr2); - - PseudoObservable::ObservedPtr obj2_ptr2(&obj2); - EXPECT_TRUE(obj2_ptr1 == obj2_ptr2); - } - EXPECT_FALSE(null_ptr1 == obj1_ptr1); - EXPECT_FALSE(null_ptr1 == obj2_ptr1); - EXPECT_FALSE(obj1_ptr1 == obj2_ptr1); -} - -TEST(fxcrt, ObservePtrNotEquals) { - PseudoObservable obj1; - PseudoObservable obj2; - PseudoObservable::ObservedPtr null_ptr1; - PseudoObservable::ObservedPtr obj1_ptr1(&obj1); - PseudoObservable::ObservedPtr obj2_ptr1(&obj2); - { - PseudoObservable::ObservedPtr null_ptr2; - PseudoObservable::ObservedPtr obj1_ptr2(&obj1); - PseudoObservable::ObservedPtr obj2_ptr2(&obj2); - EXPECT_FALSE(null_ptr1 != null_ptr2); - EXPECT_FALSE(obj1_ptr1 != obj1_ptr2); - EXPECT_FALSE(obj2_ptr1 != obj2_ptr2); - } - EXPECT_TRUE(null_ptr1 != obj1_ptr1); - EXPECT_TRUE(null_ptr1 != obj2_ptr1); - EXPECT_TRUE(obj1_ptr1 != obj2_ptr1); -} - -TEST(fxcrt, ObservePtrBool) { - PseudoObservable obj1; - PseudoObservable::ObservedPtr null_ptr; - PseudoObservable::ObservedPtr obj1_ptr(&obj1); - bool null_bool = !!null_ptr; - bool obj1_bool = !!obj1_ptr; - EXPECT_FALSE(null_bool); - EXPECT_TRUE(obj1_bool); -} diff --git a/core/fxcrt/observable.h b/core/fxcrt/observable.h new file mode 100644 index 0000000000..659f8ad5b9 --- /dev/null +++ b/core/fxcrt/observable.h @@ -0,0 +1,87 @@ +// 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. + +#ifndef CORE_FXCRT_OBSERVABLE_H_ +#define CORE_FXCRT_OBSERVABLE_H_ + +#include + +#include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" + +namespace fxcrt { + +template +class Observable { + public: + class ObservedPtr { + public: + ObservedPtr() : m_pObservable(nullptr) {} + explicit ObservedPtr(T* pObservable) : m_pObservable(pObservable) { + if (m_pObservable) + m_pObservable->AddObservedPtr(this); + } + ObservedPtr(const ObservedPtr& that) : ObservedPtr(that.Get()) {} + ~ObservedPtr() { + if (m_pObservable) + m_pObservable->RemoveObservedPtr(this); + } + void Reset(T* pObservable = nullptr) { + if (m_pObservable) + m_pObservable->RemoveObservedPtr(this); + m_pObservable = pObservable; + if (m_pObservable) + m_pObservable->AddObservedPtr(this); + } + void OnDestroy() { + ASSERT(m_pObservable); + m_pObservable = nullptr; + } + ObservedPtr& operator=(const ObservedPtr& that) { + Reset(that.Get()); + return *this; + } + bool operator==(const ObservedPtr& that) const { + return m_pObservable == that.m_pObservable; + } + bool operator!=(const ObservedPtr& that) const { return !(*this == that); } + explicit operator bool() const { return !!m_pObservable; } + T* Get() const { return m_pObservable; } + T& operator*() const { return *m_pObservable; } + T* operator->() const { return m_pObservable; } + + private: + T* m_pObservable; + }; + + Observable() {} + Observable(const Observable& that) = delete; + ~Observable() { NotifyObservedPtrs(); } + void AddObservedPtr(ObservedPtr* pObservedPtr) { + ASSERT(!pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); + m_ObservedPtrs.insert(pObservedPtr); + } + void RemoveObservedPtr(ObservedPtr* pObservedPtr) { + ASSERT(pdfium::ContainsKey(m_ObservedPtrs, pObservedPtr)); + m_ObservedPtrs.erase(pObservedPtr); + } + void NotifyObservedPtrs() { + for (auto* pObservedPtr : m_ObservedPtrs) + pObservedPtr->OnDestroy(); + m_ObservedPtrs.clear(); + } + Observable& operator=(const Observable& that) = delete; + + protected: + size_t ActiveObservedPtrsForTesting() const { return m_ObservedPtrs.size(); } + + private: + std::set m_ObservedPtrs; +}; + +} // namespace fxcrt + +using fxcrt::Observable; + +#endif // CORE_FXCRT_OBSERVABLE_H_ diff --git a/core/fxcrt/observable_unittest.cpp b/core/fxcrt/observable_unittest.cpp new file mode 100644 index 0000000000..8edc58f613 --- /dev/null +++ b/core/fxcrt/observable_unittest.cpp @@ -0,0 +1,185 @@ +// 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/observable.h" + +#include +#include + +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class PseudoObservable : public Observable { + public: + PseudoObservable() {} + int SomeMethod() { return 42; } + size_t ActiveObservedPtrs() const { return ActiveObservedPtrsForTesting(); } +}; + +} // namespace + +TEST(ObservePtr, Null) { + PseudoObservable::ObservedPtr ptr; + EXPECT_EQ(nullptr, ptr.Get()); +} + +TEST(ObservePtr, LivesLonger) { + PseudoObservable* pObs = new PseudoObservable; + PseudoObservable::ObservedPtr ptr(pObs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, pObs->ActiveObservedPtrs()); + delete pObs; + EXPECT_EQ(nullptr, ptr.Get()); +} + +TEST(ObservePtr, LivesShorter) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(ObservePtr, CopyConstruct) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + { + PseudoObservable::ObservedPtr ptr2(ptr); + EXPECT_NE(nullptr, ptr2.Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(ObservePtr, CopyAssign) { + PseudoObservable obs; + { + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_NE(nullptr, ptr.Get()); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + { + PseudoObservable::ObservedPtr ptr2; + ptr2 = ptr; + EXPECT_NE(nullptr, ptr2.Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(ObservePtr, Vector) { + PseudoObservable obs; + { + std::vector vec1; + std::vector vec2; + vec1.emplace_back(&obs); + vec1.emplace_back(&obs); + EXPECT_NE(nullptr, vec1[0].Get()); + EXPECT_NE(nullptr, vec1[1].Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2 = vec1; + EXPECT_NE(nullptr, vec2[0].Get()); + EXPECT_NE(nullptr, vec2[1].Get()); + EXPECT_EQ(4u, obs.ActiveObservedPtrs()); + vec1.clear(); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2.resize(10000); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + vec2.resize(0); + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(ObservePtr, VectorAutoClear) { + std::vector vec1; + { + PseudoObservable obs; + vec1.emplace_back(&obs); + vec1.emplace_back(&obs); + EXPECT_NE(nullptr, vec1[0].Get()); + EXPECT_NE(nullptr, vec1[1].Get()); + EXPECT_EQ(2u, obs.ActiveObservedPtrs()); + } + EXPECT_EQ(nullptr, vec1[0].Get()); + EXPECT_EQ(nullptr, vec1[1].Get()); +} + +TEST(ObservePtr, ResetNull) { + PseudoObservable obs; + PseudoObservable::ObservedPtr ptr(&obs); + EXPECT_EQ(1u, obs.ActiveObservedPtrs()); + ptr.Reset(); + EXPECT_EQ(0u, obs.ActiveObservedPtrs()); +} + +TEST(ObservePtr, Reset) { + PseudoObservable obs1; + PseudoObservable obs2; + PseudoObservable::ObservedPtr ptr(&obs1); + EXPECT_EQ(1u, obs1.ActiveObservedPtrs()); + EXPECT_EQ(0u, obs2.ActiveObservedPtrs()); + ptr.Reset(&obs2); + EXPECT_EQ(0u, obs1.ActiveObservedPtrs()); + EXPECT_EQ(1u, obs2.ActiveObservedPtrs()); +} + +TEST(ObservePtr, Equals) { + PseudoObservable obj1; + PseudoObservable obj2; + PseudoObservable::ObservedPtr null_ptr1; + PseudoObservable::ObservedPtr obj1_ptr1(&obj1); + PseudoObservable::ObservedPtr obj2_ptr1(&obj2); + { + PseudoObservable::ObservedPtr null_ptr2; + EXPECT_TRUE(null_ptr1 == null_ptr2); + + PseudoObservable::ObservedPtr obj1_ptr2(&obj1); + EXPECT_TRUE(obj1_ptr1 == obj1_ptr2); + + PseudoObservable::ObservedPtr obj2_ptr2(&obj2); + EXPECT_TRUE(obj2_ptr1 == obj2_ptr2); + } + EXPECT_FALSE(null_ptr1 == obj1_ptr1); + EXPECT_FALSE(null_ptr1 == obj2_ptr1); + EXPECT_FALSE(obj1_ptr1 == obj2_ptr1); +} + +TEST(ObservePtr, NotEquals) { + PseudoObservable obj1; + PseudoObservable obj2; + PseudoObservable::ObservedPtr null_ptr1; + PseudoObservable::ObservedPtr obj1_ptr1(&obj1); + PseudoObservable::ObservedPtr obj2_ptr1(&obj2); + { + PseudoObservable::ObservedPtr null_ptr2; + PseudoObservable::ObservedPtr obj1_ptr2(&obj1); + PseudoObservable::ObservedPtr obj2_ptr2(&obj2); + EXPECT_FALSE(null_ptr1 != null_ptr2); + EXPECT_FALSE(obj1_ptr1 != obj1_ptr2); + EXPECT_FALSE(obj2_ptr1 != obj2_ptr2); + } + EXPECT_TRUE(null_ptr1 != obj1_ptr1); + EXPECT_TRUE(null_ptr1 != obj2_ptr1); + EXPECT_TRUE(obj1_ptr1 != obj2_ptr1); +} + +TEST(ObservePtr, Bool) { + PseudoObservable obj1; + PseudoObservable::ObservedPtr null_ptr; + PseudoObservable::ObservedPtr obj1_ptr(&obj1); + bool null_bool = !!null_ptr; + bool obj1_bool = !!obj1_ptr; + EXPECT_FALSE(null_bool); + EXPECT_TRUE(obj1_bool); +} -- cgit v1.2.3