Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Side by Side Diff: base/bind_internal.h.pump

Issue 8344065: Reverting as an experiment to determine if this caused increased Win build (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/bind_internal.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 $$ This is a pump file for generating file templates. Pump is a python 1 $$ This is a pump file for generating file templates. Pump is a python
2 $$ script that is part of the Google Test suite of utilities. Description 2 $$ script that is part of the Google Test suite of utilities. Description
3 $$ can be found here: 3 $$ can be found here:
4 $$ 4 $$
5 $$ http://code.google.com/p/googletest/wiki/PumpManual 5 $$ http://code.google.com/p/googletest/wiki/PumpManual
6 $$ 6 $$
7 7
8 $var MAX_ARITY = 7 8 $var MAX_ARITY = 6
9 9
10 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 10 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
11 // Use of this source code is governed by a BSD-style license that can be 11 // Use of this source code is governed by a BSD-style license that can be
12 // found in the LICENSE file. 12 // found in the LICENSE file.
13 13
14 #ifndef BASE_BIND_INTERNAL_H_ 14 #ifndef BASE_BIND_INTERNAL_H_
15 #define BASE_BIND_INTERNAL_H_ 15 #define BASE_BIND_INTERNAL_H_
16 #pragma once 16 #pragma once
17 17
18 #include "base/bind_helpers.h" 18 #include "base/bind_helpers.h"
(...skipping 13 matching lines...) Expand all
32 // The method by which a function is invoked is determined by 3 different 32 // The method by which a function is invoked is determined by 3 different
33 // dimensions: 33 // dimensions:
34 // 34 //
35 // 1) The type of function (normal or method). 35 // 1) The type of function (normal or method).
36 // 2) The arity of the function. 36 // 2) The arity of the function.
37 // 3) The number of bound parameters. 37 // 3) The number of bound parameters.
38 // 38 //
39 // The templates below handle the determination of each of these dimensions. 39 // The templates below handle the determination of each of these dimensions.
40 // In brief: 40 // In brief:
41 // 41 //
42 // FunctionTraits<> -- Provides a normalized signature, and other traits. 42 // FunctionTraits<> -- Provides a normalied signature, and other traits.
43 // InvokerN<> -- Provides a DoInvoke() function that actually executes 43 // InvokerN<> -- Provides a DoInvoke() function that actually executes
44 // a callback. 44 // a calback.
45 // InvokerStorageN<> -- Provides storage for the bound parameters, and 45 // InvokerStorageN<> -- Provides storage for the bound parameters, and
46 // typedefs to the above. 46 // typedefs to the above.
47 // IsWeakMethod<> -- Determines if we are binding a method to a WeakPtr<>. 47 // IsWeakMethod<> -- Determines if we are binding a method to a WeakPtr<>.
48 // 48 //
49 // More details about the design of each class is included in a comment closer 49 // More details about the design of each class is included in a comment closer
50 // to their definition. 50 // to their defition.
51 51
52 52
53 // IsWeakMethod determines if we are binding a method to a WeakPtr<> for an 53 // IsWeakMethod determines if we are binding a method to a WeakPtr<> for an
54 // object. It is used to select an InvokerN that will no-op itself in the 54 // object. It is used to select an InvokerN that will no-op itself in the
55 // event the WeakPtr<> for the target object is invalidated. 55 // event the WeakPtr<> for the target object is invalidated.
56 template <bool IsMethod, typename T> 56 template <bool IsMethod, typename T>
57 struct IsWeakMethod : public false_type {}; 57 struct IsWeakMethod : public false_type {};
58 58
59 template <typename T> 59 template <typename T>
60 struct IsWeakMethod<true, WeakPtr<T> > : public true_type {}; 60 struct IsWeakMethod<true, WeakPtr<T> > : public true_type {};
61 61
62 // FunctionTraits<> 62 // FunctionTraits<>
63 // 63 //
64 // The FunctionTraits<> template determines the type of function, and also 64 // The FunctionTraits<> template determines the type of function, and also
65 // creates a NormalizedType used to select the InvokerN classes. It turns out 65 // creates a NormalizedType used to select the InvokerN classes. It turns out
66 // that syntactically, you only really have 2 variations when invoking a 66 // that syntactically, you only really have 2 variations when invoking a
67 // function pointer: normal, and method. One is invoked func_ptr(arg1). The 67 // funciton pointer: normal, and method. One is invoked func_ptr(arg1). The
68 // other is invoked (*obj_->method_ptr(arg1)). 68 // other is invoked (*obj_->method_ptr(arg1)).
69 // 69 //
70 // However, in the type system, there are many more distinctions. In standard 70 // However, in the type system, there are many more distinctions. In standard
71 // C++, there's all variations of const, and volatile on the function pointer. 71 // C++, there's all variations of const, and volatile on the function pointer.
72 // In Windows, there are additional calling conventions (eg., __stdcall, 72 // In Windows, there are additional calling conventions (eg., __stdcall,
73 // __fastcall, etc.). FunctionTraits<> handles categorizing each of these into 73 // __fastcall, etc.). FunctionTraits<> handles categorizing each of these into
74 // a normalized signature. 74 // a normalized signature.
75 // 75 //
76 // Having a NormalizedSignature signature, reduces the combinatoric 76 // Having a NormalizedSignature signature, reduces the combinatoric
77 // complexity of definitions for the InvokerN<> later. Even though there are 77 // complexity of defintions for the InvokerN<> later. Even though there are
78 // only 2 syntactic variations on invoking a function, without normalizing the 78 // only 2 syntactic variations on invoking a function, without normalizing the
79 // signature, there would need to be one specialization of InvokerN for each 79 // signature, there would need to be one specialization of InvokerN for each
80 // unique (function_type, bound_arg, unbound_args) tuple in order to match all 80 // unique (function_type, bound_arg, unbound_args) tuple in order to match all
81 // function signatures. 81 // function signatures.
82 // 82 //
83 // By normalizing the function signature, we reduce function_type to exactly 2. 83 // By normalizing the function signature, we reduce function_type to exactly 2.
84 84
85 template <typename Sig> 85 template <typename Sig>
86 struct FunctionTraits; 86 struct FunctionTraits;
87 87
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 150
151 ]] $$for ARITY 151 ]] $$for ARITY
152 152
153 // InvokerN<> 153 // InvokerN<>
154 // 154 //
155 // The InvokerN templates contain a static DoInvoke() function that is the key 155 // The InvokerN templates contain a static DoInvoke() function that is the key
156 // to implementing type erasure in the Callback() classes. 156 // to implementing type erasure in the Callback() classes.
157 // 157 //
158 // DoInvoke() is a static function with a fixed signature that is independent 158 // DoInvoke() is a static function with a fixed signature that is independent
159 // of StorageType; its first argument is a pointer to the non-templated common 159 // of StorageType; its first argument is a pointer to the non-templated common
160 // base class of StorageType. This lets us store pointer to DoInvoke() in a 160 // baseclass of StorageType. This lets us store pointer to DoInvoke() in a
161 // function pointer that has knowledge of the specific StorageType, and thus 161 // function pointer that has knowledge of the specific StorageType, and thus
162 // no knowledge of the bound function and bound parameter types. 162 // no knowledge of the bound function and bound parameter types.
163 // 163 //
164 // As long as we ensure that DoInvoke() is only used with pointers there were 164 // As long as we ensure that DoInvoke() is only used with pointers there were
165 // up-casted from the correct StorageType, we can be sure that execution is 165 // upcasted from the correct StorageType, we can be sure that execution is
166 // safe. 166 // safe.
167 // 167 //
168 // The InvokerN templates are the only point that knows the number of bound 168 // The InvokerN templates are the only point that knows the number of bound
169 // and unbound arguments. This is intentional because it allows the other 169 // and unbound arguments. This is intentional because it allows the other
170 // templates classes in the system to only have as many specializations as 170 // templates classes in the system to only have as many specializations as
171 // the max arity of function we wish to support. 171 // the max arity of function we wish to support.
172 172
173 $range BOUND 0..MAX_ARITY 173 $range BOUND 0..MAX_ARITY
174 $for BOUND [[ 174 $for BOUND [[
175 175
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 392
393 ]] 393 ]]
394 }; 394 };
395 395
396 ]] $$ for BOUND 396 ]] $$ for BOUND
397 397
398 } // namespace internal 398 } // namespace internal
399 } // namespace base 399 } // namespace base
400 400
401 #endif // BASE_BIND_INTERNAL_H_ 401 #endif // BASE_BIND_INTERNAL_H_
OLDNEW
« no previous file with comments | « base/bind_internal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698