1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2008, 2009 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 #ifndef DATA_SUBCASE_H
18 #define DATA_SUBCASE_H 1
28 enum subcase_direction
30 SC_ASCEND, /* A, B, C, ..., X, Y, Z. */
31 SC_DESCEND /* Z, Y, X, ..., C, B, A. */
34 /* A value within a case. */
37 size_t case_index; /* Starting position in the case. */
38 int width; /* 0=numeric, otherwise string width. */
39 enum subcase_direction direction; /* Sort order. */
42 /* A subcase specifies how to draw values from a case. */
45 struct subcase_field *fields;
48 struct caseproto *proto; /* Created lazily. */
50 #define SUBCASE_EMPTY_INITIALIZER { .fields = NULL }
52 void subcase_init_empty (struct subcase *);
53 void subcase_init_vars (struct subcase *,
54 const struct variable *const *, size_t n_vars);
55 void subcase_init_var (struct subcase *,
56 const struct variable *, enum subcase_direction);
57 void subcase_init (struct subcase *, int index, int width,
58 enum subcase_direction);
60 void subcase_clone (struct subcase *, const struct subcase *);
61 void subcase_clear (struct subcase *);
62 void subcase_uninit (struct subcase *);
64 bool subcase_contains (const struct subcase *, int case_index);
65 bool subcase_contains_var (const struct subcase *, const struct variable *);
67 bool subcase_add (struct subcase *, int case_index, int width,
68 enum subcase_direction direction);
69 bool subcase_add_var (struct subcase *, const struct variable *,
70 enum subcase_direction);
72 void subcase_add_always (struct subcase *sc, int case_index, int width,
73 enum subcase_direction direction);
74 void subcase_add_var_always (struct subcase *, const struct variable *,
75 enum subcase_direction);
76 void subcase_add_vars_always (struct subcase *,
77 const struct variable *const *, size_t n_vars);
78 void subcase_add_proto_always (struct subcase *, const struct caseproto *);
80 const struct caseproto *subcase_get_proto (const struct subcase *);
82 static inline bool subcase_is_empty (const struct subcase *);
83 static inline size_t subcase_get_n_fields (const struct subcase *);
85 static inline size_t subcase_get_case_index (const struct subcase *,
87 static inline enum subcase_direction subcase_get_direction (
88 const struct subcase *, size_t idx);
90 bool subcase_conformable (const struct subcase *, const struct subcase *);
92 void subcase_extract (const struct subcase *, const struct ccase *,
94 void subcase_inject (const struct subcase *,
95 const union value *values, struct ccase *);
96 void subcase_copy (const struct subcase *src_sc, const struct ccase *src,
97 const struct subcase *dst_sc, struct ccase *dst);
99 int subcase_compare_3way (const struct subcase *a_sc, const struct ccase *a,
100 const struct subcase *b_sc, const struct ccase *b);
101 int subcase_compare_3way_xc (const struct subcase *,
102 const union value *a, const struct ccase *b);
103 int subcase_compare_3way_cx (const struct subcase *,
104 const struct ccase *a, const union value *b);
105 int subcase_compare_3way_xx (const struct subcase *,
106 const union value *a, const union value *b);
107 bool subcase_equal (const struct subcase *a_sc, const struct ccase *a,
108 const struct subcase *b_sc, const struct ccase *b);
109 bool subcase_equal_xc (const struct subcase *,
110 const union value *a, const struct ccase *b);
111 bool subcase_equal_cx (const struct subcase *,
112 const struct ccase *a, const union value *b);
113 bool subcase_equal_xx (const struct subcase *,
114 const union value *a, const union value *b);
117 subcase_get_case_index (const struct subcase *sc, size_t idx)
119 return sc->fields[idx].case_index;
122 static inline enum subcase_direction
123 subcase_get_direction (const struct subcase *sc, size_t idx)
125 return sc->fields[idx].direction;
129 subcase_is_empty (const struct subcase *sc)
131 return sc->n_fields == 0;
135 subcase_get_n_fields (const struct subcase *sc)
140 #endif /* data/subcase.h */