nsresult nsAttrAndChildArray::InsertChildAt(nsIContent* aChild, PRUint32 aPos) { NS_ASSERTION(aChild, "nullchild"); NS_ASSERTION(aPos <= ChildCount(), "out-of-bounds"); PRUint32 offset = AttrSlotsSize(); PRUint32 childCount = ChildCount(); NS_ENSURE_TRUE(childCount < ATTRCHILD_ARRAY_MAX_CHILD_COUNT, NS_ERROR_FAILURE); // First try to fit new child in existing childlist if (mImpl && offset + childCount < mImpl->mBufferSize) { void** pos = mImpl->mBuffer + offset + aPos; if (childCount != aPos) { memmove(pos + 1, pos, (childCount - aPos) * sizeof(nsIContent*)); } SetChildAtPos(pos, aChild, aPos, childCount); SetChildCount(childCount + 1); return NS_OK; } // Try to fit new child in existing buffer by compressing attrslots if (offset && !mImpl->mBuffer[offset - ATTRSIZE]) { // Compress away all empty slots while we're at it. This might not be the // optimal thing to do. PRUint32 attrCount = NonMappedAttrCount(); void** newStart = mImpl->mBuffer + attrCount * ATTRSIZE; void** oldStart = mImpl->mBuffer + offset; memmove(newStart, oldStart, aPos * sizeof(nsIContent*)); memmove(&newStart[aPos + 1], &oldStart[aPos], (childCount - aPos) * sizeof(nsIContent*)); SetChildAtPos(newStart + aPos, aChild, aPos, childCount); SetAttrSlotAndChildCount(attrCount, childCount + 1); return NS_OK; } // We can't fit in current buffer, Realloc time! if (!GrowBy(1)) { return NS_ERROR_OUT_OF_MEMORY; } void** pos = mImpl->mBuffer + offset + aPos; if (childCount != aPos) { memmove(pos + 1, pos, (childCount - aPos) * sizeof(nsIContent*)); } SetChildAtPos(pos, aChild, aPos, childCount); SetChildCount(childCount + 1); return NS_OK; }
nsLineBox::nsLineBox(nsIFrame* aFrame, PRInt32 aCount, PRBool aIsBlock) : mFirstChild(aFrame), mBounds(0, 0, 0, 0), mAscent(0), mData(nsnull) { MOZ_COUNT_CTOR(nsLineBox); #ifdef DEBUG ++ctorCount; NS_ASSERTION(!aIsBlock || aCount == 1, "Blocks must have exactly one child"); nsIFrame* f = aFrame; for (PRInt32 n = aCount; n > 0; f = f->GetNextSibling(), --n) { NS_ASSERTION(aIsBlock == f->GetStyleDisplay()->IsBlockOutside(), "wrong kind of child frame"); } #endif mAllFlags = 0; #if NS_STYLE_CLEAR_NONE > 0 mFlags.mBreakType = NS_STYLE_CLEAR_NONE; #endif SetChildCount(aCount); MarkDirty(); mFlags.mBlock = aIsBlock; }
void nsAttrAndChildArray::RemoveChildAt(PRUint32 aPos) { NS_ASSERTION(aPos < ChildCount(), "out-of-bounds"); PRUint32 childCount = ChildCount(); void** pos = mImpl->mBuffer + AttrSlotsSize() + aPos; nsIContent* child = static_cast<nsIContent*>(*pos); if (child->mPreviousSibling) { child->mPreviousSibling->mNextSibling = child->mNextSibling; } if (child->mNextSibling) { child->mNextSibling->mPreviousSibling = child->mPreviousSibling; } child->mPreviousSibling = child->mNextSibling = nsnull; NS_RELEASE(child); memmove(pos, pos + 1, (childCount - aPos - 1) * sizeof(nsIContent*)); SetChildCount(childCount - 1); }
already_AddRefed<nsIContent> nsAttrAndChildArray::TakeChildAt(uint32_t aPos) { NS_ASSERTION(aPos < ChildCount(), "out-of-bounds"); uint32_t childCount = ChildCount(); void** pos = mImpl->mBuffer + AttrSlotsSize() + aPos; nsIContent* child = static_cast<nsIContent*>(*pos); if (child->mPreviousSibling) { child->mPreviousSibling->mNextSibling = child->mNextSibling; } if (child->mNextSibling) { child->mNextSibling->mPreviousSibling = child->mPreviousSibling; } child->mPreviousSibling = child->mNextSibling = nullptr; memmove(pos, pos + 1, (childCount - aPos - 1) * sizeof(nsIContent*)); SetChildCount(childCount - 1); return dont_AddRef(child); }