| Index: content/renderer/media/tagged_list.h
|
| diff --git a/content/renderer/media/tagged_list.h b/content/renderer/media/tagged_list.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b58772c0329770d1568e51f152c30d89f0bed70a
|
| --- /dev/null
|
| +++ b/content/renderer/media/tagged_list.h
|
| @@ -0,0 +1,95 @@
|
| +// 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 CONTENT_RENDERER_MEDIA_TAGGED_LIST_H_
|
| +#define CONTENT_RENDERER_MEDIA_TAGGED_LIST_H_
|
| +
|
| +#include <algorithm>
|
| +#include <list>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +
|
| +namespace content {
|
| +
|
| +// Implements the pattern of a list of items, where added items are
|
| +// tagged, you can tag all items, and you can retrieve the list of
|
| +// items that are tagged, which removes the tag.
|
| +//
|
| +// For thread safety, operations on this object should be under an
|
| +// external lock. An internally-locked version could be created, but
|
| +// is not needed at the moment as users already lock.
|
| +template <class ItemType>
|
| +class TaggedList {
|
| + public:
|
| + typedef std::list<scoped_refptr<ItemType> > ItemList;
|
| +
|
| + TaggedList() {}
|
| +
|
| + void AddAndTag(ItemType* item) {
|
| + items_.push_back(item);
|
| + tagged_items_.push_back(item);
|
| + }
|
| +
|
| + void TagAll() {
|
| + tagged_items_ = items_;
|
| + }
|
| +
|
| + const ItemList& Items() const {
|
| + return items_;
|
| + }
|
| +
|
| + // Retrieves the list of items with tags, and removes their tags.
|
| + //
|
| + // |dest| should be empty.
|
| + void RetrieveAndClearTags(ItemList* dest) {
|
| + DCHECK(dest->empty());
|
| + dest->swap(tagged_items_);
|
| + }
|
| +
|
| + // Remove an item that matches a predicate. Will return a reference
|
| + // to it if it is found.
|
| + template <class UnaryPredicate>
|
| + scoped_refptr<ItemType> Remove(UnaryPredicate predicate) {
|
| + tagged_items_.remove_if(predicate);
|
| +
|
| + typename ItemList::iterator it = std::find_if(
|
| + items_.begin(), items_.end(), predicate);
|
| + if (it != items_.end()) {
|
| + scoped_refptr<ItemType> removed_item = *it;
|
| + items_.erase(it);
|
| + return removed_item;
|
| + }
|
| +
|
| + return NULL;
|
| + }
|
| +
|
| + template <class UnaryPredicate>
|
| + bool Contains(UnaryPredicate predicate) const {
|
| + return std::find_if(items_.begin(), items_.end(), predicate) !=
|
| + items_.end();
|
| + }
|
| +
|
| + void Clear() {
|
| + items_.clear();
|
| + tagged_items_.clear();
|
| + }
|
| +
|
| + bool IsEmpty() const {
|
| + bool is_empty = items_.empty();
|
| + DCHECK(!is_empty || tagged_items_.empty());
|
| + return is_empty;
|
| + }
|
| +
|
| + private:
|
| + ItemList items_;
|
| + ItemList tagged_items_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TaggedList);
|
| +};
|
| +
|
| +} // namespace content
|
| +
|
| +#endif // CONTENT_RENDERER_MEDIA_TAGGED_LIST_H_
|
|
|