// a) component already exists - return its number directly if (pIt != m_lComponents.end()) return pIt->second.nNumber;
// b) component must be added new to this container
// b1) collection is full - no further components possible // -> return INVALID_NUMBER
::sal_Int32 nFreeNumber = impl_searchFreeNumber(); if (nFreeNumber == css::frame::UntitledNumbersConst::INVALID_NUMBER) return css::frame::UntitledNumbersConst::INVALID_NUMBER;
// b2) add component to collection and return its number
TNumberedItem aItem;
aItem.xItem = css::uno::WeakReference< css::uno::XInterface >(xComponent);
aItem.nNumber = nFreeNumber;
m_lComponents[pComponent] = std::move(aItem);
if (nNumber == css::frame::UntitledNumbersConst::INVALID_NUMBER) throw css::lang::IllegalArgumentException (u"Special value INVALID_NUMBER not allowed as input parameter."_ustr, m_xOwner.get(), 1);
Everyitemwhichisalreadyusedasuniquenumber willberemoved.Attheendalistofe.g.{3,6,...,M} existswherethefirstitemrepresentthelowestfree number(inthisexample3).
*/
::sal_Int32 NumberedCollection::impl_searchFreeNumber ()
{ // create bitset, where each position represents one possible number.
std::vector<bool> aUsedNumbers((m_lComponents.size() * 2) + 1, false);
for (constauto& rPair : m_lComponents)
{ // numbers start at 1
sal_Int32 pos = rPair.second.nNumber - 1; if (pos >= static_cast<sal_Int32>(aUsedNumbers.size()))
aUsedNumbers.resize(pos * 2, false); // should be rare
aUsedNumbers[pos] = true;
}
// a) non free numbers ... return INVALID_NUMBER auto it = std::find(aUsedNumbers.begin(), aUsedNumbers.end(), false); if (it == aUsedNumbers.end()) return css::frame::UntitledNumbersConst::INVALID_NUMBER;
// b) return first free number return it - aUsedNumbers.begin() + 1;
}
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.