comparison src/fns.c @ 5191:71ee43b8a74d

Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API tests/ChangeLog addition: 2010-04-05 Aidan Kehoe <kehoea@parhasard.net> * automated/hash-table-tests.el: Test the new built-in #'equalp hash table test. Test #'define-hash-table-test. * automated/lisp-tests.el: When asserting that two objects are #'equalp, also assert that their #'equalp-hash is identical. man/ChangeLog addition: 2010-04-03 Aidan Kehoe <kehoea@parhasard.net> * lispref/hash-tables.texi (Introduction to Hash Tables): Document that we now support #'equalp as a hash table test by default, and mention #'define-hash-table-test. (Working With Hash Tables): Document #'define-hash-table-test. src/ChangeLog addition: 2010-04-05 Aidan Kehoe <kehoea@parhasard.net> * elhash.h: * elhash.c (struct Hash_Table_Test, lisp_object_eql_equal) (lisp_object_eql_hash, lisp_object_equal_equal) (lisp_object_equal_hash, lisp_object_equalp_hash) (lisp_object_equalp_equal, lisp_object_general_hash) (lisp_object_general_equal, Feq_hash, Feql_hash, Fequal_hash) (Fequalp_hash, define_hash_table_test, Fdefine_hash_table_test) (init_elhash_once_early, mark_hash_table_tests, string_equalp_hash): * glyphs.c (vars_of_glyphs): Add a new hash table test in C, #'equalp. Make it possible to specify new hash table tests with functions define_hash_table_test, #'define-hash-table-test. Use define_hash_table_test() in glyphs.c. Expose the hash functions (besides that used for #'equal) to Lisp, for people writing functions to be used with #'define-hash-table-test. Call define_hash_table_test() very early in temacs, to create the built-in hash table tests. * ui-gtk.c (emacs_gtk_boxed_hash): * specifier.h (struct specifier_methods): * specifier.c (specifier_hash): * rangetab.c (range_table_entry_hash, range_table_hash): * number.c (bignum_hash, ratio_hash, bigfloat_hash): * marker.c (marker_hash): * lrecord.h (struct lrecord_implementation): * keymap.c (keymap_hash): * gui.c (gui_item_id_hash, gui_item_hash): * glyphs.c (image_instance_hash, glyph_hash): * glyphs-x.c (x_image_instance_hash): * glyphs-msw.c (mswindows_image_instance_hash): * glyphs-gtk.c (gtk_image_instance_hash): * frame-msw.c (mswindows_set_title_from_ibyte): * fontcolor.c (color_instance_hash, font_instance_hash): * fontcolor-x.c (x_color_instance_hash): * fontcolor-tty.c (tty_color_instance_hash): * fontcolor-msw.c (mswindows_color_instance_hash): * fontcolor-gtk.c (gtk_color_instance_hash): * fns.c (bit_vector_hash): * floatfns.c (float_hash): * faces.c (face_hash): * extents.c (extent_hash): * events.c (event_hash): * data.c (weak_list_hash, weak_box_hash): * chartab.c (char_table_entry_hash, char_table_hash): * bytecode.c (compiled_function_hash): * alloc.c (vector_hash): Change the various object hash methods to take a new EQUALP parameter, hashing appropriately for #'equalp if it is true.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Apr 2010 13:03:35 +0100
parents b51c2079ec8e
children 35c2b7e9c03f
comparison
equal deleted inserted replaced
5190:1c1d8843de5e 5191:71ee43b8a74d
106 !memcmp (v1->bits, v2->bits, 106 !memcmp (v1->bits, v2->bits,
107 BIT_VECTOR_LONG_STORAGE (bit_vector_length (v1)) * 107 BIT_VECTOR_LONG_STORAGE (bit_vector_length (v1)) *
108 sizeof (long))); 108 sizeof (long)));
109 } 109 }
110 110
111 /* This needs to be algorithmically identical to internal_array_hash in
112 elhash.c when equalp is one, so arrays and bit vectors with the same
113 contents hash the same. It would be possible to enforce this by giving
114 internal_ARRAYLIKE_hash its own file and including it twice, but right
115 now that doesn't seem worth it. */
111 static Hashcode 116 static Hashcode
112 bit_vector_hash (Lisp_Object obj, int UNUSED (depth)) 117 internal_bit_vector_equalp_hash (Lisp_Bit_Vector *v)
118 {
119 int ii, size = bit_vector_length (v);
120 Hashcode hash = 0;
121
122 if (size <= 5)
123 {
124 for (ii = 0; ii < size; ii++)
125 {
126 hash = HASH2
127 (hash,
128 FLOAT_HASHCODE_FROM_DOUBLE ((double) (bit_vector_bit (v, ii))));
129 }
130 return hash;
131 }
132
133 /* just pick five elements scattered throughout the array.
134 A slightly better approach would be to offset by some
135 noise factor from the points chosen below. */
136 for (ii = 0; ii < 5; ii++)
137 hash = HASH2 (hash,
138 FLOAT_HASHCODE_FROM_DOUBLE
139 ((double) (bit_vector_bit (v, ii * size / 5))));
140
141 return hash;
142 }
143
144 static Hashcode
145 bit_vector_hash (Lisp_Object obj, int UNUSED (depth), Boolint equalp)
113 { 146 {
114 Lisp_Bit_Vector *v = XBIT_VECTOR (obj); 147 Lisp_Bit_Vector *v = XBIT_VECTOR (obj);
148 if (equalp)
149 {
150 return HASH2 (bit_vector_length (v),
151 internal_bit_vector_equalp_hash (v));
152 }
153
115 return HASH2 (bit_vector_length (v), 154 return HASH2 (bit_vector_length (v),
116 memory_hash (v->bits, 155 memory_hash (v->bits,
117 BIT_VECTOR_LONG_STORAGE (bit_vector_length (v)) * 156 BIT_VECTOR_LONG_STORAGE (bit_vector_length (v)) *
118 sizeof (long))); 157 sizeof (long)));
119 } 158 }