X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fmerge.c;h=e2f2d49570177da5f692b12cf34da7ea39111c5e;hb=3640237a5fc890a84cb814fbe8bf6fd9299624e4;hp=2ff57c6e5ba6fa0a88a9237f95782cb55332bbd6;hpb=a1efcf97ca2f75f4be6a0389ff2372c03ed2d4e1;p=pspp diff --git a/src/math/merge.c b/src/math/merge.c index 2ff57c6e5b..e2f2d49570 100644 --- a/src/math/merge.c +++ b/src/math/merge.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,17 +19,17 @@ performance regression. */ #include -#include +#include "math/merge.h" -#include -#include -#include -#include -#include -#include -#include +#include "data/case.h" +#include "data/casereader.h" +#include "data/casewriter.h" +#include "data/subcase.h" +#include "libpspp/array.h" +#include "libpspp/assertion.h" +#include "libpspp/taint.h" -#include "xalloc.h" +#include "gl/xalloc.h" #define MAX_MERGE_ORDER 7 @@ -43,19 +43,19 @@ struct merge { struct subcase ordering; struct merge_input inputs[MAX_MERGE_ORDER]; - size_t input_cnt; - size_t value_cnt; + size_t n_inputs; + struct caseproto *proto; }; static void do_merge (struct merge *m); struct merge * -merge_create (const struct subcase *ordering, size_t value_cnt) +merge_create (const struct subcase *ordering, const struct caseproto *proto) { struct merge *m = xmalloc (sizeof *m); subcase_clone (&m->ordering, ordering); - m->input_cnt = 0; - m->value_cnt = value_cnt; + m->n_inputs = 0; + m->proto = caseproto_ref (proto); return m; } @@ -66,9 +66,10 @@ merge_destroy (struct merge *m) { size_t i; - subcase_destroy (&m->ordering); - for (i = 0; i < m->input_cnt; i++) + subcase_uninit (&m->ordering); + for (i = 0; i < m->n_inputs; i++) casereader_destroy (m->inputs[i].reader); + caseproto_unref (m->proto); free (m); } } @@ -77,27 +78,27 @@ void merge_append (struct merge *m, struct casereader *r) { r = casereader_rename (r); - m->inputs[m->input_cnt++].reader = r; - if (m->input_cnt >= MAX_MERGE_ORDER) + m->inputs[m->n_inputs++].reader = r; + if (m->n_inputs >= MAX_MERGE_ORDER) do_merge (m); } struct casereader * merge_make_reader (struct merge *m) { - struct casereader *r; + struct casereader *r = NULL; - if (m->input_cnt > 1) + if (m->n_inputs > 1) do_merge (m); - if (m->input_cnt == 1) + if (m->n_inputs == 1) { r = m->inputs[0].reader; - m->input_cnt = 0; + m->n_inputs = 0; } - else if (m->input_cnt == 0) + else if (m->n_inputs == 0) { - struct casewriter *writer = mem_writer_create (m->value_cnt); + struct casewriter *writer = mem_writer_create (m->proto); r = casewriter_make_reader (writer); } else @@ -117,8 +118,8 @@ read_input_case (struct merge *m, size_t idx) else { casereader_destroy (i->reader); - remove_element (m->inputs, m->input_cnt, sizeof *m->inputs, idx); - m->input_cnt--; + remove_element (m->inputs, m->n_inputs, sizeof *m->inputs, idx); + m->n_inputs--; return false; } } @@ -129,22 +130,22 @@ do_merge (struct merge *m) struct casewriter *w; size_t i; - assert (m->input_cnt > 1); + assert (m->n_inputs > 1); - w = tmpfile_writer_create (m->value_cnt); - for (i = 0; i < m->input_cnt; i++) + w = tmpfile_writer_create (m->proto); + for (i = 0; i < m->n_inputs; i++) taint_propagate (casereader_get_taint (m->inputs[i].reader), casewriter_get_taint (w)); - for (i = 0; i < m->input_cnt; ) + for (i = 0; i < m->n_inputs;) if (read_input_case (m, i)) i++; - while (m->input_cnt > 0) + while (m->n_inputs > 0) { size_t min; min = 0; - for (i = 1; i < m->input_cnt; i++) + for (i = 1; i < m->n_inputs; i++) if (subcase_compare_3way (&m->ordering, m->inputs[i].c, &m->ordering, m->inputs[min].c) < 0) min = i; @@ -153,7 +154,7 @@ do_merge (struct merge *m) read_input_case (m, min); } - m->input_cnt = 1; + m->n_inputs = 1; m->inputs[0].reader = casewriter_make_reader (w); }