Add new functions to define subcase orderings.
authorJohn Darrington <john@darrington.wattle.id.au>
Mon, 15 Jun 2009 23:27:31 +0000 (07:27 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 15 Jun 2009 23:27:31 +0000 (07:27 +0800)
Allow subcases to be defined from a index and width,
rather from a variable.  This avoids much of the
need for var_create_internal.

src/data/subcase.c
src/data/subcase.h
src/language/stats/roc.c

index be58609693900cc5d02fff87a5d225f8a4002688..6ffaa4c2bed24a603e3ce0aa267c16661e82f471 100644 (file)
@@ -64,6 +64,16 @@ subcase_init_var (struct subcase *sc, const struct variable *var,
   subcase_add_var (sc, var, direction);
 }
 
+
+void
+subcase_init (struct subcase *sc, int index, int width,
+                  enum subcase_direction direction)
+{
+  subcase_init_empty (sc);
+  subcase_add (sc, index, width, direction);
+}
+
+
 /* Removes all the fields from SC. */
 void
 subcase_clear (struct subcase *sc)
@@ -89,6 +99,7 @@ subcase_destroy (struct subcase *sc)
   caseproto_unref (sc->proto);
 }
 
+
 /* Add a field for VAR to SC, with DIRECTION as the sort order.
    Returns true if successful, false if VAR already has a field
    in SC. */
@@ -96,7 +107,17 @@ bool
 subcase_add_var (struct subcase *sc, const struct variable *var,
                  enum subcase_direction direction)
 {
-  size_t case_index = var_get_case_index (var);
+  return subcase_add (sc, var_get_case_index (var),
+                     var_get_width (var), direction);
+}
+
+/* Add a field for CASE_INDEX, WIDTH to SC, with DIRECTION as the sort order.
+   Returns true if successful, false if CASE_INDEX already has a field
+   in SC. */
+bool
+subcase_add (struct subcase *sc, int case_index, int width,
+                 enum subcase_direction direction)
+{
   struct subcase_field *field;
   size_t i;
 
@@ -107,7 +128,7 @@ subcase_add_var (struct subcase *sc, const struct variable *var,
   sc->fields = xnrealloc (sc->fields, sc->n_fields + 1, sizeof *sc->fields);
   field = &sc->fields[sc->n_fields++];
   field->case_index = case_index;
-  field->width = var_get_width (var);
+  field->width = width;
   field->direction = direction;
   invalidate_proto (sc);
   return true;
index 050cf17dcd3477f4b236e7af58c1a1ca1595c036..6e59da1d3679ac5b4c89f8a1b6a6ca6bc910627c 100644 (file)
@@ -53,10 +53,16 @@ void subcase_init_vars (struct subcase *,
                         const struct variable *const *, size_t n_vars);
 void subcase_init_var (struct subcase *,
                        const struct variable *, enum subcase_direction);
+void subcase_init (struct subcase *, int index, int width,
+                  enum subcase_direction);
+
 void subcase_clone (struct subcase *, const struct subcase *);
 void subcase_clear (struct subcase *);
 void subcase_destroy (struct subcase *);
 
+bool subcase_add (struct subcase *sc, int index, int width,
+                 enum subcase_direction direction);
+
 bool subcase_add_var (struct subcase *, const struct variable *,
                       enum subcase_direction);
 
index 3dff0407f8a301219cbbcee8ecaf6bc3d9ee1088..eae528a38a81c126b30c5ffa9a66b93212293011 100644 (file)
@@ -560,8 +560,7 @@ do_roc (struct cmd_roc *roc, struct casereader *input, struct dictionary *dict)
     struct caseproto *proto = caseproto_create ();
 
     struct subcase ordering;
-    struct variable *iv = var_create_internal (CUTPOINT);
-    subcase_init_var (&ordering, iv, SC_ASCEND);
+    subcase_init (&ordering, CUTPOINT, 0, SC_ASCEND);
 
 
     proto = caseproto_add_width (proto, 0); /* cutpoint */