| Index: core/fxcrt/include/cfx_observable.h
|
| diff --git a/core/fxcrt/include/cfx_observable.h b/core/fxcrt/include/cfx_observable.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..50486ba4c89685a5298c3f432ff5a645f12e4042
|
| --- /dev/null
|
| +++ b/core/fxcrt/include/cfx_observable.h
|
| @@ -0,0 +1,57 @@
|
| +// 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"
|
| +
|
| +template <class T>
|
| +class CFX_Observable {
|
| + public:
|
| + class Observer {
|
| + public:
|
| + Observer() : m_pWatchedPtr(nullptr) {}
|
| + Observer(T** pWatchedPtr) : m_pWatchedPtr(pWatchedPtr) {}
|
| + 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() {
|
| + if (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) { m_Observers.insert(pObserver); }
|
| + void RemoveObserver(Observer* 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_
|
|
|