| // 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_ |