LEFT | RIGHT |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 #define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ | 33 #define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ |
34 public: \ | 34 public: \ |
35 VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ | 35 VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ |
36 virtual void fetch_precomputable_methods (SCM methods[]); \ | 36 virtual void fetch_precomputable_methods (SCM methods[]); \ |
37 DECLARE_TRANSLATOR_CALLBACKS (NAME); \ | 37 DECLARE_TRANSLATOR_CALLBACKS (NAME); \ |
38 TRANSLATOR_INHERIT (Translator); \ | 38 TRANSLATOR_INHERIT (Translator); \ |
39 /* end #define */ | 39 /* end #define */ |
40 | 40 |
41 #define TRANSLATOR_INHERIT(BASE) \ | 41 #define TRANSLATOR_INHERIT(BASE) \ |
42 using BASE::method_finder | 42 using BASE::method_finder; \ |
| 43 using BASE::ack_finder; |
43 | 44 |
44 #define DECLARE_TRANSLATOR_CALLBACKS(NAME) \ | 45 #define DECLARE_TRANSLATOR_CALLBACKS(NAME) \ |
45 template <void (NAME::*mf)()> \ | 46 template <void (NAME::*mf)()> \ |
46 static SCM method_finder () { return method_find_base<NAME, mf> (); } \ | 47 static SCM method_finder () \ |
| 48 { \ |
| 49 return Callback0_wrapper::make_smob<NAME, mf> (); \ |
| 50 } \ |
| 51 template <void (NAME::*mf)(Stream_event *)> \ |
| 52 static SCM method_finder () \ |
| 53 { \ |
| 54 return Callback_wrapper::make_smob<trampoline<NAME, mf> > (); \ |
| 55 } \ |
| 56 template <void (NAME::*callback)(Grob_info)> \ |
| 57 static SCM ack_finder () { \ |
| 58 return Callback2_wrapper::make_smob<ack_trampoline <NAME, callback> > (); \ |
| 59 } \ |
47 /* end #define */ | 60 /* end #define */ |
48 | 61 |
49 /* | 62 /* |
50 Each translator class has a static alist of event class symbols | 63 Each translator class has a static alist of event class symbols |
51 mapping to callbacks that are called with a translator instance and | 64 mapping to callbacks that are called with a translator instance and |
52 a stream event when an event of the appropriate event class is | 65 a stream event when an event of the appropriate event class is |
53 announced in a context. | 66 announced in a context. |
54 */ | 67 */ |
55 | 68 |
56 #define TRANSLATOR_DECLARATIONS(NAME) \ | 69 #define TRANSLATOR_DECLARATIONS(NAME) \ |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 { | 153 { |
141 T *t = unsmob<T> (target); | 154 T *t = unsmob<T> (target); |
142 LY_ASSERT_SMOB (T, target, 1); | 155 LY_ASSERT_SMOB (T, target, 1); |
143 LY_ASSERT_SMOB (Stream_event, event, 2); | 156 LY_ASSERT_SMOB (Stream_event, event, 2); |
144 | 157 |
145 t->protect_event (event); | 158 t->protect_event (event); |
146 (t->*callback) (unsmob<Stream_event> (event)); | 159 (t->*callback) (unsmob<Stream_event> (event)); |
147 return SCM_UNSPECIFIED; | 160 return SCM_UNSPECIFIED; |
148 } | 161 } |
149 | 162 |
150 template <class T, void (T::*mf)()> | |
151 static SCM | |
152 method_find_base () { return Callback0_wrapper::make_smob<T, mf> (); } | |
153 | |
154 // Fallback for non-overriden callbacks for which &T::x degrades to | 163 // Fallback for non-overriden callbacks for which &T::x degrades to |
155 // &Translator::x | 164 // &Translator::x |
156 template <void (Translator::*)()> | 165 template <void (Translator::*)()> |
157 static SCM | 166 static SCM |
158 method_finder () { return SCM_UNDEFINED; } | 167 method_finder () { return SCM_UNDEFINED; } |
| 168 |
| 169 // Overriden in Engraver. Don't instantiate. |
| 170 template <class T, void (T::*)(Grob_info)> |
| 171 static SCM ack_trampoline (SCM, SCM, SCM); |
| 172 |
| 173 // Overriden in Engraver. Don't instantiate. |
| 174 template <void (Translator::*)(Grob_info)> |
| 175 static SCM ack_finder (); |
159 | 176 |
160 virtual void derived_mark () const; | 177 virtual void derived_mark () const; |
161 static SCM event_class_symbol (const char *ev_class); | 178 static SCM event_class_symbol (const char *ev_class); |
162 SCM static_translator_description (const char *grobs, | 179 SCM static_translator_description (const char *grobs, |
163 const char *desc, | 180 const char *desc, |
164 SCM listener_list, | 181 SCM listener_list, |
165 const char *read, | 182 const char *read, |
166 const char *write) const; | 183 const char *write) const; |
167 | 184 |
168 friend class Translator_group; | 185 friend class Translator_group; |
169 }; | 186 }; |
170 | 187 |
171 void add_translator (Translator *trans); | 188 void add_translator (Translator *trans); |
172 | 189 |
173 Translator *get_translator (SCM s); | 190 Translator *get_translator (SCM s); |
174 | 191 |
175 SCM | 192 SCM |
176 generic_get_acknowledger (SCM sym, SCM ack_hash); | 193 generic_get_acknowledger (SCM sym, SCM ack_hash); |
177 | 194 |
178 Moment get_event_length (Stream_event *s, Moment now); | 195 Moment get_event_length (Stream_event *s, Moment now); |
179 Moment get_event_length (Stream_event *s); | 196 Moment get_event_length (Stream_event *s); |
180 | 197 |
181 /* | 198 /* |
182 This helper is only meaningful inside listen_* methods. | 199 This helper is only meaningful inside listen_* methods. |
183 */ | 200 */ |
184 extern bool internal_event_assignment (Stream_event **old_ev, Stream_event *new_
ev, const char *function); | 201 extern bool internal_event_assignment (Stream_event **old_ev, Stream_event *new_
ev, const char *function); |
185 #define ASSIGN_EVENT_ONCE(o,n) internal_event_assignment (&o, n, __FUNCTION__) | 202 #define ASSIGN_EVENT_ONCE(o,n) internal_event_assignment (&o, n, __FUNCTION__) |
186 | 203 |
187 #endif // TRANSLATOR_HH | 204 #endif // TRANSLATOR_HH |
LEFT | RIGHT |