Mercurial > hg > octave-kai > gnulib-hg
annotate lib/hash.h @ 2807:807294ed0f4f
back out Copyright date changes for files with no changes year
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 07 Aug 2000 15:48:18 +0000 |
parents | 5994c6f939c5 |
children | 08373aedb4b6 |
rev | line source |
---|---|
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
1 /* hash - hashing table processing. |
2807
807294ed0f4f
back out Copyright date changes for files with no changes year
Jim Meyering <jim@meyering.net>
parents:
2718
diff
changeset
|
2 Copyright (C) 1998, 1999 Free Software Foundation, Inc. |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
3 Written by Jim Meyering <meyering@ascend.com>, 1998. |
1031 | 4 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
5 This program is free software; you can redistribute it and/or modify |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
7 the Free Software Foundation; either version 2, or (at your option) |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
8 any later version. |
1032
0b6b7e10fe5f
use HASH_H, not _hash_h_ in #ifndef
Jim Meyering <jim@meyering.net>
parents:
1031
diff
changeset
|
9 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
13 GNU General Public License for more details. |
1170 | 14 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
15 You should have received a copy of the GNU General Public License |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
16 along with this program; if not, write to the Free Software Foundation, |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
1031 | 18 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
19 /* A generic hash table package. */ |
1031 | 20 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
21 /* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
22 obstacks instead of malloc, and recompile `hash.c' with same setting. */ |
1031 | 23 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
24 #ifndef PARAMS |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
25 # if PROTOTYPES || __STDC__ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
26 # define PARAMS(Args) Args |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
27 # else |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
28 # define PARAMS(Args) () |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
29 # endif |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
30 #endif |
1031 | 31 |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
32 typedef unsigned (*Hash_hasher) PARAMS ((const void *, unsigned)); |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
33 typedef bool (*Hash_comparator) PARAMS ((const void *, const void *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
34 typedef void (*Hash_data_freer) PARAMS ((void *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
35 typedef bool (*Hash_processor) PARAMS ((void *, void *)); |
1031 | 36 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
37 struct hash_entry |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
38 { |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
39 void *data; |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
40 struct hash_entry *next; |
1031 | 41 }; |
42 | |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
43 struct hash_tuning |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
44 { |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
45 /* This structure is mainly used for `hash_initialize', see the block |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
46 documentation of `hash_reset_tuning' for more complete comments. */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
47 |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
48 float shrink_threshold; /* ratio of used buckets to trigger a shrink */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
49 float shrink_factor; /* ratio of new smaller size to original size */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
50 float growth_threshold; /* ratio of used buckets to trigger a growth */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
51 float growth_factor; /* ratio of new bigger size to original size */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
52 bool is_n_buckets; /* if CANDIDATE really means table size */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
53 }; |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
54 |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
55 typedef struct hash_tuning Hash_tuning; |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
56 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
57 struct hash_table |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
58 { |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
59 /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1, |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
60 for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
61 are not empty, there are N_ENTRIES active entries in the table. */ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
62 struct hash_entry *bucket; |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
63 struct hash_entry *bucket_limit; |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
64 unsigned n_buckets; |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
65 unsigned n_buckets_used; |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
66 unsigned n_entries; |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
67 |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
68 /* Tuning arguments, kept in a physicaly separate structure. */ |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
69 const Hash_tuning *tuning; |
1031 | 70 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
71 /* Three functions are given to `hash_initialize', see the documentation |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
72 block for this function. In a word, HASHER randomizes a user entry |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
73 into a number up from 0 up to some maximum minus 1; COMPARATOR returns |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
74 true if two user entries compare equally; and DATA_FREER is the cleanup |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
75 function for a user entry. */ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
76 Hash_hasher hasher; |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
77 Hash_comparator comparator; |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
78 Hash_data_freer data_freer; |
1031 | 79 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
80 /* A linked list of freed struct hash_entry structs. */ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
81 struct hash_entry *free_entry_list; |
1031 | 82 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
83 #if USE_OBSTACK |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
84 /* Whenever obstacks are used, it is possible to allocate all overflowed |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
85 entries into a single stack, so they all can be freed in a single |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
86 operation. It is not clear if the speedup is worth the trouble. */ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
87 struct obstack entry_stack; |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
88 #endif |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
89 }; |
1031 | 90 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
91 typedef struct hash_table Hash_table; |
1031 | 92 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
93 /* Information and lookup. */ |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
94 unsigned hash_get_n_buckets PARAMS ((const Hash_table *)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
95 unsigned hash_get_n_buckets_used PARAMS ((const Hash_table *)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
96 unsigned hash_get_n_entries PARAMS ((const Hash_table *)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
97 unsigned hash_get_max_bucket_length PARAMS ((const Hash_table *)); |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
98 bool hash_table_ok PARAMS ((const Hash_table *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
99 void hash_print_statistics PARAMS ((const Hash_table *, FILE *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
100 void *hash_lookup PARAMS ((const Hash_table *, const void *)); |
1031 | 101 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
102 /* Walking. */ |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
103 void *hash_get_first PARAMS ((const Hash_table *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
104 void *hash_get_next PARAMS ((const Hash_table *, const void *)); |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
105 unsigned hash_get_entries PARAMS ((const Hash_table *, void **, unsigned)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
106 unsigned hash_do_for_each PARAMS ((const Hash_table *, Hash_processor, void *)); |
1031 | 107 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
108 /* Allocation and clean-up. */ |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
109 unsigned hash_string PARAMS ((const char *, unsigned)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
110 void hash_reset_tuning PARAMS ((Hash_tuning *)); |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
111 Hash_table *hash_initialize PARAMS ((unsigned, const Hash_tuning *, |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
112 Hash_hasher, Hash_comparator, |
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
113 Hash_data_freer)); |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
114 void hash_clear PARAMS ((Hash_table *)); |
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
115 void hash_free PARAMS ((Hash_table *)); |
1031 | 116 |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
117 /* Insertion and deletion. */ |
1741
fbd0de3235db
(struct hash_tuning): Define.
Jim Meyering <jim@meyering.net>
parents:
1740
diff
changeset
|
118 bool hash_rehash PARAMS ((Hash_table *, unsigned)); |
1740
99255b403d74
(hash_insert): Update prototype.
Jim Meyering <jim@meyering.net>
parents:
1311
diff
changeset
|
119 void *hash_insert PARAMS ((Hash_table *, const void *)); |
1311
20f35a1b786a
Lots of minor spec and name changes, and new comments.
Jim Meyering <jim@meyering.net>
parents:
1170
diff
changeset
|
120 void *hash_delete PARAMS ((Hash_table *, const void *)); |