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