| // | |
| // Copyright 2016 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // signal_utils: | |
| // Helper classes for tracking dependent state changes between objects. | |
| // These changes are signaled to the dependent class via channels. | |
| #include "libANGLE/signal_utils.h" | |
| #include <algorithm> | |
| #include "common/debug.h" | |
| namespace angle | |
| { | |
| BroadcastChannel::BroadcastChannel() | |
| { | |
| } | |
| BroadcastChannel::~BroadcastChannel() | |
| { | |
| reset(); | |
| } | |
| void BroadcastChannel::addReceiver(ChannelBinding *receiver) | |
| { | |
| ASSERT(std::find(mReceivers.begin(), mReceivers.end(), receiver) == mReceivers.end()); | |
| mReceivers.push_back(receiver); | |
| } | |
| void BroadcastChannel::removeReceiver(ChannelBinding *receiver) | |
| { | |
| auto iter = std::find(mReceivers.begin(), mReceivers.end(), receiver); | |
| ASSERT(iter != mReceivers.end()); | |
| mReceivers.erase(iter); | |
| } | |
| void BroadcastChannel::signal() const | |
| { | |
| if (mReceivers.empty()) | |
| return; | |
| for (const auto *receiver : mReceivers) | |
| { | |
| receiver->signal(); | |
| } | |
| } | |
| void BroadcastChannel::reset() | |
| { | |
| for (auto receiver : mReceivers) | |
| { | |
| receiver->onChannelClosed(); | |
| } | |
| mReceivers.clear(); | |
| } | |
| ChannelBinding::ChannelBinding(SignalReceiver *receiver, SignalToken token) | |
| : mChannel(nullptr), mReceiver(receiver), mToken(token) | |
| { | |
| ASSERT(receiver); | |
| } | |
| ChannelBinding::~ChannelBinding() | |
| { | |
| reset(); | |
| } | |
| void ChannelBinding::bind(BroadcastChannel *channel) | |
| { | |
| ASSERT(mReceiver); | |
| if (mChannel) | |
| { | |
| mChannel->removeReceiver(this); | |
| } | |
| mChannel = channel; | |
| if (mChannel) | |
| { | |
| mChannel->addReceiver(this); | |
| } | |
| } | |
| void ChannelBinding::reset() | |
| { | |
| bind(nullptr); | |
| } | |
| void ChannelBinding::signal() const | |
| { | |
| mReceiver->signal(mToken); | |
| } | |
| void ChannelBinding::onChannelClosed() | |
| { | |
| mChannel = nullptr; | |
| } | |
| } // namespace angle |