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

Side by Side Diff: base/callback.h

Issue 9717021: Make Callback::Reset() return a copy to support use-cases where Run() ends up modifying |*this|. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 9 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 | « no previous file | base/callback.h.pump » ('j') | base/callback_unittest.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // This file was GENERATED by command: 1 // This file was GENERATED by command:
2 // pump.py callback.h.pump 2 // pump.py callback.h.pump
3 // DO NOT EDIT BY HAND!!! 3 // DO NOT EDIT BY HAND!!!
4 4
5 5
6 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 6 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be 7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file. 8 // found in the LICENSE file.
9 9
10 #ifndef BASE_CALLBACK_H_ 10 #ifndef BASE_CALLBACK_H_
(...skipping 21 matching lines...) Expand all
32 // 32 //
33 // MEMORY MANAGEMENT AND PASSING 33 // MEMORY MANAGEMENT AND PASSING
34 // 34 //
35 // The Callback objects themselves should be passed by const-reference, and 35 // The Callback objects themselves should be passed by const-reference, and
36 // stored by copy. They internally store their state via a refcounted class 36 // stored by copy. They internally store their state via a refcounted class
37 // and thus do not need to be deleted. 37 // and thus do not need to be deleted.
38 // 38 //
39 // The reason to pass via a const-reference is to avoid unnecessary 39 // The reason to pass via a const-reference is to avoid unnecessary
40 // AddRef/Release pairs to the internal state. 40 // AddRef/Release pairs to the internal state.
41 // 41 //
42 // If a Callback variable must be empty during the Run() of a previous value of
43 // that variable, use ResetAndRun(). E.g. if MyClass has a member variable
44 // Callback which gets set as a side-effect of Run()'ing the Callback (to
45 // something else), ResetAndRun() can be handy.
42 // 46 //
43 // EXAMPLE USAGE: 47 // EXAMPLE USAGE:
44 // 48 //
45 // /* Binding a normal function. */ 49 // /* Binding a normal function. */
46 // int Return5() { return 5; } 50 // int Return5() { return 5; }
47 // base::Callback<int(void)> func_cb = base::Bind(&Return5); 51 // base::Callback<int(void)> func_cb = base::Bind(&Return5);
48 // LOG(INFO) << func_cb.Run(); // Prints 5. 52 // LOG(INFO) << func_cb.Run(); // Prints 5.
49 // 53 //
50 // void PrintHi() { LOG(INFO) << "hi."; } 54 // void PrintHi() { LOG(INFO) << "hi."; }
51 // base::Closure void_func_cb = base::Bind(&PrintHi); 55 // base::Closure void_func_cb = base::Bind(&PrintHi);
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 return CallbackBase::Equals(other); 269 return CallbackBase::Equals(other);
266 } 270 }
267 271
268 R Run() const { 272 R Run() const {
269 PolymorphicInvoke f = 273 PolymorphicInvoke f =
270 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 274 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
271 275
272 return f(bind_state_.get()); 276 return f(bind_state_.get());
273 } 277 }
274 278
279
280 R ResetAndRun() {
281 Callback<RunType> tmp(*this);
282 Reset();
283 tmp.Run();
284 }
285
275 private: 286 private:
276 typedef R(*PolymorphicInvoke)( 287 typedef R(*PolymorphicInvoke)(
277 internal::BindStateBase*); 288 internal::BindStateBase*);
278 289
279 }; 290 };
280 291
281 template <typename R, typename A1> 292 template <typename R, typename A1>
282 class Callback<R(A1)> : public internal::CallbackBase { 293 class Callback<R(A1)> : public internal::CallbackBase {
283 public: 294 public:
284 typedef R(RunType)(A1); 295 typedef R(RunType)(A1);
(...skipping 19 matching lines...) Expand all
304 return CallbackBase::Equals(other); 315 return CallbackBase::Equals(other);
305 } 316 }
306 317
307 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { 318 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const {
308 PolymorphicInvoke f = 319 PolymorphicInvoke f =
309 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 320 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
310 321
311 return f(bind_state_.get(), internal::CallbackForward(a1)); 322 return f(bind_state_.get(), internal::CallbackForward(a1));
312 } 323 }
313 324
325
326 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1) {
327 Callback<RunType> tmp(*this);
328 Reset();
329 tmp.Run(internal::CallbackForward(a1));
330 }
331
314 private: 332 private:
315 typedef R(*PolymorphicInvoke)( 333 typedef R(*PolymorphicInvoke)(
316 internal::BindStateBase*, 334 internal::BindStateBase*,
317 typename internal::CallbackParamTraits<A1>::ForwardType); 335 typename internal::CallbackParamTraits<A1>::ForwardType);
318 336
319 }; 337 };
320 338
321 template <typename R, typename A1, typename A2> 339 template <typename R, typename A1, typename A2>
322 class Callback<R(A1, A2)> : public internal::CallbackBase { 340 class Callback<R(A1, A2)> : public internal::CallbackBase {
323 public: 341 public:
(...skipping 22 matching lines...) Expand all
346 364
347 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 365 R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1,
348 typename internal::CallbackParamTraits<A2>::ForwardType a2) const { 366 typename internal::CallbackParamTraits<A2>::ForwardType a2) const {
349 PolymorphicInvoke f = 367 PolymorphicInvoke f =
350 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 368 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
351 369
352 return f(bind_state_.get(), internal::CallbackForward(a1), 370 return f(bind_state_.get(), internal::CallbackForward(a1),
353 internal::CallbackForward(a2)); 371 internal::CallbackForward(a2));
354 } 372 }
355 373
374
375 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
376 typename internal::CallbackParamTraits<A2>::ForwardType a2) {
377 Callback<RunType> tmp(*this);
378 Reset();
379 tmp.Run(internal::CallbackForward(a1),
380 internal::CallbackForward(a2));
381 }
382
356 private: 383 private:
357 typedef R(*PolymorphicInvoke)( 384 typedef R(*PolymorphicInvoke)(
358 internal::BindStateBase*, 385 internal::BindStateBase*,
359 typename internal::CallbackParamTraits<A1>::ForwardType, 386 typename internal::CallbackParamTraits<A1>::ForwardType,
360 typename internal::CallbackParamTraits<A2>::ForwardType); 387 typename internal::CallbackParamTraits<A2>::ForwardType);
361 388
362 }; 389 };
363 390
364 template <typename R, typename A1, typename A2, typename A3> 391 template <typename R, typename A1, typename A2, typename A3>
365 class Callback<R(A1, A2, A3)> : public internal::CallbackBase { 392 class Callback<R(A1, A2, A3)> : public internal::CallbackBase {
(...skipping 25 matching lines...) Expand all
391 typename internal::CallbackParamTraits<A2>::ForwardType a2, 418 typename internal::CallbackParamTraits<A2>::ForwardType a2,
392 typename internal::CallbackParamTraits<A3>::ForwardType a3) const { 419 typename internal::CallbackParamTraits<A3>::ForwardType a3) const {
393 PolymorphicInvoke f = 420 PolymorphicInvoke f =
394 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 421 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
395 422
396 return f(bind_state_.get(), internal::CallbackForward(a1), 423 return f(bind_state_.get(), internal::CallbackForward(a1),
397 internal::CallbackForward(a2), 424 internal::CallbackForward(a2),
398 internal::CallbackForward(a3)); 425 internal::CallbackForward(a3));
399 } 426 }
400 427
428
429 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
430 typename internal::CallbackParamTraits<A2>::ForwardType a2,
431 typename internal::CallbackParamTraits<A3>::ForwardType a3) {
432 Callback<RunType> tmp(*this);
433 Reset();
434 tmp.Run(internal::CallbackForward(a1),
435 internal::CallbackForward(a2),
436 internal::CallbackForward(a3));
437 }
438
401 private: 439 private:
402 typedef R(*PolymorphicInvoke)( 440 typedef R(*PolymorphicInvoke)(
403 internal::BindStateBase*, 441 internal::BindStateBase*,
404 typename internal::CallbackParamTraits<A1>::ForwardType, 442 typename internal::CallbackParamTraits<A1>::ForwardType,
405 typename internal::CallbackParamTraits<A2>::ForwardType, 443 typename internal::CallbackParamTraits<A2>::ForwardType,
406 typename internal::CallbackParamTraits<A3>::ForwardType); 444 typename internal::CallbackParamTraits<A3>::ForwardType);
407 445
408 }; 446 };
409 447
410 template <typename R, typename A1, typename A2, typename A3, typename A4> 448 template <typename R, typename A1, typename A2, typename A3, typename A4>
(...skipping 28 matching lines...) Expand all
439 typename internal::CallbackParamTraits<A4>::ForwardType a4) const { 477 typename internal::CallbackParamTraits<A4>::ForwardType a4) const {
440 PolymorphicInvoke f = 478 PolymorphicInvoke f =
441 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 479 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
442 480
443 return f(bind_state_.get(), internal::CallbackForward(a1), 481 return f(bind_state_.get(), internal::CallbackForward(a1),
444 internal::CallbackForward(a2), 482 internal::CallbackForward(a2),
445 internal::CallbackForward(a3), 483 internal::CallbackForward(a3),
446 internal::CallbackForward(a4)); 484 internal::CallbackForward(a4));
447 } 485 }
448 486
487
488 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
489 typename internal::CallbackParamTraits<A2>::ForwardType a2,
490 typename internal::CallbackParamTraits<A3>::ForwardType a3,
491 typename internal::CallbackParamTraits<A4>::ForwardType a4) {
492 Callback<RunType> tmp(*this);
493 Reset();
494 tmp.Run(internal::CallbackForward(a1),
495 internal::CallbackForward(a2),
496 internal::CallbackForward(a3),
497 internal::CallbackForward(a4));
498 }
499
449 private: 500 private:
450 typedef R(*PolymorphicInvoke)( 501 typedef R(*PolymorphicInvoke)(
451 internal::BindStateBase*, 502 internal::BindStateBase*,
452 typename internal::CallbackParamTraits<A1>::ForwardType, 503 typename internal::CallbackParamTraits<A1>::ForwardType,
453 typename internal::CallbackParamTraits<A2>::ForwardType, 504 typename internal::CallbackParamTraits<A2>::ForwardType,
454 typename internal::CallbackParamTraits<A3>::ForwardType, 505 typename internal::CallbackParamTraits<A3>::ForwardType,
455 typename internal::CallbackParamTraits<A4>::ForwardType); 506 typename internal::CallbackParamTraits<A4>::ForwardType);
456 507
457 }; 508 };
458 509
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 PolymorphicInvoke f = 542 PolymorphicInvoke f =
492 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 543 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
493 544
494 return f(bind_state_.get(), internal::CallbackForward(a1), 545 return f(bind_state_.get(), internal::CallbackForward(a1),
495 internal::CallbackForward(a2), 546 internal::CallbackForward(a2),
496 internal::CallbackForward(a3), 547 internal::CallbackForward(a3),
497 internal::CallbackForward(a4), 548 internal::CallbackForward(a4),
498 internal::CallbackForward(a5)); 549 internal::CallbackForward(a5));
499 } 550 }
500 551
552
553 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
554 typename internal::CallbackParamTraits<A2>::ForwardType a2,
555 typename internal::CallbackParamTraits<A3>::ForwardType a3,
556 typename internal::CallbackParamTraits<A4>::ForwardType a4,
557 typename internal::CallbackParamTraits<A5>::ForwardType a5) {
558 Callback<RunType> tmp(*this);
559 Reset();
560 tmp.Run(internal::CallbackForward(a1),
561 internal::CallbackForward(a2),
562 internal::CallbackForward(a3),
563 internal::CallbackForward(a4),
564 internal::CallbackForward(a5));
565 }
566
501 private: 567 private:
502 typedef R(*PolymorphicInvoke)( 568 typedef R(*PolymorphicInvoke)(
503 internal::BindStateBase*, 569 internal::BindStateBase*,
504 typename internal::CallbackParamTraits<A1>::ForwardType, 570 typename internal::CallbackParamTraits<A1>::ForwardType,
505 typename internal::CallbackParamTraits<A2>::ForwardType, 571 typename internal::CallbackParamTraits<A2>::ForwardType,
506 typename internal::CallbackParamTraits<A3>::ForwardType, 572 typename internal::CallbackParamTraits<A3>::ForwardType,
507 typename internal::CallbackParamTraits<A4>::ForwardType, 573 typename internal::CallbackParamTraits<A4>::ForwardType,
508 typename internal::CallbackParamTraits<A5>::ForwardType); 574 typename internal::CallbackParamTraits<A5>::ForwardType);
509 575
510 }; 576 };
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 612 reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
547 613
548 return f(bind_state_.get(), internal::CallbackForward(a1), 614 return f(bind_state_.get(), internal::CallbackForward(a1),
549 internal::CallbackForward(a2), 615 internal::CallbackForward(a2),
550 internal::CallbackForward(a3), 616 internal::CallbackForward(a3),
551 internal::CallbackForward(a4), 617 internal::CallbackForward(a4),
552 internal::CallbackForward(a5), 618 internal::CallbackForward(a5),
553 internal::CallbackForward(a6)); 619 internal::CallbackForward(a6));
554 } 620 }
555 621
622
623 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
624 typename internal::CallbackParamTraits<A2>::ForwardType a2,
625 typename internal::CallbackParamTraits<A3>::ForwardType a3,
626 typename internal::CallbackParamTraits<A4>::ForwardType a4,
627 typename internal::CallbackParamTraits<A5>::ForwardType a5,
628 typename internal::CallbackParamTraits<A6>::ForwardType a6) {
629 Callback<RunType> tmp(*this);
630 Reset();
631 tmp.Run(internal::CallbackForward(a1),
632 internal::CallbackForward(a2),
633 internal::CallbackForward(a3),
634 internal::CallbackForward(a4),
635 internal::CallbackForward(a5),
636 internal::CallbackForward(a6));
637 }
638
556 private: 639 private:
557 typedef R(*PolymorphicInvoke)( 640 typedef R(*PolymorphicInvoke)(
558 internal::BindStateBase*, 641 internal::BindStateBase*,
559 typename internal::CallbackParamTraits<A1>::ForwardType, 642 typename internal::CallbackParamTraits<A1>::ForwardType,
560 typename internal::CallbackParamTraits<A2>::ForwardType, 643 typename internal::CallbackParamTraits<A2>::ForwardType,
561 typename internal::CallbackParamTraits<A3>::ForwardType, 644 typename internal::CallbackParamTraits<A3>::ForwardType,
562 typename internal::CallbackParamTraits<A4>::ForwardType, 645 typename internal::CallbackParamTraits<A4>::ForwardType,
563 typename internal::CallbackParamTraits<A5>::ForwardType, 646 typename internal::CallbackParamTraits<A5>::ForwardType,
564 typename internal::CallbackParamTraits<A6>::ForwardType); 647 typename internal::CallbackParamTraits<A6>::ForwardType);
565 648
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 687
605 return f(bind_state_.get(), internal::CallbackForward(a1), 688 return f(bind_state_.get(), internal::CallbackForward(a1),
606 internal::CallbackForward(a2), 689 internal::CallbackForward(a2),
607 internal::CallbackForward(a3), 690 internal::CallbackForward(a3),
608 internal::CallbackForward(a4), 691 internal::CallbackForward(a4),
609 internal::CallbackForward(a5), 692 internal::CallbackForward(a5),
610 internal::CallbackForward(a6), 693 internal::CallbackForward(a6),
611 internal::CallbackForward(a7)); 694 internal::CallbackForward(a7));
612 } 695 }
613 696
697
698 R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1,
699 typename internal::CallbackParamTraits<A2>::ForwardType a2,
700 typename internal::CallbackParamTraits<A3>::ForwardType a3,
701 typename internal::CallbackParamTraits<A4>::ForwardType a4,
702 typename internal::CallbackParamTraits<A5>::ForwardType a5,
703 typename internal::CallbackParamTraits<A6>::ForwardType a6,
704 typename internal::CallbackParamTraits<A7>::ForwardType a7) {
705 Callback<RunType> tmp(*this);
706 Reset();
707 tmp.Run(internal::CallbackForward(a1),
708 internal::CallbackForward(a2),
709 internal::CallbackForward(a3),
710 internal::CallbackForward(a4),
711 internal::CallbackForward(a5),
712 internal::CallbackForward(a6),
713 internal::CallbackForward(a7));
714 }
715
614 private: 716 private:
615 typedef R(*PolymorphicInvoke)( 717 typedef R(*PolymorphicInvoke)(
616 internal::BindStateBase*, 718 internal::BindStateBase*,
617 typename internal::CallbackParamTraits<A1>::ForwardType, 719 typename internal::CallbackParamTraits<A1>::ForwardType,
618 typename internal::CallbackParamTraits<A2>::ForwardType, 720 typename internal::CallbackParamTraits<A2>::ForwardType,
619 typename internal::CallbackParamTraits<A3>::ForwardType, 721 typename internal::CallbackParamTraits<A3>::ForwardType,
620 typename internal::CallbackParamTraits<A4>::ForwardType, 722 typename internal::CallbackParamTraits<A4>::ForwardType,
621 typename internal::CallbackParamTraits<A5>::ForwardType, 723 typename internal::CallbackParamTraits<A5>::ForwardType,
622 typename internal::CallbackParamTraits<A6>::ForwardType, 724 typename internal::CallbackParamTraits<A6>::ForwardType,
623 typename internal::CallbackParamTraits<A7>::ForwardType); 725 typename internal::CallbackParamTraits<A7>::ForwardType);
624 726
625 }; 727 };
626 728
627 729
628 // Syntactic sugar to make Callbacks<void(void)> easier to declare since it 730 // Syntactic sugar to make Callbacks<void(void)> easier to declare since it
629 // will be used in a lot of APIs with delayed execution. 731 // will be used in a lot of APIs with delayed execution.
630 typedef Callback<void(void)> Closure; 732 typedef Callback<void(void)> Closure;
631 733
632 } // namespace base 734 } // namespace base
633 735
634 #endif // BASE_CALLBACK_H 736 #endif // BASE_CALLBACK_H
OLDNEW
« no previous file with comments | « no previous file | base/callback.h.pump » ('j') | base/callback_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698