blob: 0172ab3af2476f23e8f84df4f7847e360c0ba499 [file] [log] [blame]
Alex Vakulenko9cd5e272014-04-25 17:26:11 -07001// Copyright 2014 The Chromium OS 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.
4
5#ifndef BUFFET_BIND_LAMBDA_H_
6#define BUFFET_BIND_LAMBDA_H_
7
8#include <base/bind.h>
9
10////////////////////////////////////////////////////////////////////////////////
11// This file is an extension to base/bind_internal.h and adds a RunnableAdapter
12// class specialization that wraps a functor (including lambda objects), so
13// they can be used in base::Callback/base::Bind constructs.
14// By including this file you will gain the ability to write expressions like:
15// base::Callback<int(int)> callback = base::Bind([](int value) {
16// return value * value;
17// });
18////////////////////////////////////////////////////////////////////////////////
19namespace base {
20namespace internal {
21
22// LambdaAdapter is a helper class that specializes on different function call
23// signatures and provides the RunType and Run() method required by
24// RunnableAdapter<> class.
25template <typename Lambda, typename Sig>
26class LambdaAdapter;
27
28// R(...)
29template <typename Lambda, typename R, typename... Args>
30class LambdaAdapter<Lambda, R(Lambda::*)(Args... args)> {
Alex Vakulenko33797062014-05-12 15:55:25 -070031 public:
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070032 typedef R(RunType)(Args...);
33 LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
34 R Run(Args... args) { return lambda_(args...); }
35
Alex Vakulenko33797062014-05-12 15:55:25 -070036 private:
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070037 Lambda lambda_;
38};
39
40// R(...) const
41template <typename Lambda, typename R, typename... Args>
42class LambdaAdapter<Lambda, R(Lambda::*)(Args... args) const> {
Alex Vakulenko33797062014-05-12 15:55:25 -070043 public:
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070044 typedef R(RunType)(Args...);
45 LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
46 R Run(Args... args) { return lambda_(args...); }
47
Alex Vakulenko33797062014-05-12 15:55:25 -070048 private:
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070049 Lambda lambda_;
50};
51
52template <typename Lambda>
53class RunnableAdapter : public LambdaAdapter<Lambda,
54 decltype(&Lambda::operator())> {
Alex Vakulenko33797062014-05-12 15:55:25 -070055 public:
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070056 explicit RunnableAdapter(Lambda lambda) :
57 LambdaAdapter<Lambda, decltype(&Lambda::operator())>(lambda) {
58 }
59};
60
61
Alex Vakulenko33797062014-05-12 15:55:25 -070062} // namespace internal
63} // namespace base
Alex Vakulenko9cd5e272014-04-25 17:26:11 -070064
Alex Vakulenko33797062014-05-12 15:55:25 -070065#endif // BUFFET_BIND_LAMBDA_H_