map->map[to] = from;
}
+/* Returns a copy of OLD, if OLD is nonnull, and otherwise returns NULL. */
+struct case_map *
+case_map_clone (const struct case_map *old)
+{
+ if (!old)
+ return NULL;
+
+ size_t n_values = caseproto_get_n_widths (old->proto);
+ struct case_map *new = xmalloc (sizeof *new);
+ *new = (struct case_map) {
+ .proto = caseproto_ref (old->proto),
+ .map = xmemdup (old->proto, n_values * sizeof *new->map),
+ };
+ return new;
+}
+
/* Destroys case map MAP. */
void
case_map_destroy (struct case_map *map)
case_map_create_input_translator (struct case_map *map,
struct casereader *subreader)
{
- return casereader_create_translator (subreader,
+ static const struct casereader_translator_class class = {
+ translate_case, destroy_case_map,
+ };
+ return casereader_translate_stateless (subreader,
case_map_get_proto (map),
- translate_case,
- destroy_case_map,
- map);
+ &class, map);
}
/* Creates and returns a new casewriter. Cases written to the
the last value. (Holes are created by deleting variables.)
All variables are compacted if EXCLUDE_CLASSES is 0, or it may
- contain one or more of (1u << DC_ORDINARY), (1u << DC_SYSTEM),
- or (1u << DC_SCRATCH) to cause the corresponding type of
- variable to be deleted during compaction. */
+ contain one or more of DC_ORDINARY, DC_SYSTEM, or DC_SCRATCH
+ to cause the corresponding type of variable to be deleted
+ during compaction. */
struct case_map *
case_map_to_compact_dict (const struct dictionary *d,
unsigned int exclude_classes)
{
- size_t n_vars = dict_get_var_cnt (d);
+ size_t n_vars = dict_get_n_vars (d);
struct caseproto *proto;
struct case_map *map;
size_t n_values;
for (i = 0; i < n_vars; i++)
{
struct variable *v = dict_get_var (d, i);
- if (!(exclude_classes & (1u << var_get_dict_class (v))))
+ if (!(exclude_classes & var_get_dict_class (v)))
insert_mapping (map, var_get_case_index (v), n_values++);
}
struct case_map_stage *
case_map_stage_create (const struct dictionary *dict)
{
- size_t n_vars = dict_get_var_cnt (dict);
+ size_t n_vars = dict_get_n_vars (dict);
struct case_map_stage *stage;
size_t i;
case_map_stage_get_case_map (const struct case_map_stage *stage)
{
struct case_map *map;
- size_t n_vars = dict_get_var_cnt (stage->dict);
+ size_t n_vars = dict_get_n_vars (stage->dict);
size_t n_values;
size_t i;
bool identity_map = true;
case_map_by_name (const struct dictionary *old,
const struct dictionary *new)
{
- struct case_map *map;
- size_t var_cnt = dict_get_var_cnt (new);
- size_t i;
-
- map = create_case_map (dict_get_proto (new));
- for (i = 0; i < var_cnt; i++)
+ size_t n_vars = dict_get_n_vars (new);
+ struct case_map *map = create_case_map (dict_get_proto (new));
+ for (size_t i = 0; i < n_vars; i++)
{
struct variable *nv = dict_get_var (new, i);
struct variable *ov = dict_lookup_var_assert (old, var_get_name (nv));
case_map_dump (const struct case_map *cm)
{
int i;
- for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i )
+ for (i = 0 ; i < caseproto_get_n_widths (cm->proto); ++i)
printf ("%d -> %d\n", i, cm->map[i]);
}