subcase
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 1 Apr 2010 05:06:28 +0000 (22:06 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 3 May 2010 04:29:22 +0000 (21:29 -0700)
src/data/subcase.c
src/data/subcase.h

index bac32ddefb21eb0fc2e1fde395c08bfc0575e188..36ee9bf32758177ce79b37994058db5a53ed8e61 100644 (file)
@@ -163,6 +163,17 @@ subcase_add_var_always (struct subcase *sc, const struct variable *var,
                              var_get_width (var), direction);
 }
 
+void
+subcase_add_vars_always (struct subcase *sc,
+                         const struct variable *const *vars, size_t n_vars,
+                         enum subcase_direction direction)
+{
+  size_t i;
+
+  for (i = 0; i < n_vars; i++)
+    subcase_add_var_always (sc, vars[i], direction);
+}
+
 /* Add a field for CASE_INDEX, WIDTH to SC, with DIRECTION as the
    sort order, regardless of whether CASE_INDEX already has a
    field in SC. */
@@ -225,6 +236,15 @@ subcase_concat_always (struct subcase *sc, const struct subcase *other)
     }
 }
 
+void
+subcase_project (struct subcase *sc, size_t offset)
+{
+  size_t i;
+
+  for (i = 0; i < sc->n_fields; i++)
+    sc->fields[i].case_index = i + offset;
+}
+
 /* Obtains a caseproto for a case described by SC.  The caller
    must not modify or unref the returned case prototype. */
 const struct caseproto *
index ba4119b346bda76a5aa674ebdd2d35fccca9c595..88992bb9dd927c4c5bb7ce0fcc6ca82ceb78f0de 100644 (file)
@@ -67,27 +67,28 @@ bool subcase_add (struct subcase *, int case_index, int width,
                  enum subcase_direction direction);
 bool subcase_add_var (struct subcase *, const struct variable *,
                       enum subcase_direction);
-bool subcase_add_vars (struct subcase *, const struct variable *const *,
+void subcase_add_vars (struct subcase *, const struct variable *const *,
                        size_t n_vars, enum subcase_direction);
 
 void subcase_add_always (struct subcase *sc, int case_index, int width,
                          enum subcase_direction direction);
 void subcase_add_var_always (struct subcase *, const struct variable *,
                              enum subcase_direction);
-bool subcase_add_vars_always (struct subcase *, const struct variable *const *,
+void subcase_add_vars_always (struct subcase *, const struct variable *const *,
                               size_t n_vars, enum subcase_direction);
 void subcase_add_proto_always (struct subcase *, const struct caseproto *);
 
 void subcase_concat (struct subcase *, const struct subcase *);
 void subcase_concat_always (struct subcase *, const struct subcase *);
 
-void subcase_project (struct subcase *);
+void subcase_project (struct subcase *, size_t offset);
 
 const struct caseproto *subcase_get_proto (const struct subcase *);
 
 static inline bool subcase_is_empty (const struct subcase *);
 static inline size_t subcase_get_n_fields (const struct subcase *);
 
+static inline size_t subcase_get_width (const struct subcase *, size_t idx);
 static inline size_t subcase_get_case_index (const struct subcase *,
                                              size_t idx);
 static inline enum subcase_direction subcase_get_direction (
@@ -125,6 +126,12 @@ subcase_get_case_index (const struct subcase *sc, size_t idx)
   return sc->fields[idx].case_index;
 }
 
+static inline size_t
+subcase_get_width (const struct subcase *sc, size_t idx)
+{
+  return sc->fields[idx].width;
+}
+
 static inline enum subcase_direction
 subcase_get_direction (const struct subcase *sc, size_t idx)
 {