blob: e6f367c5d988b009b4f67b6da95873c3201dd287 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka6ca868f2015-08-13 21:53:05 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBWEAVE_SRC_BIND_LAMBDA_H_
6#define LIBWEAVE_SRC_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)> {
31 public:
32 typedef R(RunType)(Args...);
33 LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
34 R Run(Args... args) { return lambda_(CallbackForward(args)...); }
35
36 private:
37 Lambda lambda_;
38};
39
40// R(...) const
41template <typename Lambda, typename R, typename... Args>
42class LambdaAdapter<Lambda, R (Lambda::*)(Args... args) const> {
43 public:
44 typedef R(RunType)(Args...);
45 LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
46 R Run(Args... args) { return lambda_(CallbackForward(args)...); }
47
48 private:
49 Lambda lambda_;
50};
51
52template <typename Lambda>
53class RunnableAdapter
54 : public LambdaAdapter<Lambda, decltype(&Lambda::operator())> {
55 public:
56 explicit RunnableAdapter(Lambda lambda)
57 : LambdaAdapter<Lambda, decltype(&Lambda::operator())>(lambda) {}
58};
59
60} // namespace internal
61} // namespace base
62
63#endif // LIBWEAVE_SRC_BIND_LAMBDA_H_