gui: Fix behavior of print preview in psppire-output-window.
[pspp] / src / libpspp / hmapx.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifdef HAVE_CONFIG_H
18 #include <config.h>
19 #endif
20
21 #include "libpspp/hmapx.h"
22 #include <stdlib.h>
23 #include "gl/xalloc.h"
24
25 /* Frees the memory, if any, allocated by hash map MAP, including
26    all hmapx_nodes that it contains.  The user-defined data items
27    that the hmapx_nodes point to are not affected.  If those
28    items should be freed, then it should be done by iterating
29    through MAP's contents before destroying MAP. */
30 void
31 hmapx_destroy (struct hmapx *map) 
32 {
33   if (map != NULL) 
34     {
35       if (!(hmapx_is_empty (map)))
36         {
37           struct hmapx_node *node, *next;
38           for (node = hmapx_first (map); node != NULL; node = next)
39             {
40               next = hmapx_next (map, node);
41               free (node); 
42             }
43         }
44       hmap_destroy (&map->hmap);
45     }
46 }
47
48 /* Removes all hmapx_nodes from MAP and frees them.  The user-defined data
49    items that the hmapx_nodes point to are not affected. */
50 void
51 hmapx_clear (struct hmapx *map)
52 {
53   struct hmapx_node *node, *next;
54   void *data;
55
56   HMAPX_FOR_EACH_SAFE (data, node, next, map)
57     hmapx_delete (map, node);
58 }
59
60 /* Allocates and returns a new hmapx_node with DATA as its data
61    item. */
62 static struct hmapx_node *
63 make_hmapx_node (void *data) 
64 {
65   struct hmapx_node *node = xmalloc (sizeof *node);
66   node->data = data;
67   return node;
68 }
69
70 /* Inserts DATA into MAP with hash value HASH and returns the new
71    hmapx_node created to contain DATA.  If the insertion causes
72    MAP's current capacity, as reported by hmapx_capacity(), to be
73    exceeded, rehashes MAP with an increased number of hash
74    buckets.
75
76    This function runs in constant time amortized over all the
77    insertions into MAP.
78
79    This function does not verify that MAP does not already
80    contain a data item with the same value as DATA.  If
81    duplicates should be disallowed (which is the usual case),
82    then the client must check for duplicates itself before
83    inserting the new item. */
84 struct hmapx_node *
85 hmapx_insert (struct hmapx *map, void *data, size_t hash) 
86 {
87   struct hmapx_node *node = make_hmapx_node (data);
88   hmap_insert (&map->hmap, &node->hmap_node, hash);
89   return node;
90 }
91
92 /* Inserts DATA into MAP with hash value HASH and returns the new
93    hmapx_node created to contain DATA.  Does not check whether
94    this causes MAP's current capacity to be exceeded.  The caller
95    must take responsibility for that (or use hmapx_insert()
96    instead).
97
98    This function runs in constant time.
99
100    This function does not verify that MAP does not already
101    contain a data item with the same value as DATA.  If
102    duplicates should be disallowed (which is the usual case),
103    then the client must check for duplicates itself before
104    inserting the new node. */
105 struct hmapx_node *
106 hmapx_insert_fast (struct hmapx *map, void *data, size_t hash) 
107 {
108   struct hmapx_node *node = make_hmapx_node (data);
109   hmap_insert_fast (&map->hmap, &node->hmap_node, hash);
110   return node;
111 }