1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/callback_list.h"
6
7#include "base/basictypes.h"
8#include "base/bind.h"
9#include "base/bind_helpers.h"
10#include "base/memory/scoped_ptr.h"
11
12namespace base {
13
14class Foo {
15 public:
16  Foo() {}
17  ~Foo() {}
18};
19
20class FooListener {
21 public:
22  FooListener() {}
23
24  void GotAScopedFoo(scoped_ptr<Foo> f) { foo_ = f.Pass(); }
25
26  scoped_ptr<Foo> foo_;
27
28 private:
29  DISALLOW_COPY_AND_ASSIGN(FooListener);
30};
31
32
33#if defined(NCTEST_MOVE_ONLY_TYPE_PARAMETER)  // [r"calling a private constructor of class"]
34
35// Callbacks run with a move-only typed parameter.
36//
37// CallbackList does not support move-only typed parameters. Notify() is
38// designed to take zero or more parameters, and run each registered callback
39// with them. With move-only types, the parameter will be set to NULL after the
40// first callback has been run.
41void WontCompile() {
42  FooListener f;
43  CallbackList<void(scoped_ptr<Foo>)> c1;
44  scoped_ptr<CallbackList<void(scoped_ptr<Foo>)>::Subscription> sub =
45      c1.Add(Bind(&FooListener::GotAScopedFoo, Unretained(&f)));
46  c1.Notify(scoped_ptr<Foo>(new Foo()));
47}
48
49#endif
50
51}  // namespace base
52