| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef MEDIA_BASE_CALLBACK_HOLDER_H_ | 5 #ifndef MEDIA_BASE_CALLBACK_HOLDER_H_ |
| 6 #define MEDIA_BASE_CALLBACK_HOLDER_H_ | 6 #define MEDIA_BASE_CALLBACK_HOLDER_H_ |
| 7 | 7 |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| 11 #include "media/base/bind_to_current_loop.h" | |
| 12 | 11 |
| 13 namespace media { | 12 namespace media { |
| 14 | 13 |
| 15 // A helper class that can hold a callback from being fired. | 14 // A helper class that can hold a callback from being fired. |
| 16 template <typename CB> class CallbackHolder { | 15 template <typename CB> class CallbackHolder { |
| 17 public: | 16 public: |
| 18 CallbackHolder() : hold_(false) {} | 17 CallbackHolder() : hold_(false) {} |
| 19 | 18 |
| 20 ~CallbackHolder() { | 19 ~CallbackHolder() { |
| 21 // Make sure all callbacks are satisfied! | 20 // Make sure all callbacks are satisfied! |
| (...skipping 10 matching lines...) Expand all Loading... |
| 32 } | 31 } |
| 33 | 32 |
| 34 bool IsNull() const { | 33 bool IsNull() const { |
| 35 return original_cb_.is_null() && held_cb_.is_null(); | 34 return original_cb_.is_null() && held_cb_.is_null(); |
| 36 } | 35 } |
| 37 | 36 |
| 38 // Holds the callback when Run() is called. | 37 // Holds the callback when Run() is called. |
| 39 void HoldCallback() { hold_ = true; } | 38 void HoldCallback() { hold_ = true; } |
| 40 | 39 |
| 41 // Runs or holds the callback as specified by |hold_|. | 40 // Runs or holds the callback as specified by |hold_|. |
| 42 // This method has overloaded versions to support different types of CB. | |
| 43 void RunOrHold() { | 41 void RunOrHold() { |
| 44 DCHECK(held_cb_.is_null()); | 42 DCHECK(held_cb_.is_null()); |
| 45 if (hold_) | 43 if (hold_) |
| 46 held_cb_ = base::ResetAndReturn(&original_cb_); | 44 held_cb_ = base::ResetAndReturn(&original_cb_); |
| 47 else | 45 else |
| 48 base::ResetAndReturn(&original_cb_).Run(); | 46 base::ResetAndReturn(&original_cb_).Run(); |
| 49 } | 47 } |
| 50 | 48 |
| 51 template <typename A1> void RunOrHold(A1 a1) { | 49 template <typename... Args> |
| 50 void RunOrHold(Args&&... args) { |
| 52 DCHECK(held_cb_.is_null()); | 51 DCHECK(held_cb_.is_null()); |
| 53 if (hold_) { | 52 if (hold_) { |
| 54 held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_), | 53 held_cb_ = base::BindOnce(base::ResetAndReturn(&original_cb_), |
| 55 internal::TrampolineForward(a1)); | 54 std::forward<Args>(args)...); |
| 56 } else { | 55 } else { |
| 57 base::ResetAndReturn(&original_cb_).Run(a1); | 56 base::ResetAndReturn(&original_cb_).Run(std::forward<Args>(args)...); |
| 58 } | 57 } |
| 59 } | 58 } |
| 60 | 59 |
| 61 template <typename A1, typename A2> void RunOrHold(A1 a1, A2 a2) { | |
| 62 DCHECK(held_cb_.is_null()); | |
| 63 if (hold_) { | |
| 64 held_cb_ = base::Bind(base::ResetAndReturn(&original_cb_), | |
| 65 internal::TrampolineForward(a1), | |
| 66 internal::TrampolineForward(a2)); | |
| 67 } else { | |
| 68 base::ResetAndReturn(&original_cb_).Run(a1, a2); | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 // Releases and runs the held callback. | 60 // Releases and runs the held callback. |
| 73 void RunHeldCallback() { | 61 void RunHeldCallback() { |
| 74 DCHECK(hold_); | 62 DCHECK(hold_); |
| 75 DCHECK(!held_cb_.is_null()); | 63 DCHECK(!held_cb_.is_null()); |
| 76 hold_ = false; | 64 hold_ = false; |
| 77 base::ResetAndReturn(&held_cb_).Run(); | 65 base::ResetAndReturn(&held_cb_).Run(); |
| 78 } | 66 } |
| 79 | 67 |
| 80 private: | 68 private: |
| 81 bool hold_; | 69 bool hold_; |
| 82 CB original_cb_; | 70 CB original_cb_; |
| 83 base::Closure held_cb_; | 71 base::OnceClosure held_cb_; |
| 84 }; | 72 }; |
| 85 | 73 |
| 86 } // namespace media | 74 } // namespace media |
| 87 | 75 |
| 88 #endif // MEDIA_BASE_CALLBACK_HOLDER_H_ | 76 #endif // MEDIA_BASE_CALLBACK_HOLDER_H_ |
| OLD | NEW |