PRInt32 nsAttrAndChildArray::IndexOfAttr(nsIAtom* aLocalName, PRInt32 aNamespaceID) const { PRInt32 idx; if (mImpl && mImpl->mMappedAttrs) { idx = mImpl->mMappedAttrs->IndexOfAttr(aLocalName, aNamespaceID); if (idx >= 0) { return idx; } } PRUint32 i; PRUint32 mapped = MappedAttrCount(); PRUint32 slotCount = AttrSlotCount(); if (aNamespaceID == kNameSpaceID_None) { // This should be the common case so lets make an optimized loop for (i = 0; i < slotCount && AttrSlotIsTaken(i); ++i) { if (ATTRS(mImpl)[i].mName.Equals(aLocalName)) { return i + mapped; } } } else { for (i = 0; i < slotCount && AttrSlotIsTaken(i); ++i) { if (ATTRS(mImpl)[i].mName.Equals(aLocalName, aNamespaceID)) { return i + mapped; } } } return -1; }
const nsAttrName* nsAttrAndChildArray::AttrNameAt(PRUint32 aPos) const { NS_ASSERTION(aPos < AttrCount(), "out-of-bounds access in nsAttrAndChildArray"); PRUint32 mapped = MappedAttrCount(); if (aPos < mapped) { return mImpl->mMappedAttrs->NameAt(aPos); } return &ATTRS(mImpl)[aPos - mapped].mName; }
const nsAttrValue* nsAttrAndChildArray::AttrAt(uint32_t aPos) const { NS_ASSERTION(aPos < AttrCount(), "out-of-bounds access in nsAttrAndChildArray"); uint32_t mapped = MappedAttrCount(); if (aPos < mapped) { return mImpl->mMappedAttrs->AttrAt(aPos); } return &ATTRS(mImpl)[aPos - mapped].mValue; }
const nsAttrName* nsAttrAndChildArray::GetSafeAttrNameAt(PRUint32 aPos) const { PRUint32 mapped = MappedAttrCount(); if (aPos < mapped) { return mImpl->mMappedAttrs->NameAt(aPos); } aPos -= mapped; if (aPos >= AttrSlotCount()) { return nsnull; } void** pos = mImpl->mBuffer + aPos * ATTRSIZE; if (!*pos) { return nsnull; } return &reinterpret_cast<InternalAttr*>(pos)->mName; }
nsresult nsAttrAndChildArray::RemoveAttrAt(PRUint32 aPos, nsAttrValue& aValue) { NS_ASSERTION(aPos < AttrCount(), "out-of-bounds"); PRUint32 mapped = MappedAttrCount(); if (aPos < mapped) { if (mapped == 1) { // We're removing the last mapped attribute. Can't swap in this // case; have to copy. aValue.SetTo(*mImpl->mMappedAttrs->AttrAt(0)); NS_RELEASE(mImpl->mMappedAttrs); return NS_OK; } nsRefPtr<nsMappedAttributes> mapped; nsresult rv = GetModifiableMapped(nsnull, nsnull, false, getter_AddRefs(mapped)); NS_ENSURE_SUCCESS(rv, rv); mapped->RemoveAttrAt(aPos, aValue); return MakeMappedUnique(mapped); } aPos -= mapped; ATTRS(mImpl)[aPos].mValue.SwapValueWith(aValue); ATTRS(mImpl)[aPos].~InternalAttr(); PRUint32 slotCount = AttrSlotCount(); memmove(&ATTRS(mImpl)[aPos], &ATTRS(mImpl)[aPos + 1], (slotCount - aPos - 1) * sizeof(InternalAttr)); memset(&ATTRS(mImpl)[slotCount - 1], nsnull, sizeof(InternalAttr)); return NS_OK; }
PRUint32 nsAttrAndChildArray::AttrCount() const { return NonMappedAttrCount() + MappedAttrCount(); }