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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 } | 226 } |
227 | 227 |
228 A a; | 228 A a; |
229 B b; | 229 B b; |
230 C c; | 230 C c; |
231 D d; | 231 D d; |
232 E e; | 232 E e; |
233 F f; | 233 F f; |
234 }; | 234 }; |
235 | 235 |
| 236 template <class A, class B, class C, class D, class E, class F, class G> |
| 237 struct Tuple7 { |
| 238 public: |
| 239 typedef A TypeA; |
| 240 typedef B TypeB; |
| 241 typedef C TypeC; |
| 242 typedef D TypeD; |
| 243 typedef E TypeE; |
| 244 typedef F TypeF; |
| 245 typedef G TypeG; |
| 246 typedef Tuple7<typename TupleTraits<A>::ValueType, |
| 247 typename TupleTraits<B>::ValueType, |
| 248 typename TupleTraits<C>::ValueType, |
| 249 typename TupleTraits<D>::ValueType, |
| 250 typename TupleTraits<E>::ValueType, |
| 251 typename TupleTraits<F>::ValueType, |
| 252 typename TupleTraits<G>::ValueType> ValueTuple; |
| 253 typedef Tuple7<typename TupleTraits<A>::RefType, |
| 254 typename TupleTraits<B>::RefType, |
| 255 typename TupleTraits<C>::RefType, |
| 256 typename TupleTraits<D>::RefType, |
| 257 typename TupleTraits<E>::RefType, |
| 258 typename TupleTraits<F>::RefType, |
| 259 typename TupleTraits<G>::RefType> RefTuple; |
| 260 |
| 261 Tuple7() {} |
| 262 Tuple7(typename TupleTraits<A>::ParamType a, |
| 263 typename TupleTraits<B>::ParamType b, |
| 264 typename TupleTraits<C>::ParamType c, |
| 265 typename TupleTraits<D>::ParamType d, |
| 266 typename TupleTraits<E>::ParamType e, |
| 267 typename TupleTraits<F>::ParamType f, |
| 268 typename TupleTraits<G>::ParamType g) |
| 269 : a(a), b(b), c(c), d(d), e(e), f(f), g(g) { |
| 270 } |
| 271 |
| 272 A a; |
| 273 B b; |
| 274 C c; |
| 275 D d; |
| 276 E e; |
| 277 F f; |
| 278 G g; |
| 279 }; |
| 280 |
236 // Tuple creators ------------------------------------------------------------- | 281 // Tuple creators ------------------------------------------------------------- |
237 // | 282 // |
238 // Helper functions for constructing tuples while inferring the template | 283 // Helper functions for constructing tuples while inferring the template |
239 // argument types. | 284 // argument types. |
240 | 285 |
241 inline Tuple0 MakeTuple() { | 286 inline Tuple0 MakeTuple() { |
242 return Tuple0(); | 287 return Tuple0(); |
243 } | 288 } |
244 | 289 |
245 template <class A> | 290 template <class A> |
(...skipping 22 matching lines...) Expand all Loading... |
268 const D& d, const E& e) { | 313 const D& d, const E& e) { |
269 return Tuple5<A, B, C, D, E>(a, b, c, d, e); | 314 return Tuple5<A, B, C, D, E>(a, b, c, d, e); |
270 } | 315 } |
271 | 316 |
272 template <class A, class B, class C, class D, class E, class F> | 317 template <class A, class B, class C, class D, class E, class F> |
273 inline Tuple6<A, B, C, D, E, F> MakeTuple(const A& a, const B& b, const C& c, | 318 inline Tuple6<A, B, C, D, E, F> MakeTuple(const A& a, const B& b, const C& c, |
274 const D& d, const E& e, const F& f) { | 319 const D& d, const E& e, const F& f) { |
275 return Tuple6<A, B, C, D, E, F>(a, b, c, d, e, f); | 320 return Tuple6<A, B, C, D, E, F>(a, b, c, d, e, f); |
276 } | 321 } |
277 | 322 |
| 323 template <class A, class B, class C, class D, class E, class F, class G> |
| 324 inline Tuple7<A, B, C, D, E, F, G> MakeTuple(const A& a, const B& b, const C& c, |
| 325 const D& d, const E& e, const F& f, |
| 326 const G& g) { |
| 327 return Tuple7<A, B, C, D, E, F, G>(a, b, c, d, e, f, g); |
| 328 } |
| 329 |
278 // The following set of helpers make what Boost refers to as "Tiers" - a tuple | 330 // The following set of helpers make what Boost refers to as "Tiers" - a tuple |
279 // of references. | 331 // of references. |
280 | 332 |
281 template <class A> | 333 template <class A> |
282 inline Tuple1<A&> MakeRefTuple(A& a) { | 334 inline Tuple1<A&> MakeRefTuple(A& a) { |
283 return Tuple1<A&>(a); | 335 return Tuple1<A&>(a); |
284 } | 336 } |
285 | 337 |
286 template <class A, class B> | 338 template <class A, class B> |
287 inline Tuple2<A&, B&> MakeRefTuple(A& a, B& b) { | 339 inline Tuple2<A&, B&> MakeRefTuple(A& a, B& b) { |
(...skipping 14 matching lines...) Expand all Loading... |
302 inline Tuple5<A&, B&, C&, D&, E&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e) { | 354 inline Tuple5<A&, B&, C&, D&, E&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e) { |
303 return Tuple5<A&, B&, C&, D&, E&>(a, b, c, d, e); | 355 return Tuple5<A&, B&, C&, D&, E&>(a, b, c, d, e); |
304 } | 356 } |
305 | 357 |
306 template <class A, class B, class C, class D, class E, class F> | 358 template <class A, class B, class C, class D, class E, class F> |
307 inline Tuple6<A&, B&, C&, D&, E&, F&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e, | 359 inline Tuple6<A&, B&, C&, D&, E&, F&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e, |
308 F& f) { | 360 F& f) { |
309 return Tuple6<A&, B&, C&, D&, E&, F&>(a, b, c, d, e, f); | 361 return Tuple6<A&, B&, C&, D&, E&, F&>(a, b, c, d, e, f); |
310 } | 362 } |
311 | 363 |
| 364 template <class A, class B, class C, class D, class E, class F, class G> |
| 365 inline Tuple7<A&, B&, C&, D&, E&, F&, G&> MakeRefTuple(A& a, B& b, C& c, D& d, |
| 366 E& e, F& f, G& g) { |
| 367 return Tuple7<A&, B&, C&, D&, E&, F&, G&>(a, b, c, d, e, f, g); |
| 368 } |
| 369 |
312 // Dispatchers ---------------------------------------------------------------- | 370 // Dispatchers ---------------------------------------------------------------- |
313 // | 371 // |
314 // Helper functions that call the given method on an object, with the unpacked | 372 // Helper functions that call the given method on an object, with the unpacked |
315 // tuple arguments. Notice that they all have the same number of arguments, | 373 // tuple arguments. Notice that they all have the same number of arguments, |
316 // so you need only write: | 374 // so you need only write: |
317 // DispatchToMethod(object, &Object::method, args); | 375 // DispatchToMethod(object, &Object::method, args); |
318 // This is very useful for templated dispatchers, since they don't need to know | 376 // This is very useful for templated dispatchers, since they don't need to know |
319 // what type |args| is. | 377 // what type |args| is. |
320 | 378 |
321 // Non-Static Dispatchers with no out params. | 379 // Non-Static Dispatchers with no out params. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e); | 416 (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e); |
359 } | 417 } |
360 | 418 |
361 template<class ObjT, class Method, class A, class B, class C, class D, class E, | 419 template<class ObjT, class Method, class A, class B, class C, class D, class E, |
362 class F> | 420 class F> |
363 inline void DispatchToMethod(ObjT* obj, Method method, | 421 inline void DispatchToMethod(ObjT* obj, Method method, |
364 const Tuple6<A, B, C, D, E, F>& arg) { | 422 const Tuple6<A, B, C, D, E, F>& arg) { |
365 (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f); | 423 (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f); |
366 } | 424 } |
367 | 425 |
| 426 template<class ObjT, class Method, class A, class B, class C, class D, class E, |
| 427 class F, class G> |
| 428 inline void DispatchToMethod(ObjT* obj, Method method, |
| 429 const Tuple7<A, B, C, D, E, F, G>& arg) { |
| 430 (obj->*method)(arg.a, arg.b, arg.c, arg.d, arg.e, arg.f, arg.g); |
| 431 } |
| 432 |
368 // Static Dispatchers with no out params. | 433 // Static Dispatchers with no out params. |
369 | 434 |
370 template <class Function> | 435 template <class Function> |
371 inline void DispatchToFunction(Function function, const Tuple0& arg) { | 436 inline void DispatchToFunction(Function function, const Tuple0& arg) { |
372 (*function)(); | 437 (*function)(); |
373 } | 438 } |
374 | 439 |
375 template <class Function, class A> | 440 template <class Function, class A> |
376 inline void DispatchToFunction(Function function, const A& arg) { | 441 inline void DispatchToFunction(Function function, const A& arg) { |
377 (*function)(arg); | 442 (*function)(arg); |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 class OutA, class OutB, class OutC, class OutD, class OutE> | 862 class OutA, class OutB, class OutC, class OutD, class OutE> |
798 inline void DispatchToMethod(ObjT* obj, Method method, | 863 inline void DispatchToMethod(ObjT* obj, Method method, |
799 const Tuple6<InA, InB, InC, InD, InE, InF>& in, | 864 const Tuple6<InA, InB, InC, InD, InE, InF>& in, |
800 Tuple5<OutA, OutB, OutC, OutD, OutE>* out) { | 865 Tuple5<OutA, OutB, OutC, OutD, OutE>* out) { |
801 (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, | 866 (obj->*method)(in.a, in.b, in.c, in.d, in.e, in.f, |
802 &out->a, &out->b, &out->c, &out->d, &out->e); | 867 &out->a, &out->b, &out->c, &out->d, &out->e); |
803 } | 868 } |
804 | 869 |
805 #endif // BASE_TUPLE_H__ | 870 #endif // BASE_TUPLE_H__ |
806 | 871 |
OLD | NEW |