From: Ben Pfaff Date: Sun, 5 Mar 2023 19:14:45 +0000 (-0800) Subject: case-map: Make creating a case_map destroy the stage. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1919945e08f6c44a13ed90e3959b3aa4f176b5e6;p=pspp case-map: Make creating a case_map destroy the stage. This fit the usage model in every case in practice. --- diff --git a/src/data/case-map.c b/src/data/case-map.c index 29def1f044..e6f266bcd5 100644 --- a/src/data/case-map.c +++ b/src/data/case-map.c @@ -198,7 +198,7 @@ struct case_map_stage /* Prepares and returns a "struct case_map_stage" for producing a case map for DICT. Afterward, the caller may delete, reorder, or rename variables within - DICT at will before using case_map_stage_get_case_map() to produce the case + DICT at will before using case_map_stage_to_case_map() to produce the case map. The caller must *not* add new variables to DICT. */ @@ -260,13 +260,7 @@ case_map_stage_find_var (const struct case_map_stage *stage, NOT_REACHED (); } -/* Produces a case map from STAGE, which must have been previously created with - case_map_stage_create(). The case map maps from the original case index of - the variables in STAGE's dictionary to their current case indexes. - - Returns the new case map, or a null pointer if no mapping is required (that - is, no variables were deleted or reordered). */ -struct case_map * +static struct case_map * case_map_stage_get_case_map (const struct case_map_stage *stage) { size_t n_vars = dict_get_n_vars (stage->dict); @@ -293,6 +287,22 @@ case_map_stage_get_case_map (const struct case_map_stage *stage) return map; } +/* Produces a case map from STAGE, which must have been previously created with + case_map_stage_create(). The case map maps from the original case index of + the variables in STAGE's dictionary to their current case indexes. + + Returns the new case map, or a null pointer if no mapping is required (that + is, no variables were deleted or reordered). + + Destroys STAGE. */ +struct case_map * +case_map_stage_to_case_map (struct case_map_stage *stage) +{ + struct case_map *map = case_map_stage_get_case_map (stage); + case_map_stage_destroy (stage); + return map; +} + /* Creates and returns a case map for mapping variables in OLD to variables in NEW based on their name. For every variable in NEW, there must be a variable in OLD with the same name, type, diff --git a/src/data/case-map.h b/src/data/case-map.h index a74921c38b..9baa412c5c 100644 --- a/src/data/case-map.h +++ b/src/data/case-map.h @@ -46,7 +46,7 @@ struct casewriter *case_map_create_output_translator (struct case_map *, a modified version of the same dictionary. */ struct case_map_stage *case_map_stage_create (const struct dictionary *); void case_map_stage_destroy (struct case_map_stage *); -struct case_map *case_map_stage_get_case_map (const struct case_map_stage *); +struct case_map *case_map_stage_to_case_map (struct case_map_stage *); /* For mapping cases for one dictionary to another based on variable names within the dictionary. */ diff --git a/src/data/dataset-writer.c b/src/data/dataset-writer.c index cfaa88ab5c..8666bcada3 100644 --- a/src/data/dataset-writer.c +++ b/src/data/dataset-writer.c @@ -42,7 +42,6 @@ struct dataset_writer struct dataset *ds; /* Underlying dataset. */ struct fh_lock *lock; /* Exclusive access to file handle. */ struct dictionary *dict; /* Dictionary for subwriter. */ - struct case_map *compactor; /* Compacts into dictionary. */ struct casewriter *subwriter; /* Data output. */ }; @@ -75,9 +74,9 @@ dataset_writer_open (struct file_handle *fh, writer->dict = dict_clone (dictionary); struct case_map_stage *stage = case_map_stage_create (writer->dict); dict_delete_scratch_vars (writer->dict); - writer->compactor = case_map_stage_get_case_map (stage); - case_map_stage_destroy (stage); - writer->subwriter = autopaging_writer_create (dict_get_proto (writer->dict)); + writer->subwriter = case_map_create_output_translator ( + case_map_stage_to_case_map (stage), + autopaging_writer_create (dict_get_proto (writer->dict))); casewriter = casewriter_create (dict_get_proto (writer->dict), &dataset_writer_casewriter_class, writer); @@ -92,8 +91,7 @@ dataset_writer_casewriter_write (struct casewriter *w UNUSED, void *writer_, struct ccase *c) { struct dataset_writer *writer = writer_; - casewriter_write (writer->subwriter, - case_map_execute (writer->compactor, c)); + casewriter_write (writer->subwriter, c); } /* Closes WRITER. */ diff --git a/src/data/dataset.c b/src/data/dataset.c index 0e88c2c186..2af19bd756 100644 --- a/src/data/dataset.c +++ b/src/data/dataset.c @@ -360,8 +360,7 @@ dataset_delete_vars (struct dataset *ds, struct variable **vars, size_t n) struct case_map_stage *stage = case_map_stage_create (ds->dict); dict_delete_vars (ds->dict, vars, n); ds->source = case_map_create_input_translator ( - case_map_stage_get_case_map (stage), ds->source); - case_map_stage_destroy (stage); + case_map_stage_to_case_map (stage), ds->source); caseinit_clear (ds->caseinit); caseinit_mark_as_preinited (ds->caseinit, ds->dict); } @@ -382,8 +381,7 @@ dataset_reorder_vars (struct dataset *ds, struct variable **vars, size_t n) struct case_map_stage *stage = case_map_stage_create (ds->dict); dict_reorder_vars (ds->dict, vars, n); ds->source = case_map_create_input_translator ( - case_map_stage_get_case_map (stage), ds->source); - case_map_stage_destroy (stage); + case_map_stage_to_case_map (stage), ds->source); caseinit_clear (ds->caseinit); caseinit_mark_as_preinited (ds->caseinit, ds->dict); } @@ -496,9 +494,8 @@ proc_open_filtering (struct dataset *ds, bool filter) struct case_map_stage *stage = case_map_stage_create (pd); dict_delete_scratch_vars (pd); ds->sink = case_map_create_output_translator ( - case_map_stage_get_case_map (stage), + case_map_stage_to_case_map (stage), autopaging_writer_create (dict_get_proto (pd))); - case_map_stage_destroy (stage); dict_unref (pd); } else diff --git a/src/language/commands/get.c b/src/language/commands/get.c index ea6323ba40..79d8dc40cd 100644 --- a/src/language/commands/get.c +++ b/src/language/commands/get.c @@ -143,8 +143,7 @@ parse_read_command (struct lexer *lexer, struct dataset *ds, goto error; } - map = case_map_stage_get_case_map (stage); - case_map_stage_destroy (stage); + map = case_map_stage_to_case_map (stage); if (map != NULL) reader = case_map_create_input_translator (map, reader); diff --git a/src/language/commands/save-translate.c b/src/language/commands/save-translate.c index 600a2156bd..48b5d4507a 100644 --- a/src/language/commands/save-translate.c +++ b/src/language/commands/save-translate.c @@ -254,10 +254,8 @@ cmd_save_translate (struct lexer *lexer, struct dataset *ds) goto error; fh_unref (handle); - struct case_map *map = case_map_stage_get_case_map (stage); - case_map_stage_destroy (stage); - if (map != NULL) - writer = case_map_create_output_translator (map, writer); + writer = case_map_create_output_translator ( + case_map_stage_to_case_map (stage), writer); dict_unref (dict); casereader_transfer (proc_open_filtering (ds, !retain_unselected), writer); diff --git a/src/language/commands/save.c b/src/language/commands/save.c index d892c536ee..8dbb6cd3d1 100644 --- a/src/language/commands/save.c +++ b/src/language/commands/save.c @@ -341,10 +341,8 @@ parse_write_command (struct lexer *lexer, struct dataset *ds, goto error; } - map = case_map_stage_get_case_map (stage); - case_map_stage_destroy (stage); - if (map != NULL) - writer = case_map_create_output_translator (map, writer); + writer = case_map_create_output_translator ( + case_map_stage_to_case_map (stage), writer); dict_unref (dict); fh_unref (handle); diff --git a/utilities/pspp-convert.c b/utilities/pspp-convert.c index 6599ba3fc8..0f77998044 100644 --- a/utilities/pspp-convert.c +++ b/utilities/pspp-convert.c @@ -319,8 +319,7 @@ main (int argc, char *argv[]) } reader = case_map_create_input_translator ( - case_map_stage_get_case_map (stage), reader); - case_map_stage_destroy (stage); + case_map_stage_to_case_map (stage), reader); if (!strcmp (output_format, "csv") || !strcmp (output_format, "txt")) {