pivot table procedure conceptually works
[pspp] / src / libpspp / sparse-xarray.c
index f839b0f2a8c6581c13f9a61feda56c0deb9263e8..5168d87922f46fb62b317b89172f4d6831f9acc8 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -105,8 +105,7 @@ sparse_xarray_clone (const struct sparse_xarray *old)
 
       new->disk = ext_array_create ();
       new->disk_rows = range_set_clone (old->disk_rows, NULL);
-      for (node = range_set_first (old->disk_rows); node != NULL;
-           node = range_set_next (old->disk_rows, node))
+      RANGE_SET_FOR_EACH (node, old->disk_rows)
         {
           unsigned long int start = range_set_node_get_start (node);
           unsigned long int end = range_set_node_get_end (node);
@@ -135,6 +134,21 @@ sparse_xarray_clone (const struct sparse_xarray *old)
   return new;
 }
 
+static void
+free_memory_rows (struct sparse_xarray *sx)
+{
+  if (sx->memory != NULL)
+    {
+      unsigned long int idx;
+      uint8_t **row;
+      for (row = sparse_array_first (sx->memory, &idx); row != NULL;
+           row = sparse_array_next (sx->memory, idx, &idx))
+        free (*row);
+      sparse_array_destroy (sx->memory);
+      sx->memory = NULL;
+    }
+}
+
 /* Destroys sparse array of rows SX. */
 void
 sparse_xarray_destroy (struct sparse_xarray *sx)
@@ -142,15 +156,7 @@ sparse_xarray_destroy (struct sparse_xarray *sx)
   if (sx != NULL)
     {
       free (sx->default_row);
-      if (sx->memory != NULL)
-        {
-          unsigned long int idx;
-          uint8_t **row;
-          for (row = sparse_array_first (sx->memory, &idx); row != NULL;
-               row = sparse_array_next (sx->memory, idx, &idx))
-            free (*row);
-          sparse_array_destroy (sx->memory);
-        }
+      free_memory_rows (sx);
       ext_array_destroy (sx->disk);
       range_set_destroy (sx->disk_rows);
       free (sx);
@@ -207,10 +213,9 @@ dump_sparse_xarray_to_disk (struct sparse_xarray *sx)
           sx->disk_rows = NULL;
           return false;
         }
-      range_set_insert (sx->disk_rows, idx, 1);
+      range_set_set1 (sx->disk_rows, idx, 1);
     }
-  sparse_array_destroy (sx->memory);
-  sx->memory = NULL;
+  free_memory_rows (sx);
   return true;
 }
 
@@ -264,7 +269,7 @@ write_disk_row (struct sparse_xarray *sx, unsigned long int row,
     return ext_array_write (sx->disk, ofs + start, n, data);
   else
     {
-      range_set_insert (sx->disk_rows, row, 1);
+      range_set_set1 (sx->disk_rows, row, 1);
       return (ext_array_write (sx->disk, ofs, start, sx->default_row)
               && ext_array_write (sx->disk, ofs + start, n, data)
               && ext_array_write (sx->disk, ofs + start + n,
@@ -336,8 +341,7 @@ sparse_xarray_write_columns (struct sparse_xarray *sx, size_t start,
     {
       const struct range_set_node *node;
 
-      for (node = range_set_first (sx->disk_rows); node != NULL;
-           node = range_set_next (sx->disk_rows, node))
+      RANGE_SET_FOR_EACH (node, sx->disk_rows)
         {
           unsigned long int start_row = range_set_node_get_start (node);
           unsigned long int end_row = range_set_node_get_end (node);
@@ -446,8 +450,7 @@ sparse_xarray_copy (const struct sparse_xarray *sx, struct sparse_xarray *dx,
           const struct range_set_node *node;
           void *tmp = xmalloc (sx->n_bytes);
 
-          for (node = range_set_first (sx->disk_rows); node != NULL;
-               node = range_set_next (sx->disk_rows, node))
+          RANGE_SET_FOR_EACH (node, sx->disk_rows)
             {
               unsigned long int start = range_set_node_get_start (node);
               unsigned long int end = range_set_node_get_end (node);
@@ -587,8 +590,7 @@ sparse_xarray_model_checker_hash (const struct sparse_xarray *sx,
       void *tmp = xmalloc (sx->n_bytes);
 
       md4_process_bytes ("d", 1, &ctx);
-      for (node = range_set_first (sx->disk_rows); node != NULL;
-           node = range_set_next (sx->disk_rows, node))
+      RANGE_SET_FOR_EACH (node, sx->disk_rows)
         {
           unsigned long int start = range_set_node_get_start (node);
           unsigned long int end = range_set_node_get_end (node);