172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$ This is a pump file for generating file templates.  Pump is a python
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$ script that is part of the Google Test suite of utilities.  Description
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$ can be found here:
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$ http://code.google.com/p/googletest/wiki/PumpManual
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$$
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$var MAX_ARITY = 6
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef BASE_BIND_H_
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define BASE_BIND_H_
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#pragma once
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/bind_internal.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/callback_internal.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// See base/callback.h for how to use these functions.
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// IMPLEMENTATION NOTE
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Though Bind()'s result is meant to be stored in a Callback<> type, it
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// cannot actually return the exact type without requiring a large amount
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// of extra template specializations. The problem is that in order to
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// discern the correct specialization of Callback<>, Bind would need to
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// unwrap the function signature to determine the signature's arity, and
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// whether or not it is a method.
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Each unique combination of (arity, function_type, num_prebound) where
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// function_type is one of {function, method, const_method} would require
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// one specialization.  We eventually have to do a similar number of
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// specializations anyways in the implementation (see the FunctionTraitsN,
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// classes).  However, it is avoidable in Bind if we return the result
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// via an indirection like we do below.
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base {
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$range BOUND 0..MAX_ARITY
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$for BOUND [[
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$range BOUND_ARG 1..BOUND
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$if BOUND == 0 [[
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename Sig>
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monseninternal::InvokerStorageHolder<internal::InvokerStorage0<Sig> >
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBind(Sig f) {
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return internal::MakeInvokerStorageHolder(
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new internal::InvokerStorage0<Sig>(f));
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen]] $else [[
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename Sig, $for BOUND_ARG , [[typename P$(BOUND_ARG)]]>
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monseninternal::InvokerStorageHolder<internal::InvokerStorage$(BOUND)<Sig,
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$for BOUND_ARG , [[P$(BOUND_ARG)]]> >
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBind(Sig f, $for BOUND_ARG , [[const P$(BOUND_ARG)& p$(BOUND_ARG)]]) {
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return internal::MakeInvokerStorageHolder(
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new internal::InvokerStorage$(BOUND)<Sig, [[]]
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen$for BOUND_ARG , [[P$(BOUND_ARG)]]>(
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          f, $for BOUND_ARG , [[p$(BOUND_ARG)]]));
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen]]
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen]]  $$ for BOUND
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace base
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // BASE_BIND_H_
72