$$ This is a pump file for generating file templates.  Pump is a python
$$ script that is part of the Google Test suite of utilities.  Description
$$ can be found here:
$$
$$ http://code.google.com/p/googletest/wiki/PumpManual
$$

$$ This should be no larger than MAX_ARITY in base/bind.h.pump.
$var MAX_ARITY = 7
/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SCRIPT_CALLBACK_FUNCTION_H_
#define SCRIPT_CALLBACK_FUNCTION_H_

#include "base/callback.h"
#include "base/callback_internal.h"

// Abstract template interface that represents an IDL callback function
// http://heycam.github.io/webidl/#idl-callback-functions
//
// The JavaScript implementation will instantiate a class that implements this
// interface, and will execute JavaScript code when the Run(...) function is
// executed.

namespace cobalt {
namespace script {

template <typename R>
struct CallbackResult {
  CallbackResult() : result(R()), exception(false) {}
  R result;
  bool exception;
};

template <>
struct CallbackResult<void> {
  CallbackResult() : exception(false) {}
  bool exception;
};

// First, we forward declare the CallbackFunction class template. This informs
// the compiler that the template only has 1 type parameter which is the
// function signature that the CallbackFunction is representing.
//
// See base/callback.h.pump for further discussion on this pattern.
template <typename Sig>
class CallbackFunction;


$range ARITY 0..MAX_ARITY
$for ARITY [[
$range ARG 1..ARITY

$if ARITY == 0 [[
template <typename R>
class CallbackFunction<R(void)> {
 public:
  typedef R Signature(void);
]] $else [[
template <typename R, $for ARG , [[typename A$(ARG)]]>
class CallbackFunction<R($for ARG , [[A$(ARG)]])> {
 public:
  typedef R Signature($for ARG , [[A$(ARG)]]);
]]

  typedef CallbackResult<R> ReturnValue;

  virtual CallbackResult<R> Run($for ARG ,[[

      typename base::internal::CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]])
      const = 0;

 protected:
  virtual ~CallbackFunction() {}
};

]]

}  // namespace script
}  // namespace cobalt

#endif  // SCRIPT_CALLBACK_FUNCTION_H_
