X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcase.c;h=76769223980e0f820081c2aa6cb1df676bf9937e;hb=17ca35e4ca8abf4ba0c0ae82920b985fa17648cf;hp=dc4029268ebf981bc10d96ecccf7c88eb53dd71a;hpb=3bbb4370239deb29ebbf813d258aef6249e2a431;p=pspp diff --git a/src/data/case.c b/src/data/case.c index dc4029268e..7676922398 100644 --- a/src/data/case.c +++ b/src/data/case.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2004, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,22 +16,30 @@ #include -#include +#include "data/case.h" #include #include #include -#include -#include -#include -#include +#include "data/value.h" +#include "data/variable.h" +#include "libpspp/assertion.h" +#include "libpspp/str.h" -#include "minmax.h" -#include "xalloc.h" +#include "gl/minmax.h" +#include "gl/xalloc.h" + +/* Set this flag to 1 to copy cases instead of ref counting them. + This is sometimes helpful in debugging situations. */ +#define DEBUG_CASEREFS 0 + +#if DEBUG_CASEREFS +#warning "Caseref debug enabled. CASES ARE NOT BEING SHARED!!" +#endif static size_t case_size (const struct caseproto *); -static bool variable_matches_case (const struct ccase *, +static void assert_variable_matches_case (const struct ccase *, const struct variable *); static void copy_forward (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, @@ -80,6 +88,19 @@ case_clone (const struct ccase *c) return case_unshare (case_ref (c)); } +/* Increments case C's reference count and returns C. Afterward, + case C is shared among its reference count holders. */ +struct ccase * +case_ref (const struct ccase *c_) +{ + struct ccase *c = CONST_CAST (struct ccase *, c_); + c->ref_cnt++; +#if DEBUG_CASEREFS + c = case_unshare__ (c); +#endif + return c; +} + /* Returns an estimate of the number of bytes of memory that would be consumed in creating a case based on PROTO. The estimate includes typical overhead from malloc() in addition @@ -243,7 +264,7 @@ case_copy_in (struct ccase *c, const union value * case_data (const struct ccase *c, const struct variable *v) { - assert (variable_matches_case (c, v)); + assert_variable_matches_case (c, v); return &c->values[var_get_case_index (v)]; } @@ -265,7 +286,7 @@ case_data_idx (const struct ccase *c, size_t idx) union value * case_data_rw (struct ccase *c, const struct variable *v) { - assert (variable_matches_case (c, v)); + assert_variable_matches_case (c, v); assert (!case_is_shared (c)); return &c->values[var_get_case_index (v)]; } @@ -289,7 +310,7 @@ case_data_rw_idx (struct ccase *c, size_t idx) double case_num (const struct ccase *c, const struct variable *v) { - assert (variable_matches_case (c, v)); + assert_variable_matches_case (c, v); return c->values[var_get_case_index (v)].f; } @@ -311,8 +332,8 @@ case_num_idx (const struct ccase *c, size_t idx) const uint8_t * case_str (const struct ccase *c, const struct variable *v) { + assert_variable_matches_case (c, v); size_t idx = var_get_case_index (v); - assert (variable_matches_case (c, v)); return value_str (&c->values[idx], caseproto_get_width (c->proto, idx)); } @@ -339,8 +360,8 @@ case_str_idx (const struct ccase *c, size_t idx) uint8_t * case_str_rw (struct ccase *c, const struct variable *v) { + assert_variable_matches_case (c, v); size_t idx = var_get_case_index (v); - assert (variable_matches_case (c, v)); assert (!case_is_shared (c)); return value_str_rw (&c->values[idx], caseproto_get_width (c->proto, idx)); } @@ -384,7 +405,7 @@ case_compare_2dict (const struct ccase *ca, const struct ccase *cb, const union value *va = case_data (ca, *vap); const union value *vb = case_data (cb, *vbp); assert (var_get_width (*vap) == var_get_width (*vbp)); - cmp = value_compare_3way (va, vb, var_get_width (*vap)); + cmp = value_compare_3way (va, vb, var_get_width (*vap)); } return cmp; } @@ -447,12 +468,12 @@ case_size (const struct caseproto *proto) or write data in C. Useful in assertions. */ -static bool UNUSED -variable_matches_case (const struct ccase *c, const struct variable *v) +static void +assert_variable_matches_case (const struct ccase *c, const struct variable *v) { size_t case_idx = var_get_case_index (v); - return (case_idx < caseproto_get_n_widths (c->proto) - && caseproto_get_width (c->proto, case_idx) == var_get_width (v)); + assert (case_idx < caseproto_get_n_widths (c->proto)); + assert (caseproto_get_width (c->proto, case_idx) == var_get_width (v)); } /* Internal helper function for case_copy(). */