#include <stddef.h>
#include <stdbool.h>
#include "value.h"
+#include "variable.h"
/* Opaque structure that represents a case. Use accessor
functions instead of accessing any members directly. Use
struct ccase
{
struct case_data *case_data; /* Actual data. */
-#if DEBUGGING
- struct ccase *this; /* Detects unauthorized move/copy. */
-#endif
};
/* Invisible to user code. */
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,
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 *,
#ifndef DEBUGGING
#include <stdlib.h>
-#include "str.h"
+#include <libpspp/str.h>
static inline void
case_nullify (struct ccase *c)
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
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
}
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);
}
#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 */