80ddaa1acf
Review URL: http://codereview.chromium.org/20378 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9958 0039d316-1c4b-4281-b951-d872f2087c98
75 linhas
2.2 KiB
C++
75 linhas
2.2 KiB
C++
// Copyright (c) 2006-2008 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 BASE_REVOCABLE_STORE_H_
|
|
#define BASE_REVOCABLE_STORE_H_
|
|
|
|
#include "base/ref_counted.h"
|
|
|
|
// |RevocableStore| is a container of items that can be removed from the store.
|
|
class RevocableStore {
|
|
public:
|
|
// A |StoreRef| is used to link the |RevocableStore| to its items. There is
|
|
// one StoreRef per store, and each item holds a reference to it. If the
|
|
// store wishes to revoke its items, it sets |store_| to null. Items are
|
|
// permitted to release their reference to the |StoreRef| when they no longer
|
|
// require the store.
|
|
class StoreRef : public base::RefCounted<StoreRef> {
|
|
public:
|
|
StoreRef(RevocableStore* store) : store_(store) { }
|
|
|
|
void set_store(RevocableStore* store) { store_ = store; }
|
|
RevocableStore* store() const { return store_; }
|
|
|
|
private:
|
|
RevocableStore* store_;
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(StoreRef);
|
|
};
|
|
|
|
// An item in the store. On construction, the object adds itself to the
|
|
// store.
|
|
class Revocable {
|
|
public:
|
|
Revocable(RevocableStore* store);
|
|
~Revocable();
|
|
|
|
// This item has been revoked if it no longer has a pointer to the store.
|
|
bool revoked() const { return !store_reference_->store(); }
|
|
|
|
private:
|
|
// We hold a reference to the store through this ref pointer. We release
|
|
// this reference on destruction.
|
|
scoped_refptr<StoreRef> store_reference_;
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(Revocable);
|
|
};
|
|
|
|
RevocableStore();
|
|
~RevocableStore();
|
|
|
|
// Revokes all the items in the store.
|
|
void RevokeAll();
|
|
|
|
// Returns true if there are no items in the store.
|
|
bool empty() const { return count_ == 0; }
|
|
|
|
private:
|
|
friend class Revocable;
|
|
|
|
// Adds an item to the store. To add an item to the store, construct it
|
|
// with a pointer to the store.
|
|
void Add(Revocable* item);
|
|
|
|
// This is the reference the unrevoked items in the store hold.
|
|
scoped_refptr<StoreRef> owning_reference_;
|
|
|
|
// The number of unrevoked items in the store.
|
|
int count_;
|
|
|
|
DISALLOW_EVIL_CONSTRUCTORS(RevocableStore);
|
|
};
|
|
|
|
#endif // BASE_REVOCABLE_STORE_H_
|