X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcase.h;h=ff2ecfb7e07e0f726c3680a1460bc4d34b2ddda8;hb=68af3306969829d17a05cfab5c9d46cb920b7607;hp=6f6abeb50938a67f10c710a3d38ddeea59669c5d;hpb=dcf9b154cbcaa35c3d8459a201b77eec8bcb30bd;p=pspp diff --git a/src/data/case.h b/src/data/case.h index 6f6abeb509..ff2ecfb7e0 100644 --- a/src/data/case.h +++ b/src/data/case.h @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 2004 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -23,6 +22,7 @@ #include #include #include "value.h" +#include "variable.h" /* Opaque structure that represents a case. Use accessor functions instead of accessing any members directly. Use @@ -30,9 +30,6 @@ struct ccase { struct case_data *case_data; /* Actual data. */ -#if GLOBAL_DEBUGGING - struct ccase *this; /* Detects unauthorized move/copy. */ -#endif }; /* Invisible to user code. */ @@ -43,7 +40,7 @@ struct case_data union value values[1]; /* Values. */ }; -#ifdef GLOBAL_DEBUGGING +#ifdef DEBUGGING #define CASE_INLINE #else #define CASE_INLINE static @@ -60,8 +57,8 @@ CASE_INLINE void case_destroy (struct ccase *); void case_resize (struct ccase *, size_t old_cnt, size_t new_cnt); void case_swap (struct ccase *, struct ccase *); -int case_try_create (struct ccase *, size_t value_cnt); -int case_try_clone (struct ccase *, const struct ccase *); +bool case_try_create (struct ccase *, size_t value_cnt); +bool case_try_clone (struct ccase *, const struct ccase *); CASE_INLINE void case_copy (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, @@ -71,11 +68,19 @@ CASE_INLINE void case_to_values (const struct ccase *, union value *, size_t); CASE_INLINE void case_from_values (struct ccase *, const union value *, size_t); -CASE_INLINE const union value *case_data (const struct ccase *, size_t idx); -CASE_INLINE double case_num (const struct ccase *, size_t idx); -CASE_INLINE const char *case_str (const struct ccase *, size_t idx); +static inline const union value *case_data (const struct ccase *, + const struct variable *); +static inline double case_num (const struct ccase *, const struct variable *); +static inline const char *case_str (const struct ccase *, + const struct variable *); +static inline union value *case_data_rw (struct ccase *, + const struct variable *); -CASE_INLINE union value *case_data_rw (struct ccase *, size_t idx); +CASE_INLINE const union value *case_data_idx (const struct ccase *, + size_t idx); +CASE_INLINE double case_num_idx (const struct ccase *, size_t idx); +CASE_INLINE const char *case_str_idx (const struct ccase *, size_t idx); +CASE_INLINE union value *case_data_rw_idx (struct ccase *, size_t idx); struct variable; int case_compare (const struct ccase *, const struct ccase *, @@ -89,9 +94,9 @@ union value *case_data_all_rw (struct ccase *); void case_unshare (struct ccase *); -#ifndef GLOBAL_DEBUGGING +#ifndef DEBUGGING #include -#include "str.h" +#include static inline void case_nullify (struct ccase *c) @@ -115,8 +120,11 @@ case_clone (struct ccase *clone, const struct ccase *orig) static inline void case_move (struct ccase *dst, struct ccase *src) { - *dst = *src; - src->case_data = NULL; + if (dst != src) + { + *dst = *src; + src->case_data = NULL; + } } static inline void @@ -132,12 +140,14 @@ case_copy (struct ccase *dst, size_t dst_idx, const struct ccase *src, size_t src_idx, size_t value_cnt) { - if (dst->case_data->ref_cnt > 1) - case_unshare (dst); if (dst->case_data != src->case_data || dst_idx != src_idx) - memmove (dst->case_data->values + dst_idx, - src->case_data->values + src_idx, - sizeof *dst->case_data->values * value_cnt); + { + if (dst->case_data->ref_cnt > 1) + case_unshare (dst); + memmove (dst->case_data->values + dst_idx, + src->case_data->values + src_idx, + sizeof *dst->case_data->values * value_cnt); + } } static inline void @@ -159,30 +169,70 @@ case_from_values (struct ccase *c, const union value *input, } static inline const union value * -case_data (const struct ccase *c, size_t idx) +case_data_idx (const struct ccase *c, size_t idx) { return &c->case_data->values[idx]; } static inline double -case_num (const struct ccase *c, size_t idx) +case_num_idx (const struct ccase *c, size_t idx) { return c->case_data->values[idx].f; } static inline const char * -case_str (const struct ccase *c, size_t idx) +case_str_idx (const struct ccase *c, size_t idx) { return c->case_data->values[idx].s; } static inline union value * -case_data_rw (struct ccase *c, size_t idx) +case_data_rw_idx (struct ccase *c, size_t idx) { if (c->case_data->ref_cnt > 1) case_unshare (c); return &c->case_data->values[idx]; } -#endif /* !GLOBAL_DEBUGGING */ +#endif /* !DEBUGGING */ + +/* Returns a pointer to the `union value' used for the + element of C for variable V. + Case C must be drawn from V's dictionary. + The caller must not modify the returned data. */ +static inline const union value * +case_data (const struct ccase *c, const struct variable *v) +{ + return case_data_idx (c, var_get_case_index (v)); +} + +/* Returns the numeric value of the `union value' in C for + variable V. + Case C must be drawn from V's dictionary. */ +static inline double +case_num (const struct ccase *c, const struct variable *v) +{ + return case_num_idx (c, var_get_case_index (v)); +} + +/* Returns the string value of the `union value' in C for + variable V. + Case C must be drawn from V's dictionary. + (Note that the value is not null-terminated.) + The caller must not modify the return value. */ +static inline const char * +case_str (const struct ccase *c, const struct variable *v) +{ + return case_str_idx (c, var_get_case_index (v)); +} + +/* Returns a pointer to the `union value' used for the + element of C for variable V. + Case C must be drawn from V's dictionary. + The caller is allowed to modify the returned data. */ +static inline union value * +case_data_rw (struct ccase *c, const struct variable *v) +{ + return case_data_rw_idx (c, var_get_case_index (v)); +} #endif /* case.h */