comparison src/number.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 6c6d78781d59
children ba07c880114a
comparison
equal deleted inserted replaced
5190:1c1d8843de5e 5191:71ee43b8a74d
78 { 78 {
79 return bignum_eql (XBIGNUM_DATA (obj1), XBIGNUM_DATA (obj2)); 79 return bignum_eql (XBIGNUM_DATA (obj1), XBIGNUM_DATA (obj2));
80 } 80 }
81 81
82 static Hashcode 82 static Hashcode
83 bignum_hash (Lisp_Object obj, int UNUSED (depth)) 83 bignum_hash (Lisp_Object obj, int UNUSED (depth), Boolint equalp)
84 { 84 {
85 return bignum_hashcode (XBIGNUM_DATA (obj)); 85 if (equalp)
86 {
87 return FLOAT_HASHCODE_FROM_DOUBLE (bignum_to_double (XBIGNUM_DATA (obj)));
88 }
89 else
90 {
91 return bignum_hashcode (XBIGNUM_DATA (obj));
92 }
86 } 93 }
87 94
88 static void 95 static void
89 bignum_convert (const void *object, void **data, Bytecount *size) 96 bignum_convert (const void *object, void **data, Bytecount *size)
90 { 97 {
168 { 175 {
169 return ratio_eql (XRATIO_DATA (obj1), XRATIO_DATA (obj2)); 176 return ratio_eql (XRATIO_DATA (obj1), XRATIO_DATA (obj2));
170 } 177 }
171 178
172 static Hashcode 179 static Hashcode
173 ratio_hash (Lisp_Object obj, int UNUSED (depth)) 180 ratio_hash (Lisp_Object obj, int UNUSED (depth), Boolint equalp)
174 { 181 {
175 return ratio_hashcode (XRATIO_DATA (obj)); 182 if (equalp)
183 {
184 return FLOAT_HASHCODE_FROM_DOUBLE (ratio_to_double (XRATIO_DATA (obj)));
185 }
186 else
187 {
188 return ratio_hashcode (XRATIO_DATA (obj));
189 }
176 } 190 }
177 191
178 static const struct memory_description ratio_description[] = { 192 static const struct memory_description ratio_description[] = {
179 { XD_OPAQUE_PTR, offsetof (Lisp_Ratio, data) }, 193 { XD_OPAQUE_PTR, offsetof (Lisp_Ratio, data) },
180 { XD_END } 194 { XD_END }
272 { 286 {
273 return bigfloat_eql (XBIGFLOAT_DATA (obj1), XBIGFLOAT_DATA (obj2)); 287 return bigfloat_eql (XBIGFLOAT_DATA (obj1), XBIGFLOAT_DATA (obj2));
274 } 288 }
275 289
276 static Hashcode 290 static Hashcode
277 bigfloat_hash (Lisp_Object obj, int UNUSED (depth)) 291 bigfloat_hash (Lisp_Object obj, int UNUSED (depth), Boolint equalp)
278 { 292 {
279 return bigfloat_hashcode (XBIGFLOAT_DATA (obj)); 293 if (equalp)
294 {
295 return
296 FLOAT_HASHCODE_FROM_DOUBLE (bigfloat_to_double (XBIGFLOAT_DATA (obj)));
297 }
298 else
299 {
300 return bigfloat_hashcode (XBIGFLOAT_DATA (obj));
301 }
280 } 302 }
281 303
282 static const struct memory_description bigfloat_description[] = { 304 static const struct memory_description bigfloat_description[] = {
283 { XD_OPAQUE_PTR, offsetof (Lisp_Bigfloat, bf) }, 305 { XD_OPAQUE_PTR, offsetof (Lisp_Bigfloat, bf) },
284 { XD_END } 306 { XD_END }