return H;
}
+/**
+ * @brief Set the update callback function.
+ * @param H the heap we're working on
+ * \param update_callback function to call on each element to update its index when needed.
+ */
+void xbt_heap_set_update_callback(xbt_heap_t H,
+ void (*update_callback) (void *, int))
+{
+ H->update_callback = update_callback;
+}
+
+
/**
* @brief kilkil a heap and its content
* @param H poor victim
H->items =
(void *) realloc(H->items, (H->size) * sizeof(struct xbt_heapItem));
}
+
+ H->update_callback ? H->update_callback(max, -1) : NULL;
return max;
}
+/**
+ * @brief Extracts from the heap and returns the element at position i.
+ * \param H the heap we're working on
+ * \param i element position
+ * \return the element at position i if ok, NULL otherwise
+ *
+ * Extracts from the heap and returns the element at position i. The head is automatically reorded.
+ */
+void *xbt_heap_remove(xbt_heap_t H, int i)
+{
+ if ((i < 0) || (i > H->count - 1))
+ return NULL;
+ /* put element i at head */
+ if (i > 0) {
+ KEY(H, i) = MIN_KEY_VALUE;
+ xbt_heap_increaseKey(H, i);
+ }
+
+ return xbt_heap_pop(H);
+}
+
/**
* @brief returns the smallest key in the heap (heap unchanged)
* \param H the heap we're working on
struct xbt_heapItem tmp = H->items[i];
H->items[i] = H->items[greatest];
H->items[greatest] = tmp;
+ H->update_callback ? H->update_callback(CONTENT(H, i), i) : NULL;
i = greatest;
- } else
+ } else {
+ H->update_callback ? H->update_callback(CONTENT(H, i), i) : NULL;
return;
+ }
}
}
struct xbt_heapItem tmp = H->items[i];
H->items[i] = H->items[PARENT(i)];
H->items[PARENT(i)] = tmp;
+ H->update_callback ? H->update_callback(CONTENT(H, i), i) : NULL;
i = PARENT(i);
}
+ H->update_callback ? H->update_callback(CONTENT(H, i), i) : NULL;
return;
}
+