cc: Make picture pile base thread safe.
[chromium-blink-merge.git] / mojo / public / cpp / bindings / callback.h
blobd7bab1632fb87397c817123e4bdbe2e9a263a2de
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"
12 namespace mojo {
14 template <typename Sig>
15 class Callback;
17 template <typename... Args>
18 class Callback<void(Args...)> {
19 public:
20 struct Runnable {
21 virtual ~Runnable() {}
22 virtual void Run(
23 typename internal::Callback_ParamTraits<Args>::ForwardType...)
24 const = 0;
27 Callback() {}
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)
39 const {
40 if (sink_.get())
41 sink_->Run(internal::Forward(args)...);
44 bool is_null() const { return !sink_.get(); }
46 void reset() { sink_.reset(); }
48 private:
49 template <typename Sink>
50 struct Adapter : public Runnable {
51 explicit Adapter(const Sink& sink) : sink(sink) {}
52 virtual void Run(
53 typename internal::Callback_ParamTraits<Args>::ForwardType... args)
54 const override {
55 sink.Run(internal::Forward(args)...);
57 Sink sink;
60 internal::SharedPtr<Runnable> sink_;
63 typedef Callback<void()> Closure;
65 } // namespace mojo
67 #endif // MOJO_PUBLIC_CPP_BINDINGS_CALLBACK_H_