range-set: New macro RANGE_SET_FOR_EACH to make iteration easier.
[pspp] / src / data / datasheet.c
index 4abc526f0cb2a720cb8e3023eb7d732effdb5da4..b64df14563865875b7d60374f515007d87353b28 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009 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
 
 #include <config.h>
 
-#include <data/datasheet.h>
+#include "data/datasheet.h"
 
 #include <stdlib.h>
 #include <string.h>
 
-#include <data/casereader-provider.h>
-#include <data/casereader.h>
-#include <data/casewriter.h>
-#include <data/lazy-casereader.h>
-#include <data/settings.h>
-#include <libpspp/array.h>
-#include <libpspp/assertion.h>
-#include <libpspp/misc.h>
-#include <libpspp/range-map.h>
-#include <libpspp/range-set.h>
-#include <libpspp/sparse-xarray.h>
-#include <libpspp/taint.h>
-#include <libpspp/tower.h>
-
-#include "minmax.h"
-#include "md4.h"
-#include "xalloc.h"
+#include "data/casereader-provider.h"
+#include "data/casereader.h"
+#include "data/casewriter.h"
+#include "data/lazy-casereader.h"
+#include "data/settings.h"
+#include "libpspp/array.h"
+#include "libpspp/assertion.h"
+#include "libpspp/misc.h"
+#include "libpspp/range-map.h"
+#include "libpspp/range-set.h"
+#include "libpspp/sparse-xarray.h"
+#include "libpspp/taint.h"
+#include "libpspp/tower.h"
+
+#include "gl/minmax.h"
+#include "gl/md4.h"
+#include "gl/xalloc.h"
 
 struct column;
 
@@ -360,6 +360,8 @@ datasheet_insert_column (struct datasheet *ds,
 {
   struct column *col;
 
+  assert (before <= ds->n_columns);
+
   ds->columns = xnrealloc (ds->columns,
                            ds->n_columns + 1, sizeof *ds->columns);
   insert_element (ds->columns, ds->n_columns, sizeof *ds->columns, before);
@@ -382,6 +384,8 @@ datasheet_insert_column (struct datasheet *ds,
 void
 datasheet_delete_columns (struct datasheet *ds, size_t start, size_t n)
 {
+  assert (start + n <= ds->n_columns);
+
   if (n > 0)
     {
       size_t i;
@@ -411,6 +415,9 @@ datasheet_move_columns (struct datasheet *ds,
                         size_t old_start, size_t new_start,
                         size_t n)
 {
+  assert (old_start + n <= ds->n_columns);
+  assert (new_start + n <= ds->n_columns);
+
   move_range (ds->columns, ds->n_columns, sizeof *ds->columns,
               old_start, new_start, n);
 
@@ -919,8 +926,7 @@ axis_hash (const struct axis *axis, struct md4_ctx *ctx)
       md4_process_bytes (&size, sizeof size, ctx);
     }
 
-  for (rsn = range_set_first (axis->available); rsn != NULL;
-       rsn = range_set_next (axis->available, rsn))
+  RANGE_SET_FOR_EACH (rsn, axis->available)
     {
       unsigned long int start = range_set_node_get_start (rsn);
       unsigned long int end = range_set_node_get_end (rsn);
@@ -971,7 +977,7 @@ static void
 axis_make_available (struct axis *axis,
                      unsigned long int start, unsigned long int width)
 {
-  range_set_insert (axis->available, start, width);
+  range_set_set1 (axis->available, start, width);
 }
 
 /* Extends the total physical length of AXIS by WIDTH and returns
@@ -1221,7 +1227,7 @@ source_create_empty (size_t n_bytes)
   size_t row_size = n_bytes + 4 * sizeof (void *);
   size_t max_memory_rows = settings_get_workspace () / row_size;
   source->avail = range_set_create ();
-  range_set_insert (source->avail, 0, n_bytes);
+  range_set_set1 (source->avail, 0, n_bytes);
   source->data = sparse_xarray_create (n_bytes, MAX (max_memory_rows, 4));
   source->backing = NULL;
   source->backing_rows = 0;
@@ -1240,7 +1246,7 @@ source_create_casereader (struct casereader *reader)
   size_t n_columns;
   size_t i;
 
-  range_set_delete (source->avail, 0, n_bytes);
+  range_set_set0 (source->avail, 0, n_bytes);
   source->backing = reader;
   source->backing_rows = casereader_count_cases (reader);
 
@@ -1294,7 +1300,7 @@ static void
 source_release_column (struct source *source, int ofs, int width)
 {
   assert (width >= 0);
-  range_set_insert (source->avail, ofs, width_to_n_bytes (width));
+  range_set_set1 (source->avail, ofs, width_to_n_bytes (width));
   if (source->backing != NULL)
     source->n_used--;
 }