callback.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace mojo {
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename Sig>
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback;
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <>
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void()> {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run() const = 0;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run() const {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run();
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run() const MOJO_OVERRIDE {
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run();
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1>
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1)> {
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1) const = 0;
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1) const {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1));
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1) const
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1));
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2>
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2)> {
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2) const = 0;
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2) const {
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2));
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2) const
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2));
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3>
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3)> {
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3) const = 0;
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3) const {
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3));
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3) const
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3));
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4>
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4)> {
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4) const = 0;
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4) const {
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4));
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4) const
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4));
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5>
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5)> {
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5) const = 0;
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  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 {
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5));
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5) const
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5));
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5,
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    typename A6>
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5, A6)> {
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6) const = 0;
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4,
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A5>::ForwardType a5,
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A6>::ForwardType a6) const {
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5),
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a6));
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6) const
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5),
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a6));
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <typename A1, typename A2, typename A3, typename A4, typename A5,
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    typename A6, typename A7>
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Callback<void(A1, A2, A3, A4, A5, A6, A7)> {
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Runnable {
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual ~Runnable() {}
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6,
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A7>::ForwardType a7) const = 0;
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback() {}
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The Callback assumes ownership of |runnable|.
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit Callback(Runnable* runnable) : sink_(runnable) {}
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Any class that is copy-constructable and has a compatible Run method may
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // be adapted to a Callback using this constructor.
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Callback(const Sink& sink) : sink_(new Adapter<Sink>(sink)) {}
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Run(
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A1>::ForwardType a1,
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A2>::ForwardType a2,
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A3>::ForwardType a3,
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A4>::ForwardType a4,
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A5>::ForwardType a5,
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A6>::ForwardType a6,
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      typename internal::Callback_ParamTraits<A7>::ForwardType a7) const {
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (sink_.get())
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink_->Run(
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5),
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a6),
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a7));
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  template <typename Sink>
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  struct Adapter : public Runnable {
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    explicit Adapter(const Sink& sink) : sink(sink) {}
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void Run(
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A1>::ForwardType a1,
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A2>::ForwardType a2,
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A3>::ForwardType a3,
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A4>::ForwardType a4,
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A5>::ForwardType a5,
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A6>::ForwardType a6,
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        typename internal::Callback_ParamTraits<A7>::ForwardType a7) const
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            MOJO_OVERRIDE {
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      sink.Run(
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a1),
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a2),
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a3),
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a4),
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a5),
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a6),
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          internal::Callback_Forward(a7));
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Sink sink;
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  internal::SharedPtr<Runnable> sink_;
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace mojo
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
461e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif  // MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
462