]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/translator.icc
* input/regression/slur-script.ly: Fixed.
[lilypond.git] / lily / include / translator.icc
1 /*
2   translator.icc -- declare Translator glue wiring.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #ifndef TRANSLATOR_ICC
11 #define TRANSLATOR_ICC
12
13 #include "array.hh"
14
15 /**
16    A macro to automate administration of translators.
17 */
18 #define ADD_THIS_TRANSLATOR(T)                                          \
19   SCM T::static_description_ = SCM_EOL;                                 \
20   static void _ ## T ## _adder ()                                       \
21   {                                                                     \
22     T *t = new T;                                                       \
23     T::static_description_ = t->static_translator_description ();       \
24     scm_permanent_object (T::static_description_);                      \
25     add_translator (t);                                                 \
26   }                                                                     \
27   SCM T::translator_description () const                                \
28   {                                                                     \
29     return static_description_;                                         \
30   }                                                                     \
31   ADD_GLOBAL_CTOR (_ ## T ## _adder);
32
33 #define ADD_TRANSLATOR(classname, desc, grobs, accepted, read, write) \
34   Array<Acknowledge_information> classname::acknowledge_static_array_;\
35   IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(classname); \
36   ADD_THIS_TRANSLATOR (classname);                                      \
37   Engraver_void_function_engraver_grob_info\
38   classname::static_get_acknowledger (SCM sym)                          \
39   {\
40     return generic_get_acknowledger (sym, &acknowledge_static_array_);\
41   }\
42   SCM                                                                   \
43   classname::static_translator_description () const                     \
44   {                                                                     \
45     SCM static_properties = SCM_EOL;                                    \
46     /*  static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
47         static_properties_);                                            \
48     */                                                                  \
49     static_properties = scm_acons (ly_symbol2scm ("grobs-created"),     \
50                                    parse_symbol_list (grobs), static_properties); \
51                                                                         \
52     static_properties = scm_acons (ly_symbol2scm ("description"),       \
53                                    scm_makfrom0str (desc), static_properties); \
54                                                                         \
55     static_properties = scm_acons (ly_symbol2scm ("events-accepted"),   \
56                                    parse_symbol_list (accepted), static_properties); \
57                                                                         \
58     static_properties = scm_acons (ly_symbol2scm ("properties-read"),   \
59                                    parse_symbol_list (read), static_properties); \
60                                                                         \
61     static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
62                                    parse_symbol_list (write), static_properties); \
63                                                                         \
64     return static_properties;                                           \
65   }
66
67 #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
68 void \
69 T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])\
70 {                                                                       \
71   ptrs[START_TRANSLATION_TIMESTEP] =                                    \
72     ((Translator_void_method_ptr) &T::start_translation_timestep == \
73      (Translator_void_method_ptr) &Translator::start_translation_timestep)      \
74     ? 0                                                                 \
75     : (Translator_void_method_ptr) &T::start_translation_timestep;      \
76                                                                         \
77   ptrs[STOP_TRANSLATION_TIMESTEP] =                                     \
78     ((Translator_void_method_ptr) &T::stop_translation_timestep == (Translator_void_method_ptr) &Translator::stop_translation_timestep) \
79     ? 0                                                                 \
80     : (Translator_void_method_ptr) &T::stop_translation_timestep;       \
81                                                                         \
82   ptrs[PROCESS_MUSIC] =                                                 \
83     ((Translator_void_method_ptr) &T::process_music == (Translator_void_method_ptr) &Translator::process_music)                 \
84     ? 0                                                                 \
85     : (Translator_void_method_ptr) &T::process_music;           \
86                                                                         \
87   ptrs[PROCESS_ACKNOWLEDGED] =                                          \
88     ((Translator_void_method_ptr) &T::process_acknowledged == (Translator_void_method_ptr) &Translator::process_acknowledged)   \
89     ? 0                                                                 \
90     : (Translator_void_method_ptr) &T::process_acknowledged;            \
91 }
92
93 void add_acknowledger (Engraver_void_function_engraver_grob_info ptr,
94                        char const *func_name,
95                        Array<Acknowledge_information> *ack_array);
96
97 Engraver_void_function_engraver_grob_info
98 generic_get_acknowledger (SCM sym,
99                           Array<Acknowledge_information> const *ack_array);
100
101 #define ADD_ACKNOWLEDGER(CLASS,NAME)            \
102 void CLASS ## NAME ## _ack_adder () \
103 {\
104   add_acknowledger ((Engraver_void_function_engraver_grob_info) &CLASS::acknowledge_ ## NAME, #NAME, &CLASS::acknowledge_static_array_);\
105 }\
106   ADD_SCM_INIT_FUNC(CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder); \
107
108
109
110
111 #endif /* TRANSLATOR_ICC */
112