$$ 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
$$

$var MAX_ARITY = 6

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Specializations of FunctionTraits<> for Windows specific calling
// conventions.  Please see base/bind_internal.h for more info.

#ifndef BASE_BIND_INTERNAL_WIN_H_
#define BASE_BIND_INTERNAL_WIN_H_
#pragma once

namespace base {
namespace internal {

template <typename Sig>
struct FunctionTraits;

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

// __stdcall Function: Arity $(ARITY).
template <typename R[[]]
$if ARITY > 0[[, ]] $for ARG , [[typename X$(ARG)]]>
struct FunctionTraits<R(__stdcall *)($for ARG , [[X$(ARG)]])> {
  typedef R (*NormalizedSig)($for ARG , [[X$(ARG)]]);
  typedef false_type IsMethod;

$if ARITY > 0 [[

  // Target type for each bound parameter.

$for ARG [[
  typedef X$(ARG) B$(ARG);

]]  $$ for ARG
]]  $$ if ARITY > 0
};

// __fastcall Function: Arity $(ARITY).
template <typename R[[]]
$if ARITY > 0[[, ]] $for ARG , [[typename X$(ARG)]]>
struct FunctionTraits<R(__fastcall *)($for ARG , [[X$(ARG)]])> {
  typedef R (*NormalizedSig)($for ARG , [[X$(ARG)]]);
  typedef false_type IsMethod;

$if ARITY > 0 [[

  // Target type for each bound parameter.

$for ARG [[
  typedef X$(ARG) B$(ARG);

]]  $$ for ARG
]]  $$ if ARITY > 0
};

]]  $$for ARITY

}  // namespace internal
}  // namespace base

#endif  // BASE_BIND_INTERNAL_WIN_H_
