comparison src/lrecord.h @ 444:576fb035e263 r21-2-37

Import from CVS: tag r21-2-37
author cvs
date Mon, 13 Aug 2007 11:36:19 +0200
parents abe6d1db359e
children 1ccc32a20af4
comparison
equal deleted inserted replaced
443:a8296e22da4e 444:576fb035e263
475 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ 475 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \
476 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) 476 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype)
477 477
478 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ 478 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \
479 DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype) \ 479 DECLARE_ERROR_CHECK_TYPECHECK(c_name, structtype) \
480 unsigned int lrecord_type_##c_name = lrecord_type_count++; \ 480 unsigned int lrecord_type_##c_name; \
481 const struct lrecord_implementation lrecord_##c_name = \ 481 struct lrecord_implementation lrecord_##c_name = \
482 { name, marker, printer, nuker, equal, hash, desc, \ 482 { name, marker, printer, nuker, equal, hash, desc, \
483 getprop, putprop, remprop, plist, size, sizer, \ 483 getprop, putprop, remprop, plist, size, sizer, \
484 (enum lrecord_type)lrecord_type_##c_name, basic_p } 484 lrecord_type_last_built_in_type, basic_p }
485 485
486 486
487 extern Lisp_Object (*lrecord_markers[]) (Lisp_Object); 487 extern Lisp_Object (*lrecord_markers[]) (Lisp_Object);
488 488
489 #define INIT_LRECORD_IMPLEMENTATION(type) do { \ 489 #define INIT_LRECORD_IMPLEMENTATION(type) do { \
490 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \ 490 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \
491 lrecord_markers[lrecord_type_##type] = \ 491 lrecord_markers[lrecord_type_##type] = \
492 lrecord_implementations_table[lrecord_type_##type]->marker; \ 492 lrecord_implementations_table[lrecord_type_##type]->marker; \
493 } while (0)
494
495 #define INIT_EXTERNAL_LRECORD_IMPLEMENTATION(type) do { \
496 lrecord_type_##type = lrecord_type_count++; \
497 lrecord_##type.lrecord_type_index = lrecord_type_##type; \
498 INIT_LRECORD_IMPLEMENTATION(type); \
493 } while (0) 499 } while (0)
494 500
495 #define LRECORDP(a) (XTYPE (a) == Lisp_Type_Record) 501 #define LRECORDP(a) (XTYPE (a) == Lisp_Type_Record)
496 #define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a)) 502 #define XRECORD_LHEADER(a) ((struct lrecord_header *) XPNTR (a))
497 503
644 } \ 650 } \
645 extern Lisp_Object Q##c_name##p 651 extern Lisp_Object Q##c_name##p
646 652
647 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \ 653 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \
648 extern unsigned int lrecord_type_##c_name; \ 654 extern unsigned int lrecord_type_##c_name; \
649 DECLARE_LRECORD(c_name, structtype) 655 extern struct lrecord_implementation lrecord_##c_name; \
656 INLINE_HEADER structtype * \
657 error_check_##c_name (Lisp_Object obj); \
658 INLINE_HEADER structtype * \
659 error_check_##c_name (Lisp_Object obj) \
660 { \
661 assert (RECORD_TYPEP (obj, lrecord_type_##c_name)); \
662 return (structtype *) XPNTR (obj); \
663 } \
664 extern Lisp_Object Q##c_name##p
650 665
651 # define DECLARE_NONRECORD(c_name, type_enum, structtype) \ 666 # define DECLARE_NONRECORD(c_name, type_enum, structtype) \
652 INLINE_HEADER structtype * \ 667 INLINE_HEADER structtype * \
653 error_check_##c_name (Lisp_Object obj); \ 668 error_check_##c_name (Lisp_Object obj); \
654 INLINE_HEADER structtype * \ 669 INLINE_HEADER structtype * \
674 extern Lisp_Object Q##c_name##p; \ 689 extern Lisp_Object Q##c_name##p; \
675 extern const struct lrecord_implementation lrecord_##c_name 690 extern const struct lrecord_implementation lrecord_##c_name
676 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \ 691 # define DECLARE_EXTERNAL_LRECORD(c_name, structtype) \
677 extern Lisp_Object Q##c_name##p; \ 692 extern Lisp_Object Q##c_name##p; \
678 extern unsigned int lrecord_type_##c_name; \ 693 extern unsigned int lrecord_type_##c_name; \
679 extern const struct lrecord_implementation lrecord_##c_name 694 extern struct lrecord_implementation lrecord_##c_name
680 # define DECLARE_NONRECORD(c_name, type_enum, structtype) \ 695 # define DECLARE_NONRECORD(c_name, type_enum, structtype) \
681 extern Lisp_Object Q##c_name##p 696 extern Lisp_Object Q##c_name##p
682 # define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x)) 697 # define XRECORD(x, c_name, structtype) ((structtype *) XPNTR (x))
683 # define XNONRECORD(x, c_name, type_enum, structtype) \ 698 # define XNONRECORD(x, c_name, type_enum, structtype) \
684 ((structtype *) XPNTR (x)) 699 ((structtype *) XPNTR (x))