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