// 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_