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 int subcase_get_width (const struct subcase
*, size_t idx
);
88 static inline enum subcase_direction
subcase_get_direction (
89 const struct subcase
*, size_t idx
);
91 bool subcase_conformable (const struct subcase
*, const struct subcase
*);
93 void subcase_extract (const struct subcase
*, const struct ccase
*,
95 void subcase_inject (const struct subcase
*,
96 const union value
*values
, struct ccase
*);
97 void subcase_copy (const struct subcase
*src_sc
, const struct ccase
*src
,
98 const struct subcase
*dst_sc
, struct ccase
*dst
);
100 int subcase_compare_3way (const struct subcase
*a_sc
, const struct ccase
*a
,
101 const struct subcase
*b_sc
, const struct ccase
*b
);
102 int subcase_compare_3way_xc (const struct subcase
*,
103 const union value
*a
, const struct ccase
*b
);
104 int subcase_compare_3way_cx (const struct subcase
*,
105 const struct ccase
*a
, const union value
*b
);
106 int subcase_compare_3way_xx (const struct subcase
*,
107 const union value
*a
, const union value
*b
);
108 bool subcase_equal (const struct subcase
*a_sc
, const struct ccase
*a
,
109 const struct subcase
*b_sc
, const struct ccase
*b
);
110 bool subcase_equal_xc (const struct subcase
*,
111 const union value
*a
, const struct ccase
*b
);
112 bool subcase_equal_cx (const struct subcase
*,
113 const struct ccase
*a
, const union value
*b
);
114 bool subcase_equal_xx (const struct subcase
*,
115 const union value
*a
, const union value
*b
);
118 subcase_get_case_index (const struct subcase
*sc
, size_t idx
)
120 return sc
->fields
[idx
].case_index
;
124 subcase_get_width (const struct subcase
*sc
, size_t idx
)
126 return sc
->fields
[idx
].width
;
129 static inline enum subcase_direction
130 subcase_get_direction (const struct subcase
*sc
, size_t idx
)
132 return sc
->fields
[idx
].direction
;
136 subcase_is_empty (const struct subcase
*sc
)
138 return sc
->n_fields
== 0;
142 subcase_get_n_fields (const struct subcase
*sc
)
147 #endif /* data/subcase.h */