SpanningCellSorter::Item* SpanningCellSorter::GetNext(int32_t *aColSpan) { NS_ASSERTION(mState != DONE, "done enumerating, stop calling"); switch (mState) { case ADDING: /* prepare to enumerate the array */ mState = ENUMERATING_ARRAY; mEnumerationIndex = 0; /* fall through */ case ENUMERATING_ARRAY: while (mEnumerationIndex < ARRAY_SIZE && !mArray[mEnumerationIndex]) ++mEnumerationIndex; if (mEnumerationIndex < ARRAY_SIZE) { Item *result = mArray[mEnumerationIndex]; *aColSpan = IndexToSpan(mEnumerationIndex); NS_ASSERTION(result, "logic error"); #ifdef DEBUG_SPANNING_CELL_SORTER printf("SpanningCellSorter[%p]:" " returning list for colspan=%d from array\n", static_cast<void*>(this), *aColSpan); #endif ++mEnumerationIndex; return result; } /* prepare to enumerate the hash */ mState = ENUMERATING_HASH; mEnumerationIndex = 0; if (mHashTable.EntryCount() > 0) { HashTableEntry **sh = new HashTableEntry*[mHashTable.EntryCount()]; int32_t j = 0; for (auto iter = mHashTable.Iter(); !iter.Done(); iter.Next()) { sh[j++] = static_cast<HashTableEntry*>(iter.Get()); } NS_QuickSort(sh, mHashTable.EntryCount(), sizeof(sh[0]), SortArray, nullptr); mSortedHashTable = sh; } /* fall through */ case ENUMERATING_HASH: if (mEnumerationIndex < mHashTable.EntryCount()) { Item *result = mSortedHashTable[mEnumerationIndex]->mItems; *aColSpan = mSortedHashTable[mEnumerationIndex]->mColSpan; NS_ASSERTION(result, "holes in hash table"); #ifdef DEBUG_SPANNING_CELL_SORTER printf("SpanningCellSorter[%p]:" " returning list for colspan=%d from hash\n", static_cast<void*>(this), *aColSpan); #endif ++mEnumerationIndex; return result; } mState = DONE; /* fall through */ case DONE: ; } return nullptr; }
SpanningCellSorter::Item* SpanningCellSorter::GetNext(PRInt32 *aColSpan) { NS_ASSERTION(mState != DONE, "done enumerating, stop calling"); switch (mState) { case ADDING: /* prepare to enumerate the array */ mState = ENUMERATING_ARRAY; mEnumerationIndex = 0; /* fall through */ case ENUMERATING_ARRAY: while (mEnumerationIndex < ARRAY_SIZE && !mArray[mEnumerationIndex]) ++mEnumerationIndex; if (mEnumerationIndex < ARRAY_SIZE) { Item *result = mArray[mEnumerationIndex]; *aColSpan = IndexToSpan(mEnumerationIndex); NS_ASSERTION(result, "logic error"); #ifdef DEBUG_SPANNING_CELL_SORTER printf("SpanningCellSorter[%p]:" " returning list for colspan=%d from array\n", static_cast<void*>(this), *aColSpan); #endif ++mEnumerationIndex; return result; } /* prepare to enumerate the hash */ mState = ENUMERATING_HASH; mEnumerationIndex = 0; if (mHashTable.entryCount) { HashTableEntry **sh = new HashTableEntry*[mHashTable.entryCount]; if (!sh) { // give up mState = DONE; return nsnull; } PL_DHashTableEnumerate(&mHashTable, FillSortedArray, sh); NS_QuickSort(sh, mHashTable.entryCount, sizeof(sh[0]), SortArray, nsnull); mSortedHashTable = sh; } /* fall through */ case ENUMERATING_HASH: if (mEnumerationIndex < mHashTable.entryCount) { Item *result = mSortedHashTable[mEnumerationIndex]->mItems; *aColSpan = mSortedHashTable[mEnumerationIndex]->mColSpan; NS_ASSERTION(result, "holes in hash table"); #ifdef DEBUG_SPANNING_CELL_SORTER printf("SpanningCellSorter[%p]:" " returning list for colspan=%d from hash\n", static_cast<void*>(this), *aColSpan); #endif ++mEnumerationIndex; return result; } mState = DONE; /* fall through */ case DONE: ; } return nsnull; }