|  | // Copyright 2013 The Chromium 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 CC_BASE_REF_COUNTED_MANAGED_H_ | 
|  | #define CC_BASE_REF_COUNTED_MANAGED_H_ | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "cc/base/cc_export.h" | 
|  |  | 
|  | namespace cc { | 
|  |  | 
|  | template <typename T> class RefCountedManaged; | 
|  |  | 
|  | template <typename T> | 
|  | class CC_EXPORT RefCountedManager { | 
|  | protected: | 
|  | RefCountedManager() : live_object_count_(0) {} | 
|  | ~RefCountedManager() { | 
|  | CHECK_EQ(0, live_object_count_); | 
|  | } | 
|  |  | 
|  | virtual void Release(T* object) = 0; | 
|  |  | 
|  | private: | 
|  | friend class RefCountedManaged<T>; | 
|  | int live_object_count_; | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | class CC_EXPORT RefCountedManaged : public base::subtle::RefCountedBase { | 
|  | public: | 
|  | explicit RefCountedManaged(RefCountedManager<T>* manager) | 
|  | : manager_(manager) { | 
|  | manager_->live_object_count_++; | 
|  | } | 
|  |  | 
|  | void AddRef() const { | 
|  | base::subtle::RefCountedBase::AddRef(); | 
|  | } | 
|  |  | 
|  | void Release() { | 
|  | if (base::subtle::RefCountedBase::Release()) { | 
|  | DCHECK_GT(manager_->live_object_count_, 0); | 
|  | manager_->live_object_count_--; | 
|  |  | 
|  | // This must be the last statement in case manager deletes | 
|  | // the object immediately. | 
|  | manager_->Release(static_cast<T*>(this)); | 
|  | } | 
|  | } | 
|  |  | 
|  | protected: | 
|  | ~RefCountedManaged() {} | 
|  |  | 
|  | private: | 
|  | RefCountedManager<T>* manager_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(RefCountedManaged<T>); | 
|  | }; | 
|  |  | 
|  | }  // namespace cc | 
|  |  | 
|  | #endif  // CC_BASE_REF_COUNTED_MANAGED_H_ |