X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdictionary.c;h=bf467440aa7ce294cb4f5a9aa7d0fdfef590d01a;hb=93d4e1865e8e3e2c62bddad822869eedf2e457e0;hp=e9a5a01450363bbdc8055abf7a760731de12facf;hpb=b0bf9b1b0f727fafac4296a048e3f45db5936f81;p=pspp diff --git a/src/data/dictionary.c b/src/data/dictionary.c index e9a5a01450..bf467440aa 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -281,7 +281,7 @@ dict_create_var (struct dictionary *d, const char *name, int width) v->type = width == 0 ? NUMERIC : ALPHA; v->width = width; v->fv = d->next_value_idx; - v->nv = width_to_bytes(width) / MAX_SHORT_STRING ; + v->nv = width == 0 ? 1 : DIV_RND_UP (width, MAX_SHORT_STRING); v->leave = dict_class_from_id (v->name) == DC_SCRATCH; v->index = d->var_cnt; mv_init (&v->miss, width); @@ -855,19 +855,44 @@ dict_get_compacted_idx_to_fv (const struct dictionary *d) } /* Returns true if a case for dictionary D would be smaller after - compaction, false otherwise. Compacting a case eliminates + compacting, false otherwise. Compacting a case eliminates "holes" between values and after the last value. Holes are created by deleting variables (or by scratch variables). The return value may differ from whether compacting a case - from dictionary D would *change* the case: compaction could + from dictionary D would *change* the case: compacting could rearrange values even if it didn't reduce space requirements. */ bool -dict_needs_compaction (const struct dictionary *d) +dict_compacting_would_shrink (const struct dictionary *d) { return dict_get_compacted_value_cnt (d) < dict_get_next_value_idx (d); } + +/* Returns true if a case for dictionary D would be smaller after + compacting, false otherwise. Compacting a case eliminates + "holes" between values and after the last value. Holes are + created by deleting variables (or by scratch variables). + + The return value may differ from whether compacting a case + from dictionary D would *shrink* the case: compacting could + rearrange values without reducing space requirements. */ +bool +dict_compacting_would_change (const struct dictionary *d) +{ + size_t case_idx; + size_t i; + + case_idx = 0; + for (i = 0; i < dict_get_var_cnt (d); i++) + { + struct variable *v = dict_get_var (d, i); + if (v->fv != case_idx) + return true; + case_idx += v->nv; + } + return false; +} /* How to copy a contiguous range of values between cases. */ struct copy_map