// 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();
  }
}
