1292
|
1 /* Copyright (C) 2003 Ben Wing.
|
|
2 This file is part of XEmacs.
|
428
|
3
|
|
4 XEmacs is free software; you can redistribute it and/or modify it
|
|
5 under the terms of the GNU General Public License as published by the
|
|
6 Free Software Foundation; either version 2, or (at your option) any
|
|
7 later version.
|
|
8
|
|
9 XEmacs is distributed in the hope that it will be useful, but WITHOUT
|
|
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 for more details.
|
|
13
|
|
14 You should have received a copy of the GNU General Public License
|
|
15 along with XEmacs; see the file COPYING. If not, write to
|
|
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
17 Boston, MA 02111-1307, USA. */
|
|
18
|
|
19 /* Synched up with: Not in FSF. */
|
|
20
|
440
|
21 #ifndef INCLUDED_hash_h_
|
|
22 #define INCLUDED_hash_h_
|
428
|
23
|
|
24 typedef struct
|
|
25 {
|
442
|
26 const void *key;
|
428
|
27 void *contents;
|
|
28 } hentry;
|
|
29
|
442
|
30 typedef int (*hash_table_test_function) (const void *, const void *);
|
665
|
31 typedef Hashcode (*hash_table_hash_function) (const void *);
|
428
|
32
|
|
33 struct hash_table
|
|
34 {
|
|
35 hentry *harray;
|
|
36 long zero_set;
|
|
37 void *zero_entry;
|
665
|
38 Elemcount size; /* size of the hasharray */
|
|
39 Elemcount fullness; /* number of entries in the hash table */
|
428
|
40 hash_table_hash_function hash_function;
|
|
41 hash_table_test_function test_function;
|
|
42 };
|
|
43
|
|
44 /* SIZE is the number of initial entries. The hash table will be grown
|
|
45 automatically if the number of entries approaches the size */
|
665
|
46 struct hash_table *make_hash_table (Elemcount size);
|
428
|
47
|
2515
|
48 struct hash_table *make_string_hash_table (Elemcount size);
|
|
49
|
826
|
50 struct hash_table *make_general_hash_table (Elemcount size,
|
|
51 hash_table_hash_function
|
|
52 hash_function,
|
|
53 hash_table_test_function
|
|
54 test_function);
|
428
|
55
|
|
56 /* Clear HASH-TABLE. A freshly created hash table is already cleared up. */
|
|
57 void clrhash (struct hash_table *hash_table);
|
|
58
|
|
59 /* Free HASH-TABLE and its substructures */
|
|
60 void free_hash_table (struct hash_table *hash_table);
|
|
61
|
|
62 /* Returns a hentry whose key is 0 if the entry does not exist in HASH-TABLE */
|
442
|
63 const void *gethash (const void *key, struct hash_table *hash_table,
|
|
64 const void **ret_value);
|
428
|
65
|
|
66 /* KEY should be different from 0 */
|
442
|
67 void puthash (const void *key, void *contents, struct hash_table *hash_table);
|
428
|
68
|
|
69 /* delete the entry with key KEY */
|
442
|
70 void remhash (const void *key, struct hash_table *hash_table);
|
428
|
71
|
442
|
72 typedef int (*maphash_function) (const void* key, void* contents, void* arg);
|
428
|
73
|
442
|
74 typedef int (*remhash_predicate) (const void* key, const void* contents,
|
428
|
75 void* arg);
|
|
76
|
|
77 /* Call MF (key, contents, arg) for every entry in HASH-TABLE */
|
|
78 void maphash (maphash_function mf, struct hash_table *hash_table, void* arg);
|
|
79
|
|
80 /* Delete all objects from HASH-TABLE satisfying PREDICATE */
|
|
81 void map_remhash (remhash_predicate predicate,
|
|
82 struct hash_table *hash_table, void *arg);
|
|
83
|
1292
|
84 /* Grow the table if it has less than BREATHING_ROOM elements that can be
|
|
85 added before a resize will be triggered. After the grow, the table can
|
|
86 hold at least BREATHING_ROOM elements (and probably a lot more) before
|
|
87 needing resizing again. */
|
|
88 void pregrow_hash_table_if_necessary (struct hash_table *hash_table,
|
|
89 Elemcount breathing_room);
|
440
|
90 #endif /* INCLUDED_hash_h_ */
|