diff options
author | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-18 06:13:52 +0000 |
---|---|---|
committer | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-18 06:13:52 +0000 |
commit | 681ccff34ef98c5a12d261643179a9044f4397d1 (patch) | |
tree | ae0ff3d0b1e2cb84224f76db5300bc7723c1f34c /cc/base/scoped_ptr_deque.h | |
parent | 8b9d37b0f4faaa93d88ba30acf0462b9849711bd (diff) | |
download | chromium_src-681ccff34ef98c5a12d261643179a9044f4397d1.zip chromium_src-681ccff34ef98c5a12d261643179a9044f4397d1.tar.gz chromium_src-681ccff34ef98c5a12d261643179a9044f4397d1.tar.bz2 |
Part 1 of cc/ directory shuffles: base
This establishes cc/base/ as discussed in https://groups.google.com/a/chromium.org/d/msg/graphics-dev/wNRsl3BwU_Y/jFXeRQq7e30J.
This patch will likely touch the most locations since it moves cc/switches.h
BUG=190824
TBR=piman@chromium.org, thakis@chromium.org
Review URL: https://codereview.chromium.org/12472028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188681 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/base/scoped_ptr_deque.h')
-rw-r--r-- | cc/base/scoped_ptr_deque.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/cc/base/scoped_ptr_deque.h b/cc/base/scoped_ptr_deque.h new file mode 100644 index 0000000..b1e9d0e --- /dev/null +++ b/cc/base/scoped_ptr_deque.h @@ -0,0 +1,135 @@ +// Copyright 2012 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_SCOPED_PTR_DEQUE_H_ +#define CC_BASE_SCOPED_PTR_DEQUE_H_ + +#include <deque> +#include "base/basictypes.h" +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/stl_util.h" + +namespace cc { + +// This type acts like a deque<scoped_ptr> based on top of std::deque. The +// ScopedPtrDeque has ownership of all elements in the deque. +template <typename T> +class ScopedPtrDeque { + public: + typedef typename std::deque<T*>::const_iterator const_iterator; + typedef typename std::deque<T*>::reverse_iterator reverse_iterator; + typedef typename std::deque<T*>::const_reverse_iterator + const_reverse_iterator; + +#if defined(OS_ANDROID) + // On Android the iterator is not a class, so we can't block assignment. + typedef typename std::deque<T*>::iterator iterator; +#else + // Ban setting values on the iterator directly. New pointers must be passed + // to methods on the ScopedPtrDeque class to appear in the deque. + class iterator : public std::deque<T*>::iterator { + public: + iterator(const typename std::deque<T*>::iterator& other) + : std::deque<T*>::iterator(other) {} + T* const& operator*() { return std::deque<T*>::iterator::operator*(); } + }; +#endif + + ScopedPtrDeque() {} + + ~ScopedPtrDeque() { clear(); } + + size_t size() const { + return data_.size(); + } + + T* at(size_t index) const { + DCHECK(index < size()); + return data_[index]; + } + + T* operator[](size_t index) const { + return at(index); + } + + T* front() const { + DCHECK(!empty()); + return at(0); + } + + T* back() const { + DCHECK(!empty()); + return at(size() - 1); + } + + bool empty() const { + return data_.empty(); + } + + scoped_ptr<T> take_front() { + scoped_ptr<T> ret(front()); + data_.pop_front(); + return ret.Pass(); + } + + scoped_ptr<T> take_back() { + scoped_ptr<T> ret(back()); + data_.pop_back(); + return ret.Pass(); + } + + void clear() { + STLDeleteElements(&data_); + } + + void push_front(scoped_ptr<T> item) { + data_.push_front(item.release()); + } + + void push_back(scoped_ptr<T> item) { + data_.push_back(item.release()); + } + + void insert(iterator position, scoped_ptr<T> item) { + DCHECK(position <= end()); + data_.insert(position, item.release()); + } + + scoped_ptr<T> take(iterator position) { + DCHECK(position < end()); + scoped_ptr<T> ret(*position); + data_.erase(position); + return ret.Pass(); + } + + void swap(iterator a, iterator b) { + DCHECK(a < end()); + DCHECK(b < end()); + if (a == end() || b == end() || a == b) + return; + typename std::deque<T*>::iterator writable_a = a; + typename std::deque<T*>::iterator writable_b = b; + std::swap(*writable_a, *writable_b); + } + + iterator begin() { return static_cast<iterator>(data_.begin()); } + const_iterator begin() const { return data_.begin(); } + iterator end() { return static_cast<iterator>(data_.end()); } + const_iterator end() const { return data_.end(); } + + reverse_iterator rbegin() { return data_.rbegin(); } + const_reverse_iterator rbegin() const { return data_.rbegin(); } + reverse_iterator rend() { return data_.rend(); } + const_reverse_iterator rend() const { return data_.rend(); } + + private: + std::deque<T*> data_; + + DISALLOW_COPY_AND_ASSIGN(ScopedPtrDeque); +}; + +} // namespace cc + +#endif // CC_BASE_SCOPED_PTR_DEQUE_H_ |