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