| Index: base/bind.h.pump
|
| diff --git a/base/bind.h.pump b/base/bind.h.pump
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fc7f2466aa3d158e8d74c4bb090bc5aa1de79629
|
| --- /dev/null
|
| +++ b/base/bind.h.pump
|
| @@ -0,0 +1,71 @@
|
| +$$ 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_helpers.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_
|
|
|