|  | // Copyright 2015 The Weave Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef LIBWEAVE_SRC_BIND_LAMBDA_H_ | 
|  | #define LIBWEAVE_SRC_BIND_LAMBDA_H_ | 
|  |  | 
|  | #include <base/bind.h> | 
|  |  | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | // This file is an extension to base/bind_internal.h and adds a RunnableAdapter | 
|  | // class specialization that wraps a functor (including lambda objects), so | 
|  | // they can be used in base::Callback/base::Bind constructs. | 
|  | // By including this file you will gain the ability to write expressions like: | 
|  | //    base::Callback<int(int)> callback = base::Bind([](int value) { | 
|  | //      return value * value; | 
|  | //    }); | 
|  | //////////////////////////////////////////////////////////////////////////////// | 
|  | namespace base { | 
|  | namespace internal { | 
|  |  | 
|  | // LambdaAdapter is a helper class that specializes on different function call | 
|  | // signatures and provides the RunType and Run() method required by | 
|  | // RunnableAdapter<> class. | 
|  | template <typename Lambda, typename Sig> | 
|  | class LambdaAdapter; | 
|  |  | 
|  | // R(...) | 
|  | template <typename Lambda, typename R, typename... Args> | 
|  | class LambdaAdapter<Lambda, R (Lambda::*)(Args... args)> { | 
|  | public: | 
|  | typedef R(RunType)(Args...); | 
|  | LambdaAdapter(Lambda lambda) : lambda_(lambda) {} | 
|  | R Run(Args... args) { return lambda_(CallbackForward(args)...); } | 
|  |  | 
|  | private: | 
|  | Lambda lambda_; | 
|  | }; | 
|  |  | 
|  | // R(...) const | 
|  | template <typename Lambda, typename R, typename... Args> | 
|  | class LambdaAdapter<Lambda, R (Lambda::*)(Args... args) const> { | 
|  | public: | 
|  | typedef R(RunType)(Args...); | 
|  | LambdaAdapter(Lambda lambda) : lambda_(lambda) {} | 
|  | R Run(Args... args) { return lambda_(CallbackForward(args)...); } | 
|  |  | 
|  | private: | 
|  | Lambda lambda_; | 
|  | }; | 
|  |  | 
|  | template <typename Lambda> | 
|  | class RunnableAdapter | 
|  | : public LambdaAdapter<Lambda, decltype(&Lambda::operator())> { | 
|  | public: | 
|  | explicit RunnableAdapter(Lambda lambda) | 
|  | : LambdaAdapter<Lambda, decltype(&Lambda::operator())>(lambda) {} | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // LIBWEAVE_SRC_BIND_LAMBDA_H_ |