]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/ly-smobs.icc
patch::: 1.3.49.hwn1: deze dus
[lilypond.git] / lily / include / ly-smobs.icc
1 /*   
2   ly-smobs.icc -- implement smob glue. 
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #ifndef LY_SMOBS_ICC
11 #define LY_SMOBS_ICC
12
13 #define IMPLEMENT_UNSMOB(CL, name)              \
14 CL *                                            \
15 unsmob_ ## name ( SCM s)                        \
16 {                                               \
17   if (SMOB_IS_TYPE_B(CL, s))                    \
18     return SMOB_TO_TYPE(CL, s);                 \
19   else                                          \
20     return 0;                                   \
21 }\
22 SCM smobify (CL *cl)\
23 {\
24   SCM s;                                                                \
25                                                                         \
26   SCM_NEWCELL(s);                                                       \
27   SCM_SETCAR(s,CL::smob_tag_);                                          \
28   void * me_p = cl;                                                     \
29   SCM_SETCDR(s,me_p);                                                   \
30 return s;\
31 }\
32
33
34 /*
35   should include equal_p ? 
36  */
37 #define IMPLEMENT_SMOBS(CL)\
38 long CL::smob_tag_;\
39 static scm_smobfuns CL ## _funs = {                                     \
40   CL::mark_smob, CL::free_smob,                                         \
41   CL::print_smob, 0,                                                    \
42 };                                                                      \
43 void                                                                    \
44 CL::init_smobs ()                                                       \
45 {                                                                       \
46   smob_tag_ = scm_newsmob (&CL ## _funs);                                       \
47 }                                                                       \
48                                                                         \
49                                                                          \
50 void                                                                     \
51 CL::unsmobify_self ()                                                    \
52 {                                                                        \
53   SCM s = self_scm_;                                                     \
54   scm_unprotect_object (s);                                              \
55                                                                          \
56   SCM_CAR(self_scm_) = SCM_EOL;  \
57   SCM_CDR(self_scm_) = SCM_EOL;                                          \
58   self_scm_ = SCM_EOL;                                                   \
59 }                                                                        \
60 \
61 SCM                                                                     \
62 CL::smobify_self ()                                                     \
63 {                                                                       \
64   if (self_scm_ != SCM_EOL)                                             \
65     return self_scm_;                                                   \
66                                                                         \
67   /*                                                                    \
68     This is local. We don't assign to self_scm_ directly, to assure     \
69     that S isn't GC-ed from under us.                                   \
70    */                                                                   \
71   SCM s = smobify (this); \
72   self_scm_ = s;                                                        \
73   scm_protect_object (s);                                               \
74                                                                         \
75 /* no scm_done_malloc() !  */ \
76   do_smobify_self();                                                    \
77   return s;                                     \
78 }                                               \
79 scm_sizet                                       \
80 CL::free_smob (SCM ses)                         \
81 {                                               \
82   CL * s = (CL*) SCM_CDR(ses);                  \
83   /* someone else did the deed already; this might be an automatic var.*/ \
84   if (s->self_scm_ != ses)\
85      return 0; \
86   SCM_CAR(ses) = SCM_EOL;\
87                                         \
88   return 0;\
89 }                                               \
90 ADD_SCM_INIT_FUNC(CL, CL::init_smobs)\
91
92
93 #endif /* LY_SMOBS_ICC */
94