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
826
+ − 48 struct hash_table *make_general_hash_table (Elemcount size,
+ − 49 hash_table_hash_function
+ − 50 hash_function,
+ − 51 hash_table_test_function
+ − 52 test_function);
428
+ − 53
+ − 54 /* Clear HASH-TABLE. A freshly created hash table is already cleared up. */
+ − 55 void clrhash (struct hash_table *hash_table);
+ − 56
+ − 57 /* Free HASH-TABLE and its substructures */
+ − 58 void free_hash_table (struct hash_table *hash_table);
+ − 59
+ − 60 /* Returns a hentry whose key is 0 if the entry does not exist in HASH-TABLE */
442
+ − 61 const void *gethash (const void *key, struct hash_table *hash_table,
+ − 62 const void **ret_value);
428
+ − 63
+ − 64 /* KEY should be different from 0 */
442
+ − 65 void puthash (const void *key, void *contents, struct hash_table *hash_table);
428
+ − 66
+ − 67 /* delete the entry with key KEY */
442
+ − 68 void remhash (const void *key, struct hash_table *hash_table);
428
+ − 69
442
+ − 70 typedef int (*maphash_function) (const void* key, void* contents, void* arg);
428
+ − 71
442
+ − 72 typedef int (*remhash_predicate) (const void* key, const void* contents,
428
+ − 73 void* arg);
+ − 74
+ − 75 /* Call MF (key, contents, arg) for every entry in HASH-TABLE */
+ − 76 void maphash (maphash_function mf, struct hash_table *hash_table, void* arg);
+ − 77
+ − 78 /* Delete all objects from HASH-TABLE satisfying PREDICATE */
+ − 79 void map_remhash (remhash_predicate predicate,
+ − 80 struct hash_table *hash_table, void *arg);
+ − 81
1292
+ − 82 /* Grow the table if it has less than BREATHING_ROOM elements that can be
+ − 83 added before a resize will be triggered. After the grow, the table can
+ − 84 hold at least BREATHING_ROOM elements (and probably a lot more) before
+ − 85 needing resizing again. */
+ − 86 void pregrow_hash_table_if_necessary (struct hash_table *hash_table,
+ − 87 Elemcount breathing_room);
440
+ − 88 #endif /* INCLUDED_hash_h_ */