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_