2 translator.icc -- declare Translator glue wiring.
4 source file of the GNU LilyPond music typesetter
6 (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
10 #define TRANSLATOR_ICC
15 A macro to automate administration of translators.
17 #define ADD_THIS_TRANSLATOR(T) \
18 SCM T::static_description_ = SCM_EOL; \
19 static void _ ## T ## _adder () \
22 T::static_description_ = t->static_translator_description (); \
23 scm_permanent_object (T::static_description_); \
26 SCM T::translator_description () const \
28 return static_description_; \
30 ADD_GLOBAL_CTOR (_ ## T ## _adder);
32 #define ADD_TRANSLATOR(classname, desc, grobs, accepted, read, write) \
33 Array<Acknowledge_information> classname::acknowledge_static_array_; \
34 IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \
35 ADD_THIS_TRANSLATOR (classname); \
36 Engraver_void_function_engraver_grob_info \
37 classname::static_get_acknowledger (SCM sym) \
39 return generic_get_acknowledger (sym, &acknowledge_static_array_); \
42 classname::static_translator_description () const \
44 SCM static_properties = SCM_EOL; \
45 /* static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
46 static_properties_); \
48 static_properties = scm_acons (ly_symbol2scm ("grobs-created"), \
49 parse_symbol_list (grobs), static_properties); \
51 static_properties = scm_acons (ly_symbol2scm ("description"), \
52 scm_makfrom0str (desc), static_properties); \
54 static_properties = scm_acons (ly_symbol2scm ("events-accepted"), \
55 parse_symbol_list (accepted), static_properties); \
57 static_properties = scm_acons (ly_symbol2scm ("properties-read"), \
58 parse_symbol_list (read), static_properties); \
60 static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
61 parse_symbol_list (write), static_properties); \
63 return static_properties; \
66 #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
68 T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[]) \
70 ptrs[START_TRANSLATION_TIMESTEP] = \
71 ((Translator_void_method_ptr) & T::start_translation_timestep == \
72 (Translator_void_method_ptr) & Translator::start_translation_timestep) \
74 : (Translator_void_method_ptr) & T::start_translation_timestep; \
76 ptrs[STOP_TRANSLATION_TIMESTEP] = \
77 ((Translator_void_method_ptr) & T::stop_translation_timestep == (Translator_void_method_ptr) & Translator::stop_translation_timestep) \
79 : (Translator_void_method_ptr) & T::stop_translation_timestep; \
81 ptrs[PROCESS_MUSIC] = \
82 ((Translator_void_method_ptr) & T::process_music == (Translator_void_method_ptr) & Translator::process_music) \
84 : (Translator_void_method_ptr) & T::process_music; \
86 ptrs[PROCESS_ACKNOWLEDGED] = \
87 ((Translator_void_method_ptr) & T::process_acknowledged == (Translator_void_method_ptr) & Translator::process_acknowledged) \
89 : (Translator_void_method_ptr) & T::process_acknowledged; \
92 void add_acknowledger (Engraver_void_function_engraver_grob_info ptr,
93 char const *func_name,
94 Array<Acknowledge_information> *ack_array);
96 Engraver_void_function_engraver_grob_info
97 generic_get_acknowledger (SCM sym,
98 Array<Acknowledge_information> const *ack_array);
100 #define ADD_ACKNOWLEDGER(CLASS, NAME) \
101 void CLASS ## NAME ## _ack_adder () \
103 add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_ ## NAME, #NAME, &CLASS::acknowledge_static_array_); \
105 ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder);
109 #endif /* TRANSLATOR_ICC */