/* Casereader that applies a user-supplied function to translate
each case into another in a stateless fashion. */
+/* A statelessly translating casereader. */
+struct casereader_stateless_translator
+ {
+ struct casereader *subreader; /* Source of input cases. */
+
+ casenumber case_offset;
+ const struct casereader_translator_class *class;
+ void *aux;
+ };
+
static const struct casereader_random_class
casereader_stateless_translator_class;
const struct casereader_translator_class *class,
void *aux)
{
- struct casereader_translator *ct = xmalloc (sizeof *ct);
- *ct = (struct casereader_translator) {
+ struct casereader_stateless_translator *cst = xmalloc (sizeof *cst);
+ *cst = (struct casereader_stateless_translator) {
.subreader = casereader_rename (subreader),
.class = class,
.aux = aux,
};
-
struct casereader *reader = casereader_create_random (
- output_proto, casereader_get_n_cases (ct->subreader),
- &casereader_stateless_translator_class, ct);
- taint_propagate (casereader_get_taint (ct->subreader),
+ output_proto, casereader_get_n_cases (cst->subreader),
+ &casereader_stateless_translator_class, cst);
+ taint_propagate (casereader_get_taint (cst->subreader),
casereader_get_taint (reader));
return reader;
}
/* Internal read function for stateless translating casereader. */
static struct ccase *
casereader_stateless_translator_read (struct casereader *reader UNUSED,
- void *ct_, casenumber idx)
+ void *cst_, casenumber idx)
{
- struct casereader_translator *ct = ct_;
- struct ccase *tmp = casereader_peek (ct->subreader, idx);
+ struct casereader_stateless_translator *cst = cst_;
+ struct ccase *tmp = casereader_peek (cst->subreader, idx);
if (tmp != NULL)
- tmp = ct->class->translate (tmp, ct->aux);
+ tmp = cst->class->translate (tmp, cst->aux);
return tmp;
}
/* Internal destroy function for translating casereader. */
static void
casereader_stateless_translator_destroy (struct casereader *reader UNUSED,
- void *ct_)
+ void *cst_)
{
- struct casereader_translator *ct = ct_;
- casereader_destroy (ct->subreader);
- ct->class->destroy (ct->aux);
- free (ct);
+ struct casereader_stateless_translator *cst = cst_;
+ casereader_destroy (cst->subreader);
+ cst->class->destroy (cst->aux);
+ free (cst);
+}
+
+static void
+casereader_stateless_translator_advance (struct casereader *reader UNUSED,
+ void *cst_, casenumber n)
+{
+ struct casereader_stateless_translator *cst = cst_;
+ cst->case_offset += casereader_advance (cst->subreader, n);
}
/* Casereader class for stateless translating casereader. */
{
casereader_stateless_translator_read,
casereader_stateless_translator_destroy,
- NULL,
+ casereader_stateless_translator_advance,
};
\f