static int mergepool_switch_to_input(MERGEPOOL* mp);
-MERGEPOOL* mergepool_new()
+MERGEPOOL* mergepool_new(size_t reg_size, CMP_FUNC cmp)
{
MERGEPOOL* mp = malloc(sizeof(MERGEPOOL));
if (!mp) return 0; /* ERROR: no hay más memoria */
mp->pool = 0;
mp->size = 0;
mp->mode = OUTPUT;
+ mp->reg_size = reg_size;
+ mp->cmp = cmp;
return mp;
}
MERGEFILE* mergepool_add_file(MERGEPOOL* mp)
{
MERGEFILE** pool;
- MERGEFILE* new_mf = mergefile_new();
+ MERGEFILE* new_mf = mergefile_new(mp->reg_size);
assert(mp);
assert(mp->mode == OUTPUT);
if (!new_mf) return 0;
return mp->pool[mp->size++];
}
-int mergepool_append_data(MERGEPOOL* mp, int data)
+int mergepool_append_data(MERGEPOOL* mp, void* data)
{
+ assert(data);
assert(mp);
assert(mp->pool);
assert(mp->pool[mp->size-1]);
return mergefile_push(mp->pool[mp->size-1], data);
}
-int mergepool_pop_min(MERGEPOOL* mp, int* min)
+void* mergepool_pop_min(MERGEPOOL* mp)
{
+ void* min;
int i;
- int assigned = -1;
+ int assigned = -1; /* no asignado */
assert(mp);
assert(mp->pool);
assert(mp->size);
+ /* si todavía está en modo OUTPUT, lo pasó a INPUT */
if (mp->mode == OUTPUT) {
mergepool_switch_to_input(mp);
}
+ /* busco el mínimo */
for (i = 0; i < mp->size; i++) {
- if (mergefile_has_more(mp->pool[i])
- && ((assigned == -1) || mergefile_peek(mp->pool[i]) < *min)) {
- assigned = i;
- *min = mergefile_peek(mp->pool[i]);
+ if (mergefile_has_more(mp->pool[i]) &&
+ ((assigned == -1) || LT(mp, mergefile_peek(mp->pool[i]), min))){
+ assigned = i; /* se asigno el valor del archivo i */
+ min = mergefile_peek(mp->pool[i]);
}
}
+ /* si fue asignado */
if (assigned != -1) {
mergefile_pop(mp->pool[assigned]); /* lo saco del archivo */
- return 1; /* OK, se obtuvo un mínimo */
+ return min; /* OK, se obtuvo un mínimo */
}
- return 0; /* No hay más */
+ return 0; /* si no fue asignado es porque no hay más archivos con datos */
}
int mergepool_switch_to_input(MERGEPOOL* mp)
assert(mp);
assert(mp->pool);
for (i = 0; i < mp->size; i++) {
- if (!mergefile_switch_to_input(mp->pool[i])) return 0;
+ /* lo paso a modo INPUT y si hubo error salgo */
+ if (!mergefile_switch_to_input(mp->pool[i])) return 0; /* ERROR */
}
mp->mode = INPUT;
return 1; /* OK */