/* ============================================================================= * TMheap_remove * -- Returns NULL if empty * ============================================================================= */ void* TMheap_remove (TM_ARGDECL heap_t* heapPtr) { long size = (long)TM_SHARED_READ_L(heapPtr->size); if (size < 1) { return NULL; } void** elements = (void**)TM_SHARED_READ_P(heapPtr->elements); void* dataPtr = (void*)TM_SHARED_READ_P(elements[1]); TM_SHARED_WRITE_P(elements[1], TM_SHARED_READ_P(elements[size])); TM_SHARED_WRITE_L(heapPtr->size, (size - 1)); TMheapify(TM_ARG heapPtr, 1); return dataPtr; }
/* ============================================================================= * heap_remove * -- Returns NULL if empty * ============================================================================= */ TM_SAFE void* heap_remove (heap_t* heapPtr) { long size = heapPtr->size; if (size < 1) { return NULL; } void** elements = heapPtr->elements; void* dataPtr = elements[1]; elements[1] = elements[size]; heapPtr->size = size - 1; TMheapify(heapPtr, 1); return dataPtr; }