1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_
8 #include "mojo/public/cpp/bindings/lib/callback_internal.h"
9 #include "mojo/public/cpp/bindings/lib/shared_ptr.h"
10 #include "mojo/public/cpp/bindings/lib/template_util.h"
14 template <typename Sig>
17 template <typename... Args>
18 class Callback<void(Args...)> {
21 virtual ~Runnable() {}
23 typename internal::Callback_ParamTraits<Args>::ForwardType...)
29 // The Callback assumes ownership of |runnable|.
30 explicit Callback(Runnable* runnable) : sink_(runnable) {}
32 // Any class that is copy-constructable and has a compatible Run method may
33 // be adapted to a Callback using this constructor.
34 template <typename Sink>
35 Callback(const Sink& sink)
36 : sink_(new Adapter<Sink>(sink)) {}
38 void Run(typename internal::Callback_ParamTraits<Args>::ForwardType... args)
41 sink_->Run(internal::Forward(args)...);
44 bool is_null() const { return !sink_.get(); }
46 void reset() { sink_.reset(); }
49 template <typename Sink>
50 struct Adapter : public Runnable {
51 explicit Adapter(const Sink& sink) : sink(sink) {}
53 typename internal::Callback_ParamTraits<Args>::ForwardType... args)
55 sink.Run(internal::Forward(args)...);
60 internal::SharedPtr<Runnable> sink_;
63 typedef Callback<void()> Closure;
67 #endif // MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_