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