OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // A Tuple is a generic templatized container, similar in concept to std::pair. | 5 // A Tuple is a generic templatized container, similar in concept to std::pair. |
6 // There are classes Tuple0 to Tuple6, cooresponding to the number of elements | 6 // There are classes Tuple0 to Tuple6, cooresponding to the number of elements |
7 // it contains. The convenient MakeTuple() function takes 0 to 6 arguments, | 7 // it contains. The convenient MakeTuple() function takes 0 to 6 arguments, |
8 // and will construct and return the appropriate Tuple object. The functions | 8 // and will construct and return the appropriate Tuple object. The functions |
9 // DispatchToMethod and DispatchToFunction take a function pointer or instance | 9 // DispatchToMethod and DispatchToFunction take a function pointer or instance |
10 // and method pointer, and unpack a tuple into arguments to the call. | 10 // and method pointer, and unpack a tuple into arguments to the call. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 // Tuple0 is supplied to act as a 'void' type. It can be used, for example, | 61 // Tuple0 is supplied to act as a 'void' type. It can be used, for example, |
62 // when dispatching to a function that accepts no arguments (see the | 62 // when dispatching to a function that accepts no arguments (see the |
63 // Dispatchers below). | 63 // Dispatchers below). |
64 // Tuple1<A> is rarely useful. One such use is when A is non-const ref that you | 64 // Tuple1<A> is rarely useful. One such use is when A is non-const ref that you |
65 // want filled by the dispatchee, and the tuple is merely a container for that | 65 // want filled by the dispatchee, and the tuple is merely a container for that |
66 // output (a "tier"). See MakeRefTuple and its usages. | 66 // output (a "tier"). See MakeRefTuple and its usages. |
67 | 67 |
68 struct Tuple0 { | 68 struct Tuple0 { |
69 typedef Tuple0 ValueTuple; | 69 typedef Tuple0 ValueTuple; |
70 typedef Tuple0 RefTuple; | 70 typedef Tuple0 RefTuple; |
| 71 typedef Tuple0 ParamTuple; |
71 }; | 72 }; |
72 | 73 |
73 template <class A> | 74 template <class A> |
74 struct Tuple1 { | 75 struct Tuple1 { |
75 public: | 76 public: |
76 typedef A TypeA; | 77 typedef A TypeA; |
77 typedef Tuple1<typename TupleTraits<A>::ValueType> ValueTuple; | 78 typedef Tuple1<typename TupleTraits<A>::ValueType> ValueTuple; |
78 typedef Tuple1<typename TupleTraits<A>::RefType> RefTuple; | 79 typedef Tuple1<typename TupleTraits<A>::RefType> RefTuple; |
| 80 typedef Tuple1<typename TupleTraits<A>::ParamType> ParamTuple; |
79 | 81 |
80 Tuple1() {} | 82 Tuple1() {} |
81 explicit Tuple1(typename TupleTraits<A>::ParamType a) : a(a) {} | 83 explicit Tuple1(typename TupleTraits<A>::ParamType a) : a(a) {} |
82 | 84 |
83 A a; | 85 A a; |
84 }; | 86 }; |
85 | 87 |
86 template <class A, class B> | 88 template <class A, class B> |
87 struct Tuple2 { | 89 struct Tuple2 { |
88 public: | 90 public: |
89 typedef A TypeA; | 91 typedef A TypeA; |
90 typedef B TypeB; | 92 typedef B TypeB; |
91 typedef Tuple2<typename TupleTraits<A>::ValueType, | 93 typedef Tuple2<typename TupleTraits<A>::ValueType, |
92 typename TupleTraits<B>::ValueType> ValueTuple; | 94 typename TupleTraits<B>::ValueType> ValueTuple; |
93 typedef Tuple2<typename TupleTraits<A>::RefType, | 95 typedef Tuple2<typename TupleTraits<A>::RefType, |
94 typename TupleTraits<B>::RefType> RefTuple; | 96 typename TupleTraits<B>::RefType> RefTuple; |
| 97 typedef Tuple2<typename TupleTraits<A>::ParamType, |
| 98 typename TupleTraits<B>::ParamType> ParamTuple; |
95 | 99 |
96 Tuple2() {} | 100 Tuple2() {} |
97 Tuple2(typename TupleTraits<A>::ParamType a, | 101 Tuple2(typename TupleTraits<A>::ParamType a, |
98 typename TupleTraits<B>::ParamType b) | 102 typename TupleTraits<B>::ParamType b) |
99 : a(a), b(b) { | 103 : a(a), b(b) { |
100 } | 104 } |
101 | 105 |
102 A a; | 106 A a; |
103 B b; | 107 B b; |
104 }; | 108 }; |
105 | 109 |
106 template <class A, class B, class C> | 110 template <class A, class B, class C> |
107 struct Tuple3 { | 111 struct Tuple3 { |
108 public: | 112 public: |
109 typedef A TypeA; | 113 typedef A TypeA; |
110 typedef B TypeB; | 114 typedef B TypeB; |
111 typedef C TypeC; | 115 typedef C TypeC; |
112 typedef Tuple3<typename TupleTraits<A>::ValueType, | 116 typedef Tuple3<typename TupleTraits<A>::ValueType, |
113 typename TupleTraits<B>::ValueType, | 117 typename TupleTraits<B>::ValueType, |
114 typename TupleTraits<C>::ValueType> ValueTuple; | 118 typename TupleTraits<C>::ValueType> ValueTuple; |
115 typedef Tuple3<typename TupleTraits<A>::RefType, | 119 typedef Tuple3<typename TupleTraits<A>::RefType, |
116 typename TupleTraits<B>::RefType, | 120 typename TupleTraits<B>::RefType, |
117 typename TupleTraits<C>::RefType> RefTuple; | 121 typename TupleTraits<C>::RefType> RefTuple; |
| 122 typedef Tuple3<typename TupleTraits<A>::ParamType, |
| 123 typename TupleTraits<B>::ParamType, |
| 124 typename TupleTraits<C>::ParamType> ParamTuple; |
118 | 125 |
119 Tuple3() {} | 126 Tuple3() {} |
120 Tuple3(typename TupleTraits<A>::ParamType a, | 127 Tuple3(typename TupleTraits<A>::ParamType a, |
121 typename TupleTraits<B>::ParamType b, | 128 typename TupleTraits<B>::ParamType b, |
122 typename TupleTraits<C>::ParamType c) | 129 typename TupleTraits<C>::ParamType c) |
123 : a(a), b(b), c(c){ | 130 : a(a), b(b), c(c){ |
124 } | 131 } |
125 | 132 |
126 A a; | 133 A a; |
127 B b; | 134 B b; |
128 C c; | 135 C c; |
129 }; | 136 }; |
130 | 137 |
131 template <class A, class B, class C, class D> | 138 template <class A, class B, class C, class D> |
132 struct Tuple4 { | 139 struct Tuple4 { |
133 public: | 140 public: |
134 typedef A TypeA; | 141 typedef A TypeA; |
135 typedef B TypeB; | 142 typedef B TypeB; |
136 typedef C TypeC; | 143 typedef C TypeC; |
137 typedef D TypeD; | 144 typedef D TypeD; |
138 typedef Tuple4<typename TupleTraits<A>::ValueType, | 145 typedef Tuple4<typename TupleTraits<A>::ValueType, |
139 typename TupleTraits<B>::ValueType, | 146 typename TupleTraits<B>::ValueType, |
140 typename TupleTraits<C>::ValueType, | 147 typename TupleTraits<C>::ValueType, |
141 typename TupleTraits<D>::ValueType> ValueTuple; | 148 typename TupleTraits<D>::ValueType> ValueTuple; |
142 typedef Tuple4<typename TupleTraits<A>::RefType, | 149 typedef Tuple4<typename TupleTraits<A>::RefType, |
143 typename TupleTraits<B>::RefType, | 150 typename TupleTraits<B>::RefType, |
144 typename TupleTraits<C>::RefType, | 151 typename TupleTraits<C>::RefType, |
145 typename TupleTraits<D>::RefType> RefTuple; | 152 typename TupleTraits<D>::RefType> RefTuple; |
| 153 typedef Tuple4<typename TupleTraits<A>::ParamType, |
| 154 typename TupleTraits<B>::ParamType, |
| 155 typename TupleTraits<C>::ParamType, |
| 156 typename TupleTraits<D>::ParamType> ParamTuple; |
146 | 157 |
147 Tuple4() {} | 158 Tuple4() {} |
148 Tuple4(typename TupleTraits<A>::ParamType a, | 159 Tuple4(typename TupleTraits<A>::ParamType a, |
149 typename TupleTraits<B>::ParamType b, | 160 typename TupleTraits<B>::ParamType b, |
150 typename TupleTraits<C>::ParamType c, | 161 typename TupleTraits<C>::ParamType c, |
151 typename TupleTraits<D>::ParamType d) | 162 typename TupleTraits<D>::ParamType d) |
152 : a(a), b(b), c(c), d(d) { | 163 : a(a), b(b), c(c), d(d) { |
153 } | 164 } |
154 | 165 |
155 A a; | 166 A a; |
(...skipping 13 matching lines...) Expand all Loading... |
169 typedef Tuple5<typename TupleTraits<A>::ValueType, | 180 typedef Tuple5<typename TupleTraits<A>::ValueType, |
170 typename TupleTraits<B>::ValueType, | 181 typename TupleTraits<B>::ValueType, |
171 typename TupleTraits<C>::ValueType, | 182 typename TupleTraits<C>::ValueType, |
172 typename TupleTraits<D>::ValueType, | 183 typename TupleTraits<D>::ValueType, |
173 typename TupleTraits<E>::ValueType> ValueTuple; | 184 typename TupleTraits<E>::ValueType> ValueTuple; |
174 typedef Tuple5<typename TupleTraits<A>::RefType, | 185 typedef Tuple5<typename TupleTraits<A>::RefType, |
175 typename TupleTraits<B>::RefType, | 186 typename TupleTraits<B>::RefType, |
176 typename TupleTraits<C>::RefType, | 187 typename TupleTraits<C>::RefType, |
177 typename TupleTraits<D>::RefType, | 188 typename TupleTraits<D>::RefType, |
178 typename TupleTraits<E>::RefType> RefTuple; | 189 typename TupleTraits<E>::RefType> RefTuple; |
| 190 typedef Tuple5<typename TupleTraits<A>::ParamType, |
| 191 typename TupleTraits<B>::ParamType, |
| 192 typename TupleTraits<C>::ParamType, |
| 193 typename TupleTraits<D>::ParamType, |
| 194 typename TupleTraits<E>::ParamType> ParamTuple; |
179 | 195 |
180 Tuple5() {} | 196 Tuple5() {} |
181 Tuple5(typename TupleTraits<A>::ParamType a, | 197 Tuple5(typename TupleTraits<A>::ParamType a, |
182 typename TupleTraits<B>::ParamType b, | 198 typename TupleTraits<B>::ParamType b, |
183 typename TupleTraits<C>::ParamType c, | 199 typename TupleTraits<C>::ParamType c, |
184 typename TupleTraits<D>::ParamType d, | 200 typename TupleTraits<D>::ParamType d, |
185 typename TupleTraits<E>::ParamType e) | 201 typename TupleTraits<E>::ParamType e) |
186 : a(a), b(b), c(c), d(d), e(e) { | 202 : a(a), b(b), c(c), d(d), e(e) { |
187 } | 203 } |
188 | 204 |
(...skipping 18 matching lines...) Expand all Loading... |
207 typename TupleTraits<C>::ValueType, | 223 typename TupleTraits<C>::ValueType, |
208 typename TupleTraits<D>::ValueType, | 224 typename TupleTraits<D>::ValueType, |
209 typename TupleTraits<E>::ValueType, | 225 typename TupleTraits<E>::ValueType, |
210 typename TupleTraits<F>::ValueType> ValueTuple; | 226 typename TupleTraits<F>::ValueType> ValueTuple; |
211 typedef Tuple6<typename TupleTraits<A>::RefType, | 227 typedef Tuple6<typename TupleTraits<A>::RefType, |
212 typename TupleTraits<B>::RefType, | 228 typename TupleTraits<B>::RefType, |
213 typename TupleTraits<C>::RefType, | 229 typename TupleTraits<C>::RefType, |
214 typename TupleTraits<D>::RefType, | 230 typename TupleTraits<D>::RefType, |
215 typename TupleTraits<E>::RefType, | 231 typename TupleTraits<E>::RefType, |
216 typename TupleTraits<F>::RefType> RefTuple; | 232 typename TupleTraits<F>::RefType> RefTuple; |
| 233 typedef Tuple6<typename TupleTraits<A>::ParamType, |
| 234 typename TupleTraits<B>::ParamType, |
| 235 typename TupleTraits<C>::ParamType, |
| 236 typename TupleTraits<D>::ParamType, |
| 237 typename TupleTraits<E>::ParamType, |
| 238 typename TupleTraits<F>::ParamType> ParamTuple; |
217 | 239 |
218 Tuple6() {} | 240 Tuple6() {} |
219 Tuple6(typename TupleTraits<A>::ParamType a, | 241 Tuple6(typename TupleTraits<A>::ParamType a, |
220 typename TupleTraits<B>::ParamType b, | 242 typename TupleTraits<B>::ParamType b, |
221 typename TupleTraits<C>::ParamType c, | 243 typename TupleTraits<C>::ParamType c, |
222 typename TupleTraits<D>::ParamType d, | 244 typename TupleTraits<D>::ParamType d, |
223 typename TupleTraits<E>::ParamType e, | 245 typename TupleTraits<E>::ParamType e, |
224 typename TupleTraits<F>::ParamType f) | 246 typename TupleTraits<F>::ParamType f) |
225 : a(a), b(b), c(c), d(d), e(e), f(f) { | 247 : a(a), b(b), c(c), d(d), e(e), f(f) { |
226 } | 248 } |
(...skipping 23 matching lines...) Expand all Loading... |
250 typename TupleTraits<E>::ValueType, | 272 typename TupleTraits<E>::ValueType, |
251 typename TupleTraits<F>::ValueType, | 273 typename TupleTraits<F>::ValueType, |
252 typename TupleTraits<G>::ValueType> ValueTuple; | 274 typename TupleTraits<G>::ValueType> ValueTuple; |
253 typedef Tuple7<typename TupleTraits<A>::RefType, | 275 typedef Tuple7<typename TupleTraits<A>::RefType, |
254 typename TupleTraits<B>::RefType, | 276 typename TupleTraits<B>::RefType, |
255 typename TupleTraits<C>::RefType, | 277 typename TupleTraits<C>::RefType, |
256 typename TupleTraits<D>::RefType, | 278 typename TupleTraits<D>::RefType, |
257 typename TupleTraits<E>::RefType, | 279 typename TupleTraits<E>::RefType, |
258 typename TupleTraits<F>::RefType, | 280 typename TupleTraits<F>::RefType, |
259 typename TupleTraits<G>::RefType> RefTuple; | 281 typename TupleTraits<G>::RefType> RefTuple; |
| 282 typedef Tuple7<typename TupleTraits<A>::ParamType, |
| 283 typename TupleTraits<B>::ParamType, |
| 284 typename TupleTraits<C>::ParamType, |
| 285 typename TupleTraits<D>::ParamType, |
| 286 typename TupleTraits<E>::ParamType, |
| 287 typename TupleTraits<F>::ParamType, |
| 288 typename TupleTraits<G>::ParamType> ParamTuple; |
260 | 289 |
261 Tuple7() {} | 290 Tuple7() {} |
262 Tuple7(typename TupleTraits<A>::ParamType a, | 291 Tuple7(typename TupleTraits<A>::ParamType a, |
263 typename TupleTraits<B>::ParamType b, | 292 typename TupleTraits<B>::ParamType b, |
264 typename TupleTraits<C>::ParamType c, | 293 typename TupleTraits<C>::ParamType c, |
265 typename TupleTraits<D>::ParamType d, | 294 typename TupleTraits<D>::ParamType d, |
266 typename TupleTraits<E>::ParamType e, | 295 typename TupleTraits<E>::ParamType e, |
267 typename TupleTraits<F>::ParamType f, | 296 typename TupleTraits<F>::ParamType f, |
268 typename TupleTraits<G>::ParamType g) | 297 typename TupleTraits<G>::ParamType g) |
269 : a(a), b(b), c(c), d(d), e(e), f(f), g(g) { | 298 : a(a), b(b), c(c), d(d), e(e), f(f), g(g) { |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 class InA, class InB, class InC, class InD, class InE, class InF, | 898 class InA, class InB, class InC, class InD, class InE, class InF, |
870 class OutA, class OutB, class OutC, class OutD, class OutE> | 899 class OutA, class OutB, class OutC, class OutD, class OutE> |
871 inline void DispatchToMethod(ObjT* obj, Method method, | 900 inline void DispatchToMethod(ObjT* obj, Method method, |
872 const Tuple6<InA, InB, InC, InD, InE, InF>& in, | 901 const Tuple6<InA, InB, InC, InD, InE, InF>& in, |
873 Tuple5<OutA, OutB, OutC, OutD, OutE>* out) { | 902 Tuple5<OutA, OutB, OutC, OutD, OutE>* out) { |
874 (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, | 903 (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, |
875 &out->a, &out->b, &out->c, &out->d, &out->e); | 904 &out->a, &out->b, &out->c, &out->d, &out->e); |
876 } | 905 } |
877 | 906 |
878 #endif // BASE_TUPLE_H__ | 907 #endif // BASE_TUPLE_H__ |
OLD | NEW |