// Copyright 2014 The Chromium OS 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 LIBBRILLO_BRILLO_BIND_LAMBDA_H_
#define LIBBRILLO_BRILLO_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...);
  explicit LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
  R Run(Args... args) { return lambda_(std::forward<Args>(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...);
  explicit LambdaAdapter(Lambda lambda) : lambda_(lambda) {}
  R Run(Args... args) { return lambda_(std::forward<Args>(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  // LIBBRILLO_BRILLO_BIND_LAMBDA_H_
