| // Copyright (c) 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. |
| |
| #include <iterator> |
| #include <map> |
| #include <string> |
| |
| #include "scoped_refptr.h" |
| |
| struct Foo { |
| int dummy; |
| }; |
| |
| typedef std::map<std::string, scoped_refptr<const Foo>> MyMap; |
| |
| class MyIter |
| : public std::iterator<std::input_iterator_tag, scoped_refptr<const Foo>> { |
| public: |
| MyIter() {} |
| MyIter(const MyIter& other) : it_(other.it_) {} |
| explicit MyIter(MyMap::const_iterator it) : it_(it) {} |
| MyIter& operator++() { |
| ++it_; |
| return *this; |
| } |
| const scoped_refptr<const Foo> operator*() { return it_->second; } |
| bool operator!=(const MyIter& other) { return it_ != other.it_; } |
| bool operator==(const MyIter& other) { return it_ == other.it_; } |
| |
| private: |
| MyMap::const_iterator it_; |
| }; |
| |
| void TestsAScopedRefptr() { |
| MyMap map; |
| map["foo"] = new Foo; |
| map["bar"] = new Foo; |
| MyIter my_begin(map.begin()); |
| MyIter my_end(map.end()); |
| for (MyIter it = my_begin; it != my_end; ++it) { |
| const Foo* item = NULL; |
| if (it->get()) |
| item = it->get(); |
| } |
| } |