diff options
Diffstat (limited to 'core/fxcrt')
-rw-r--r-- | core/fxcrt/include/cfx_observable.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/core/fxcrt/include/cfx_observable.h b/core/fxcrt/include/cfx_observable.h new file mode 100644 index 0000000000..b669e0d3d5 --- /dev/null +++ b/core/fxcrt/include/cfx_observable.h @@ -0,0 +1,66 @@ +// 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_INCLUDE_CFX_OBSERVABLE_H_ +#define CORE_FXCRT_INCLUDE_CFX_OBSERVABLE_H_ + +#include <set> + +#include "core/fxcrt/include/fx_system.h" +#include "third_party/base/stl_util.h" + +template <class T> +class CFX_Observable { + public: + class Observer { + public: + Observer() : m_pWatchedPtr(nullptr) {} + Observer(T** pWatchedPtr) : m_pWatchedPtr(pWatchedPtr) { + if (m_pWatchedPtr) + (*m_pWatchedPtr)->AddObserver(this); + } + Observer(const Observer& that) = delete; + ~Observer() { + if (m_pWatchedPtr) + (*m_pWatchedPtr)->RemoveObserver(this); + } + void SetWatchedPtr(T** pWatchedPtr) { + if (m_pWatchedPtr) + (*m_pWatchedPtr)->RemoveObserver(this); + m_pWatchedPtr = pWatchedPtr; + if (m_pWatchedPtr) + (*m_pWatchedPtr)->AddObserver(this); + } + void OnDestroy() { + ASSERT(m_pWatchedPtr); + *m_pWatchedPtr = nullptr; + m_pWatchedPtr = nullptr; + } + Observer& operator=(const Observer& that) = delete; + + private: + T** m_pWatchedPtr; + }; + + CFX_Observable() {} + CFX_Observable(const CFX_Observable& that) = delete; + ~CFX_Observable() { + for (auto* pObserver : m_Observers) + pObserver->OnDestroy(); + } + void AddObserver(Observer* pObserver) { + ASSERT(!pdfium::ContainsKey(m_Observers, pObserver)); + m_Observers.insert(pObserver); + } + void RemoveObserver(Observer* pObserver) { + ASSERT(pdfium::ContainsKey(m_Observers, pObserver)); + m_Observers.erase(pObserver); + } + CFX_Observable& operator=(const CFX_Observable& that) = delete; + + private: + std::set<Observer*> m_Observers; +}; + +#endif // CORE_FXCRT_INCLUDE_CFX_OBSERVABLE_H_ |