$$ 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. #ifndef BASE_BIND_H_ #define BASE_BIND_H_ #pragma once #include "base/bind_internal.h" #include "base/callback_internal.h" // See base/callback.h for how to use these functions. // // IMPLEMENTATION NOTE // Though Bind()'s result is meant to be stored in a Callback<> type, it // cannot actually return the exact type without requiring a large amount // of extra template specializations. The problem is that in order to // discern the correct specialization of Callback<>, Bind would need to // unwrap the function signature to determine the signature's arity, and // whether or not it is a method. // // Each unique combination of (arity, function_type, num_prebound) where // function_type is one of {function, method, const_method} would require // one specialization. We eventually have to do a similar number of // specializations anyways in the implementation (see the FunctionTraitsN, // classes). However, it is avoidable in Bind if we return the result // via an indirection like we do below. namespace base { $range BOUND 0..MAX_ARITY $for BOUND [[ $range BOUND_ARG 1..BOUND $if BOUND == 0 [[ template <typename Sig> internal::InvokerStorageHolder<internal::InvokerStorage0<Sig> > Bind(Sig f) { return internal::MakeInvokerStorageHolder( new internal::InvokerStorage0<Sig>(f)); } ]] $else [[ template <typename Sig, $for BOUND_ARG , [[typename P$(BOUND_ARG)]]> internal::InvokerStorageHolder<internal::InvokerStorage$(BOUND)<Sig, $for BOUND_ARG , [[P$(BOUND_ARG)]]> > Bind(Sig f, $for BOUND_ARG , [[const P$(BOUND_ARG)& p$(BOUND_ARG)]]) { return internal::MakeInvokerStorageHolder( new internal::InvokerStorage$(BOUND)<Sig, [[]] $for BOUND_ARG , [[P$(BOUND_ARG)]]>( f, $for BOUND_ARG , [[p$(BOUND_ARG)]])); } ]] ]] $$ for BOUND } // namespace base #endif // BASE_BIND_H_