X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter%2Fs-twoway.h;h=ef23a2e9339806b51bc2622379e0b9c6417d24d2;hb=5f2e7e93768113f1e80ac2502e670632762fb696;hp=16a6720b10d75526f272c5193d2a43402003b0d8;hpb=baa9f9a3368c8d318b9711340727f822d8fc8a34;p=libucw.git diff --git a/lib/sorter/s-twoway.h b/lib/sorter/s-twoway.h index 16a6720b..ef23a2e9 100644 --- a/lib/sorter/s-twoway.h +++ b/lib/sorter/s-twoway.h @@ -7,9 +7,6 @@ * of the GNU Lesser General Public License. */ -/* FIXME: There is a plenty of room for further optimization */ -/* FIXME: Swap outputs if there already are some runs? */ - static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket **ins, struct sort_bucket **outs) { struct fastbuf *fin1, *fin2, *fout1, *fout2, *ftmp; @@ -20,11 +17,11 @@ static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket int comp; uns run_count = 0; - fin1 = sbuck_open_read(ins[0]); + fin1 = sbuck_read(ins[0]); next1 = P(read_key)(fin1, kin1); - if (sbuck_can_read(ins[1])) + if (sbuck_have(ins[1])) { - fin2 = sbuck_open_read(ins[1]); + fin2 = sbuck_read(ins[1]); next2 = P(read_key)(fin2, kin2); } else @@ -50,14 +47,17 @@ static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket if (unlikely(!fout1)) { if (!fout2) - fout1 = sbuck_open_write(outs[0]); + fout1 = sbuck_write(outs[0]); else if (outs[1]) - fout1 = sbuck_open_write(outs[1]); + fout1 = sbuck_write(outs[1]); else fout1 = fout2; } run_count++; } +#ifdef SORT_ASSERT_UNIQUE + ASSERT(comp != 0); +#endif if (comp LESS 0) { P(copy_data)(kin1, fin1, fout1); @@ -66,7 +66,7 @@ static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket run1 = next1 && (P(compare)(kprev1, kin1) LESS 0); kout = kprev1; } -#ifdef SORT_MERGE +#ifdef SORT_UNIFY else if (comp == 0) { P(key) *mkeys[] = { kin1, kin2 }; @@ -80,10 +80,6 @@ static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket run2 = next2 && (P(compare)(kprev2, kin2) LESS 0); kout = kprev2; } -#endif -#ifdef SORT_ASSERT_UNIQUE - else if (unlikely(comp == 0)) - ASSERT(0); #endif else { @@ -100,8 +96,6 @@ static void P(twoway_merge)(struct sort_context *ctx UNUSED, struct sort_bucket } } - sbuck_close_read(ins[0]); - sbuck_close_read(ins[1]); if (fout2 && fout2 != fout1) outs[1]->runs += run_count / 2; if (fout1)