void MainObjectArrayPtr::MainObjectArray::CreateMainObject( ModifiableElement p_ObjectName, ObjectNumber p_ObjectNumber, ArrayIndex p_ElementCount, ArrayIndex p_MaxElementCount) { QuantumNumber NewBigPointerQuantum; BigArrayHeader NewBigArrayHeader; SVector NewBigPointerArray; SVector NewLittlePointerArray; ArrayIndex LittlePointerBlockCount; ArrayIndex i; ArrayIndex NewQuantum; QFreeSpaceEntry TempFreeSpaceEntry; if (p_ElementCount == 0) p_ElementCount = 1; // this is the simplest handling for 0-length arrays TempFreeSpaceEntry.m_ObjectNumber = p_ObjectNumber; TempFreeSpaceEntry.m_FreeSpaceCode = 0; NewBigPointerQuantum = m_QuantumFile->FindEmptyBlock(); BigPointerBlockPtr NewBigPointerBlock = m_QuantumFile->MakeBigPointerBlockPtr(NewBigPointerQuantum); NewBigPointerBlock->Clear(); NewBigPointerBlock->SetQuantumType(BIG_POINTER_ARRAY); NewBigPointerBlock->SetMainObjectNumber(p_ObjectNumber); NewBigArrayHeader.m_ElementCount = p_ElementCount; NewBigArrayHeader.m_MaxElementCount = p_MaxElementCount; NewBigArrayHeader.m_LastQuantumAddedTo = NoQuantum; NewBigPointerBlock->AddItem(&NewBigArrayHeader, sizeof(BigArrayHeader), BIG_ARRAY_HEADER, 0); LittlePointerBlockCount = (p_ElementCount-1)/ItemReferencesPerBlock + 1; NewBigPointerArray = SVector(LittlePointerBlockCount); NewLittlePointerArray = SVector(ItemReferencesPerBlock); for (i = 0; i < LittlePointerBlockCount; i ++) { NewQuantum = m_QuantumFile->FindEmptyBlock(); m_QuantumFile->SetFreeSpace(NewQuantum,TempFreeSpaceEntry); NewBigPointerArray[i] = NewQuantum; LittlePointerBlockPtr NewLittlePointerBlock = m_QuantumFile->MakeLittlePointerBlockPtr(NewQuantum); NewLittlePointerBlock->Clear(); NewLittlePointerBlock->SetQuantumType(LITTLE_POINTER_ARRAY); NewLittlePointerBlock->SetMainObjectNumber(p_ObjectNumber); NewLittlePointerBlock->AddItem(NewLittlePointerArray.GetDataAddress(), NewLittlePointerArray.GetSize()*sizeof(ItemReference), LITTLE_POINTER_ARRAY,0); NewLittlePointerBlock->ClearLittleArray(); m_QuantumFile->SetFreeSpace(NewQuantum,TempFreeSpaceEntry); } NewBigPointerBlock->AddItem(NewBigPointerArray.GetDataAddress(), NewBigPointerArray.GetSize()*sizeof(QuantumNumber), BIG_POINTER_ARRAY,0); m_QuantumFile->SetFreeSpace(NewBigPointerQuantum,TempFreeSpaceEntry); Set(p_ObjectNumber,NewBigPointerQuantum); PutElement(MainObjectDirectory, p_ObjectNumber, p_ObjectName); }