callback.h revision 116680a4aac90f2aa7413d9095a592090648e557
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file was GENERATED by command:
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//     pump.py callback.h.pump
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// DO NOT EDIT BY HAND!!!
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#ifndef MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#define MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "mojo/public/cpp/bindings/lib/callback_internal.h"
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "mojo/public/cpp/bindings/lib/shared_ptr.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/public/cpp/bindings/lib/template_util.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace mojo {
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename Sig>
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <>
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void()> {
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run() const = 0;
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run() const {
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run();
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run() const MOJO_OVERRIDE {
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run();
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1>
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1)> {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1) const = 0;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Run(typename internal::Callback_ParamTraits<A1>::ForwardType a1) const {
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      sink_->Run(internal::Forward(a1));
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1) const
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      sink.Run(internal::Forward(a1));
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2>
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2)> {
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2) const = 0;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2) const {
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2));
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2) const
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2));
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3>
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3)> {
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3) const = 0;
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3) const {
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3));
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3) const
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3));
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4>
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4)> {
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4) const = 0;
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4) const {
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4));
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4) const
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4));
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5>
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5)> {
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5) const = 0;
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4,
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A5>::ForwardType a5) const {
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5));
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5) const
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5));
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5,
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    typename A6>
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5, A6)> {
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6) const = 0;
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4,
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A5>::ForwardType a5,
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A6>::ForwardType a6) const {
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5),
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a6));
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6) const
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5),
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a6));
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5,
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    typename A6, typename A7>
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5, A6, A7)> {
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6,
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A7>::ForwardType a7) const = 0;
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4,
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A5>::ForwardType a5,
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A6>::ForwardType a6,
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A7>::ForwardType a7) const {
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5),
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a6),
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a7));
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_null() const {
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return !sink_.get();
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6,
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A7>::ForwardType a7) const
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a1),
476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a2),
477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a3),
478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a4),
479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a5),
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a6),
481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          internal::Forward(a7));
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace mojo
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
491e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif  // MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
492