/// <summary> /// Reserves a heap's chunk and returns a pointer to this area. /// </summary> /// <param name="newPointer">Number of bytes to reserve.</param> /// <returns>An handle to the reserved area.</returns> protected virtual MemoryPointer Alloc(MemoryPointer newPointer) { // - Iterate over the free spaces for (int i = FreeSpace.Count - 1; i >= 0; --i) { var freeChunk = FreeSpace[i]; // - If we found a suitable free space if (freeChunk.Size >= newPointer.Size) { // - Set the position to the current free chunk newPointer.ChangeOffsetAndSize(freeChunk.Offset, newPointer.Size); // - Calculates the remaining space uint remainingSpace = freeChunk.Size - newPointer.Size; // - If no memory remains in the free space pointer we must delete it if (remainingSpace <= 0) { FreeSpace.Remove(freeChunk); } else { freeChunk.ChangeOffsetAndSize(newPointer.Offset + newPointer.Size, remainingSpace); } // - Adds the new pointer to the used space UsedSpace.Add(newPointer); // - Sort used space UsedSpace.OrderBy(x => x.Offset); // - Update fragmentation factor FragmentationFactor = CalculateFragmentationRate(); return(newPointer); } } // - Expand the heap if (!Grow(newPointer.Size)) { Defrag(); if (FreeSpace.Count > 0 && FreeSpace.Last().Size > newPointer.Size) { return(Alloc(newPointer)); } return(null); } return(Alloc(newPointer)); }
public bool IsCorr(int startedlength, int stoppedlength, int heigth) { for (int component = startedlength; component <= stoppedlength - 1; component++) { if (!UsedSpace.Any(item => item.Contains($"{ShipStart[0].Name}{component + 1}{heigth}"))) { TemporaryPlaces.Add($"{ShipStart[0].Name}{component}{heigth}"); } else { TemporaryPlaces.Clear(); return(false); } } foreach (var Model in TemporaryPlaces) { UsedSpace.Add($"{Model}"); ShipPlaces.Add($"{Model}"); } TemporaryPlaces.Clear(); return(true); }