return MEASURE_UNKNOWN;
}
-static enum trns_result
-add_measurement_level_trns_proc (void *mlt_, struct ccase **c,
- casenumber case_nr UNUSED)
+static void
+measurement_level_trns_run (struct measurement_level_trns *mlt,
+ const struct ccase *c)
{
- struct measurement_level_trns *mlt = mlt_;
for (size_t i = 0; i < mlt->n_vars; )
{
struct measurement_level_var *mlv = &mlt->vars[i];
- double value = case_num (*c, mlv->var);
+ double value = case_num (c, mlv->var);
enum measure m = add_measurement_level_trns_proc__ (mlv, value);
if (m != MEASURE_UNKNOWN)
{
else
i++;
}
+}
+
+static enum trns_result
+add_measurement_level_trns_proc (void *mlt_, struct ccase **c,
+ casenumber case_nr UNUSED)
+{
+ struct measurement_level_trns *mlt = mlt_;
+ measurement_level_trns_run (mlt, *c);
return TRNS_CONTINUE;
}
free (mlt);
}
-static bool
-add_measurement_level_trns_free (void *mlt_)
+static void
+measurement_level_trns_commit (struct measurement_level_trns *mlt)
{
- struct measurement_level_trns *mlt = mlt_;
for (size_t i = 0; i < mlt->n_vars; i++)
{
struct measurement_level_var *mlv = &mlt->vars[i];
var_set_measure (mlv->var, add_measurement_level_var_interpret (mlv));
}
+}
+
+static bool
+add_measurement_level_trns_free (void *mlt_)
+{
+ struct measurement_level_trns *mlt = mlt_;
+ measurement_level_trns_commit (mlt);
add_measurement_level_trns_free__ (mlt);
return true;
}
.destroy = add_measurement_level_trns_free,
};
-static void
-add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
+static struct measurement_level_trns *
+create_measurement_level_trns (struct dictionary *dict)
{
struct measurement_level_var *mlvs = NULL;
size_t n_mlvs = 0;
hmap_init (mlv->values);
}
if (!n_mlvs)
- return;
+ return NULL;
struct measurement_level_trns *mlt = xmalloc (sizeof *mlt);
*mlt = (struct measurement_level_trns) {
.vars = mlvs,
.n_vars = n_mlvs,
};
- add_transformation (ds, &add_measurement_level_trns_class, mlt);
+ return mlt;
+}
+
+static void
+add_measurement_level_trns (struct dataset *ds, struct dictionary *dict)
+{
+ struct measurement_level_trns *mlt = create_measurement_level_trns (dict);
+ if (mlt)
+ add_transformation (ds, &add_measurement_level_trns_class, mlt);
}
static void
add_measurement_level_trns_free__ (mlt);
chain->n--;
}
+
+bool
+measure_guesser_is_needed (struct dataset *ds)
+{
+ struct measurement_level_trns *mlt
+ = create_measurement_level_trns (dataset_dict (ds));
+ if (mlt)
+ {
+ add_measurement_level_trns_free__ (mlt);
+ return true;
+ }
+ return false;
+}
+
+void
+measure_guesser_run (struct dataset *ds, const struct casereader *reader)
+{
+ struct measurement_level_trns *mlt
+ = create_measurement_level_trns (dataset_dict (ds));
+ if (!mlt)
+ return;
+
+ struct casereader *r = casereader_clone (reader);
+ while (mlt->n_vars > 0)
+ {
+ struct ccase *c = casereader_read (r);
+ measurement_level_trns_run (mlt, c);
+ case_unref (c);
+ }
+ casereader_destroy (r);
+
+ measurement_level_trns_commit (mlt);
+ add_measurement_level_trns_free__ (mlt);
+}
\f
static void
dataset_changed__ (struct dataset *ds)