#include #include #include "disk.h" void destroyDiskQueue(DiskQueue *queue) { free(queue->requests); free(queue); } DiskQueue *sortQueueByPosition(DiskQueue *queue) { qsort(queue->requests, queue->size, sizeof(DiskRequest), compareDiskRequestsByPosition); return queue; } int compareDiskRequestsByPosition(const void *a, const void *b) { DiskRequest *requestA = (DiskRequest *) a; DiskRequest *requestB = (DiskRequest *) b; return requestA->position - requestB->position; } DiskQueue *queueOfLesserTime(DiskQueue *queue, double time) { DiskQueue *sameTimeQueue = createDiskQueue(); for (int i = 0; i < queue->size; i++) { if (queue->requests[i].time <= time) { enqueue(sameTimeQueue, queue->requests[i]); } } return sameTimeQueue; } DiskRequest dequeue(DiskQueue *queue) { return delete(queue, peek(queue)); } DiskRequest peek(DiskQueue *queue) { return queue->requests[0]; } DiskQueue *clone(DiskQueue *queue) { DiskQueue *clone = createDiskQueue(); for (int i = 0; i < queue->size; i++) { enqueue(clone, queue->requests[i]); } return clone; } DiskRequest delete(DiskQueue *queue, DiskRequest request) { // Find the index of the request int index = -1; for (int i = 0; i < queue->size; i++) { if (queue->requests[i].position == request.position && queue->requests[i].time == request.time) { index = i; break; } } if (index == -1) { printf("Error: Request not found in queue\n"); exit(EXIT_FAILURE); } // Shift all the elements after the index down one for (int i = index; i < queue->size - 1; i++) { queue->requests[i] = queue->requests[i + 1]; } // Resize the queue queue->requests = realloc(queue->requests, sizeof(DiskRequest) * (queue->size - 1)); if (queue->requests == NULL) { printf("Error reallocating memory for queue requests\n"); exit(EXIT_FAILURE); } queue->size--; return request; } void enqueue(DiskQueue *queue, DiskRequest request) { queue->requests = realloc(queue->requests, sizeof(DiskRequest) * (queue->size + 1)); if (queue->requests == NULL) { printf("Error reallocating memory for queue requests\n"); exit(EXIT_FAILURE); } queue->requests[queue->size] = request; queue->size++; } DiskRequest diskRequest(int position, int time) { DiskRequest request; request.position = position; request.time = time; return request; } DiskQueue *createDiskQueue() { DiskQueue *queue = malloc(sizeof(DiskQueue)); if (queue == NULL) { printf("Error allocating memory for queue\n"); exit(EXIT_FAILURE); } queue->requests = malloc(sizeof(DiskRequest)); if (queue->requests == NULL) { printf("Error allocating memory for queue requests\n"); exit(EXIT_FAILURE); } queue->size = 0; return queue; }