// Copyright 2018 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 BLUETOOTH_NEWBLUED_LIBNEWBLUE_GENERATED_FUNCTION_H_
#define BLUETOOTH_NEWBLUED_LIBNEWBLUE_GENERATED_FUNCTION_H_

// Internal implementation - Don't use in user code.
#define LIBNEWBLUE_RESULT_(func_type) \
  bluetooth::LibNewblueFunction<func_type>::Result

// Internal implementation - Don't use in user code.
#define LIBNEWBLUE_ARG_(n, func_type) \
  bluetooth::LibNewblueFunction<func_type>::Argument##n

// Macros to generate libnewblue functions wrapped in a C++ virtual methods.
// Use LIBNEWBLUE_METHODX for method with X parameters.
//
// Usage example:
// LIBNEWBLUE_METHOD2(SomeMethod, someFunction, bool(int, char));
// will produce:
// virtual bool SomeMethod(int a1, char a2) {
//   return someFunction(a1, a2);
// }

#define LIBNEWBLUE_METHOD0(cpp_name, c_name, func_type) \
  virtual LIBNEWBLUE_RESULT_(func_type) cpp_name() { return c_name(); }

#define LIBNEWBLUE_METHOD1(cpp_name, c_name, func_type) \
  virtual LIBNEWBLUE_RESULT_(func_type)                 \
      cpp_name(LIBNEWBLUE_ARG_(1, func_type) a1) {      \
    return c_name(a1);                                  \
  }

#define LIBNEWBLUE_METHOD2(cpp_name, c_name, func_type)                     \
  virtual LIBNEWBLUE_RESULT_(func_type) cpp_name(                           \
      LIBNEWBLUE_ARG_(1, func_type) a1, LIBNEWBLUE_ARG_(2, func_type) a2) { \
    return c_name(a1, a2);                                                  \
  }

#define LIBNEWBLUE_METHOD3(cpp_name, c_name, func_type)                   \
  virtual LIBNEWBLUE_RESULT_(func_type) cpp_name(                         \
      LIBNEWBLUE_ARG_(1, func_type) a1, LIBNEWBLUE_ARG_(2, func_type) a2, \
      LIBNEWBLUE_ARG_(3, func_type) a3) {                                 \
    return c_name(a1, a2, a3);                                            \
  }

#define LIBNEWBLUE_METHOD4(cpp_name, c_name, func_type)                     \
  virtual LIBNEWBLUE_RESULT_(func_type) cpp_name(                           \
      LIBNEWBLUE_ARG_(1, func_type) a1, LIBNEWBLUE_ARG_(2, func_type) a2,   \
      LIBNEWBLUE_ARG_(3, func_type) a3, LIBNEWBLUE_ARG_(4, func_type) a4) { \
    return c_name(a1, a2, a3, a4);                                          \
  }

namespace bluetooth {

template <typename F>
struct LibNewblueFunction;

template <typename R>
struct LibNewblueFunction<R()> {
  using Result = R;
};

template <typename R, typename A1>
struct LibNewblueFunction<R(A1)> : LibNewblueFunction<R()> {
  using Argument1 = A1;
};

template <typename R, typename A1, typename A2>
struct LibNewblueFunction<R(A1, A2)> : LibNewblueFunction<R(A1)> {
  using Argument2 = A2;
};

template <typename R, typename A1, typename A2, typename A3>
struct LibNewblueFunction<R(A1, A2, A3)> : LibNewblueFunction<R(A1, A2)> {
  using Argument3 = A3;
};

template <typename R, typename A1, typename A2, typename A3, typename A4>
struct LibNewblueFunction<R(A1, A2, A3, A4)>
    : LibNewblueFunction<R(A1, A2, A3)> {
  using Argument4 = A4;
};

}  // namespace bluetooth

#endif  // BLUETOOTH_NEWBLUED_LIBNEWBLUE_GENERATED_FUNCTION_H_
