OLD | NEW |
1 #ifndef GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ | 1 #ifndef GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ |
2 #define GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ | 2 #define GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ |
3 | 3 |
4 #include <google/protobuf/stubs/macros.h> | 4 #include <google/protobuf/stubs/macros.h> |
5 #include <google/protobuf/stubs/type_traits.h> | 5 #include <google/protobuf/stubs/type_traits.h> |
6 | 6 |
7 // =================================================================== | 7 // =================================================================== |
8 // emulates google3/base/callback.h | 8 // emulates google3/base/callback.h |
9 | 9 |
10 namespace google { | 10 namespace google { |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 bool self_deleting_; | 339 bool self_deleting_; |
340 P1 p1_; | 340 P1 p1_; |
341 }; | 341 }; |
342 | 342 |
343 template <typename T> | 343 template <typename T> |
344 struct InternalConstRef { | 344 struct InternalConstRef { |
345 typedef typename remove_reference<T>::type base_type; | 345 typedef typename remove_reference<T>::type base_type; |
346 typedef const base_type& type; | 346 typedef const base_type& type; |
347 }; | 347 }; |
348 | 348 |
349 template<typename R, typename T> | |
350 class MethodResultCallback_0_0 : public ResultCallback<R> { | |
351 public: | |
352 typedef R (T::*MethodType)(); | |
353 MethodResultCallback_0_0(T* object, MethodType method, bool self_deleting) | |
354 : object_(object), | |
355 method_(method), | |
356 self_deleting_(self_deleting) {} | |
357 ~MethodResultCallback_0_0() {} | |
358 | |
359 R Run() { | |
360 bool needs_delete = self_deleting_; | |
361 R result = (object_->*method_)(); | |
362 if (needs_delete) delete this; | |
363 return result; | |
364 } | |
365 | |
366 private: | |
367 T* object_; | |
368 MethodType method_; | |
369 bool self_deleting_; | |
370 }; | |
371 | |
372 template <typename R, typename T, typename P1, typename P2, typename P3, | 349 template <typename R, typename T, typename P1, typename P2, typename P3, |
373 typename P4, typename P5, typename A1, typename A2> | 350 typename P4, typename P5, typename A1, typename A2> |
374 class MethodResultCallback_5_2 : public ResultCallback2<R, A1, A2> { | 351 class MethodResultCallback_5_2 : public ResultCallback2<R, A1, A2> { |
375 public: | 352 public: |
376 typedef R (T::*MethodType)(P1, P2, P3, P4, P5, A1, A2); | 353 typedef R (T::*MethodType)(P1, P2, P3, P4, P5, A1, A2); |
377 MethodResultCallback_5_2(T* object, MethodType method, bool self_deleting, | 354 MethodResultCallback_5_2(T* object, MethodType method, bool self_deleting, |
378 P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) | 355 P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) |
379 : object_(object), | 356 : object_(object), |
380 method_(method), | 357 method_(method), |
381 self_deleting_(self_deleting), | 358 self_deleting_(self_deleting), |
(...skipping 15 matching lines...) Expand all Loading... |
397 T* object_; | 374 T* object_; |
398 MethodType method_; | 375 MethodType method_; |
399 bool self_deleting_; | 376 bool self_deleting_; |
400 typename remove_reference<P1>::type p1_; | 377 typename remove_reference<P1>::type p1_; |
401 typename remove_reference<P2>::type p2_; | 378 typename remove_reference<P2>::type p2_; |
402 typename remove_reference<P3>::type p3_; | 379 typename remove_reference<P3>::type p3_; |
403 typename remove_reference<P4>::type p4_; | 380 typename remove_reference<P4>::type p4_; |
404 typename remove_reference<P5>::type p5_; | 381 typename remove_reference<P5>::type p5_; |
405 }; | 382 }; |
406 | 383 |
407 } // namespace internal | |
408 | |
409 // See Closure. | 384 // See Closure. |
410 inline Closure* NewCallback(void (*function)()) { | 385 inline Closure* NewCallback(void (*function)()) { |
411 return new internal::FunctionClosure0(function, true); | 386 return new internal::FunctionClosure0(function, true); |
412 } | 387 } |
413 | 388 |
414 // See Closure. | 389 // See Closure. |
415 inline Closure* NewPermanentCallback(void (*function)()) { | 390 inline Closure* NewPermanentCallback(void (*function)()) { |
416 return new internal::FunctionClosure0(function, false); | 391 return new internal::FunctionClosure0(function, false); |
417 } | 392 } |
418 | 393 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 } | 511 } |
537 | 512 |
538 // See ResultCallback1 | 513 // See ResultCallback1 |
539 template<typename R, typename P1, typename A1> | 514 template<typename R, typename P1, typename A1> |
540 inline ResultCallback1<R, A1>* NewPermanentCallback( | 515 inline ResultCallback1<R, A1>* NewPermanentCallback( |
541 R (*function)(P1, A1), P1 p1) { | 516 R (*function)(P1, A1), P1 p1) { |
542 return new internal::FunctionResultCallback_1_1<R, P1, A1>( | 517 return new internal::FunctionResultCallback_1_1<R, P1, A1>( |
543 function, false, p1); | 518 function, false, p1); |
544 } | 519 } |
545 | 520 |
546 // See MethodResultCallback_0_0 | |
547 template <typename R, typename T1, typename T2> | |
548 inline ResultCallback<R>* NewPermanentCallback( | |
549 T1* object, R (T2::*function)()) { | |
550 return new internal::MethodResultCallback_0_0<R, T1>(object, function, false); | |
551 } | |
552 | |
553 // See MethodResultCallback_5_2 | 521 // See MethodResultCallback_5_2 |
554 template <typename R, typename T, typename P1, typename P2, typename P3, | 522 template <typename R, typename T, typename P1, typename P2, typename P3, |
555 typename P4, typename P5, typename A1, typename A2> | 523 typename P4, typename P5, typename A1, typename A2> |
556 inline ResultCallback2<R, A1, A2>* NewPermanentCallback( | 524 inline ResultCallback2<R, A1, A2>* NewPermanentCallback( |
557 T* object, R (T::*function)(P1, P2, P3, P4, P5, A1, A2), | 525 T* object, R (T::*function)(P1, P2, P3, P4, P5, A1, A2), |
558 typename internal::InternalConstRef<P1>::type p1, | 526 typename internal::InternalConstRef<P1>::type p1, |
559 typename internal::InternalConstRef<P2>::type p2, | 527 typename internal::InternalConstRef<P2>::type p2, |
560 typename internal::InternalConstRef<P3>::type p3, | 528 typename internal::InternalConstRef<P3>::type p3, |
561 typename internal::InternalConstRef<P4>::type p4, | 529 typename internal::InternalConstRef<P4>::type p4, |
562 typename internal::InternalConstRef<P5>::type p5) { | 530 typename internal::InternalConstRef<P5>::type p5) { |
563 return new internal::MethodResultCallback_5_2<R, T, P1, P2, P3, P4, P5, A1, | 531 return new internal::MethodResultCallback_5_2<R, T, P1, P2, P3, P4, P5, A1, |
564 A2>(object, function, false, p1, | 532 A2>(object, function, false, p1, |
565 p2, p3, p4, p5); | 533 p2, p3, p4, p5); |
566 } | 534 } |
567 | 535 |
| 536 } // namespace internal |
| 537 |
568 // A function which does nothing. Useful for creating no-op callbacks, e.g.: | 538 // A function which does nothing. Useful for creating no-op callbacks, e.g.: |
569 // Closure* nothing = NewCallback(&DoNothing); | 539 // Closure* nothing = NewCallback(&DoNothing); |
570 void LIBPROTOBUF_EXPORT DoNothing(); | 540 void LIBPROTOBUF_EXPORT DoNothing(); |
571 | 541 |
572 | 542 |
573 } // namespace protobuf | 543 } // namespace protobuf |
574 } // namespace google | 544 } // namespace google |
575 | 545 |
576 #endif // GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ | 546 #endif // GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ |
OLD | NEW |