/* PSPP - a program for statistical analysis.
- Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010 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>
#endif
-#include <libpspp/hmapx.h>
+#include "libpspp/hmapx.h"
#include <stdlib.h>
-#include "xalloc.h"
+#include "gl/xalloc.h"
/* Frees the memory, if any, allocated by hash map MAP, including
all hmapx_nodes that it contains. The user-defined data items
}
}
+/* Removes all hmapx_nodes from MAP and frees them. The user-defined data
+ items that the hmapx_nodes point to are not affected. */
+void
+hmapx_clear (struct hmapx *map)
+{
+ struct hmapx_node *node, *next;
+ void *data;
+
+ HMAPX_FOR_EACH_SAFE (data, node, next, map)
+ hmapx_delete (map, node);
+}
+
/* Allocates and returns a new hmapx_node with DATA as its data
item. */
static struct hmapx_node *
/* PSPP - a program for statistical analysis.
- Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010 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
/* Creation and destruction. */
static inline void hmapx_init (struct hmapx *);
static inline void hmapx_swap (struct hmapx *, struct hmapx *);
+void hmapx_clear (struct hmapx *);
void hmapx_destroy (struct hmapx *);
/* Storage management. */
/* PSPP - a program for statistical analysis.
- Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2008, 2009, 2010 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
test_swap (128, random_hash);
}
+/* Inserts elements into an HMAPX in ascending order, then clears the hash
+ table using hmapx_clear(). */
+static void
+test_clear (void)
+{
+ const int max_elems = 128;
+ struct element *elements;
+ struct hmapx_node **nodes;
+ int *values;
+ struct hmapx hmapx;
+ int cnt;
+
+ elements = xnmalloc (max_elems, sizeof *elements);
+ nodes = xnmalloc (max_elems, sizeof *nodes);
+ values = xnmalloc (max_elems, sizeof *values);
+
+ hmapx_init (&hmapx);
+ for (cnt = 0; cnt <= max_elems; cnt++)
+ {
+ int i;
+
+ for (i = 0; i < cnt; i++)
+ {
+ values[i] = elements[i].data = i;
+ nodes[i] = hmapx_insert (&hmapx, &elements[i],
+ random_hash (elements[i].data));
+ check_hmapx (&hmapx, values, i + 1, random_hash);
+ }
+ hmapx_clear (&hmapx);
+ check_hmapx (&hmapx, NULL, 0, random_hash);
+ }
+ hmapx_destroy (&hmapx);
+
+ free (elements);
+ free (nodes);
+ free (values);
+}
+
static void
test_destroy_null (void)
{
run_test (test_swap_random_hash, "test swapping tables");
+ run_test (test_clear, "test clearing hash table");
+
run_test (test_destroy_null, "test destroying null table");
run_test (test_shrink_empty, "test shrinking an empty table");