diff --git a/rtc_base/cancer_stick_castle.h b/rtc_base/cancer_stick_castle.h index 43e6a46a70..df142c26cb 100644 --- a/rtc_base/cancer_stick_castle.h +++ b/rtc_base/cancer_stick_castle.h @@ -24,13 +24,20 @@ namespace cancer_stick_castle_impl { class CancerStickCastleReceivers { public: CancerStickCastleReceivers(); + CancerStickCastleReceivers(const CancerStickCastleReceivers&) = delete; + CancerStickCastleReceivers& operator=(const CancerStickCastleReceivers&) = + delete; + CancerStickCastleReceivers(CancerStickCastleReceivers&&) = delete; + CancerStickCastleReceivers& operator=(CancerStickCastleReceivers&&) = delete; ~CancerStickCastleReceivers(); + void AddReceiver(UntypedFunction&& f) { AddReceiverImpl(&f); // Assume that f was moved from and is now trivially destructible. // This helps the compiler optimize away the destructor call. RTC_ASSUME(f.IsTriviallyDestructible()); } + void Foreach(rtc::FunctionView fv); private: @@ -43,6 +50,8 @@ class CancerStickCastleReceivers { // A collection of receivers (callable objects) that can be called all at once. // Optimized for minimal binary size. // +// Neither copyable nor movable. Could easily be made movable if necessary. +// // TODO(kwiberg): Add support for removing receivers, if necessary. AddReceiver // would have to return some sort of ID that the caller could save and then pass // to RemoveReceiver. Alternatively, the callable objects could return one value @@ -51,11 +60,22 @@ class CancerStickCastleReceivers { template class CancerStickCastle { public: + CancerStickCastle() = default; + CancerStickCastle(const CancerStickCastle&) = delete; + CancerStickCastle& operator=(const CancerStickCastle&) = delete; + CancerStickCastle(CancerStickCastle&&) = delete; + CancerStickCastle& operator=(CancerStickCastle&&) = delete; + + // Adds a new receiver. The receiver (a callable object or a function pointer) + // must be movable, but need not be copyable. Its call signature should be + // `void(ArgT...)`. template void AddReceiver(F&& f) { receivers_.AddReceiver( UntypedFunction::Create(std::forward(f))); } + + // Calls all receivers with the given arguments. void Send(ArgT&&... args) { receivers_.Foreach([&](UntypedFunction& f) { f.Call(std::forward(args)...);