| // 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) | 
 |       item = *it; | 
 |   } | 
 | } |