// remove all still registered listeners for (size_t i = 0; i < m_Listeners.size(); ++i)
{
SfxListener* const pListener = m_Listeners[i]; if (pListener)
pListener->RemoveBroadcaster_Impl(*this);
}
}
// copy ctor of class SfxBroadcaster
SfxBroadcaster::SfxBroadcaster(const SfxBroadcaster& rOther)
{ for (size_t i = 0; i < rOther.m_Listeners.size(); ++i)
{
SfxListener* const pListener = rOther.m_Listeners[i]; if (pListener)
pListener->StartListening(*this);
}
}
// First, check the slots either side of the last removed slot, makes a significant // difference when the list is large. int positionOfRemovedElement = -1; if (!m_RemovedPositions.empty())
{ auto i = m_RemovedPositions.back(); if (i < m_Listeners.size() - 2 && m_Listeners[i + 1] == &rListener)
{
positionOfRemovedElement = i + 1;
} elseif (i > 0 && m_Listeners[i - 1] == &rListener)
{
positionOfRemovedElement = i - 1;
}
} // then scan the whole list if we didn't find it if (positionOfRemovedElement == -1)
{ auto aIter = std::find(m_Listeners.begin(), m_Listeners.end(), &rListener);
positionOfRemovedElement = std::distance(m_Listeners.begin(), aIter);
} // DO NOT erase the listener, set the pointer to 0 // because the current continuation may contain this->Broadcast
m_Listeners[positionOfRemovedElement] = nullptr;
m_RemovedPositions.push_back(positionOfRemovedElement);
}
void SfxBroadcaster::ForAllListeners(const std::function<bool(SfxListener*)>& f) const
{ for (size_t i = 0; i < m_Listeners.size(); ++i)
{
SfxListener* const pListener = m_Listeners[i]; if (pListener) if (f(pListener)) break;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.