source file of the GNU LilyPond music typesetter
- (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#ifndef TRANSLATOR_ICC
#define TRANSLATOR_ICC
+#include "std-vector.hh"
+#include "translator.hh"
+
/**
A macro to automate administration of translators.
*/
} \
ADD_GLOBAL_CTOR (_ ## T ## _adder);
-#define ADD_TRANSLATOR(classname, desc, grobs, accepted, acked, read, write) \
- DEFINE_STATIC_METHODS(classname);\
- IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(classname); \
+#define ADD_TRANSLATOR(classname, desc, grobs, accepted, read, write) \
+ vector<Acknowledge_information> classname::acknowledge_static_array_; \
+ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \
ADD_THIS_TRANSLATOR (classname); \
+ Engraver_void_function_engraver_grob_info \
+ classname::static_get_acknowledger (SCM sym) \
+ { \
+ return generic_get_acknowledger (sym, &acknowledge_static_array_); \
+ } \
SCM \
classname::static_translator_description () const \
{ \
static_properties = scm_acons (ly_symbol2scm ("description"), \
scm_makfrom0str (desc), static_properties); \
\
- static_properties = scm_acons (ly_symbol2scm ("interfaces-acked"), \
- parse_symbol_list (acked), static_properties); \
static_properties = scm_acons (ly_symbol2scm ("events-accepted"), \
parse_symbol_list (accepted), static_properties); \
\
return static_properties; \
}
-
-/*
- FIXME: should be able to cast statically to (T*) -iow.- remove
- Translator as a virtual base class.
- */
-#define DEFINE_STATIC_METHOD(T, x) \
-void \
-T::x ## _static (Translator* tr) \
-{ \
- T * t_ptr = (T*) (tr); \
- t_ptr->x ();\
-}
-
-#define DEFINE_STATIC_METHODS(T) \
- DEFINE_STATIC_METHOD(T,start_translation_timestep)\
- DEFINE_STATIC_METHOD(T,stop_translation_timestep)\
- DEFINE_STATIC_METHOD(T,process_music)\
- DEFINE_STATIC_METHOD(T,process_acknowledged)
-
-#define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
-void \
-T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])\
-{ \
- ptrs[START_TRANSLATION_TIMESTEP] = \
- ((Translator_void_method_ptr) &T::start_translation_timestep == \
- (Translator_void_method_ptr) &Translator::start_translation_timestep) \
- ? 0 \
- : &T::start_translation_timestep_static; \
+#define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \
+ void \
+ T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[]) \
+ { \
+ ptrs[START_TRANSLATION_TIMESTEP] = \
+ ((Translator_void_method_ptr) & T::start_translation_timestep == \
+ (Translator_void_method_ptr) & Translator::start_translation_timestep) \
+ ? 0 \
+ : (Translator_void_method_ptr) & T::start_translation_timestep; \
\
- ptrs[STOP_TRANSLATION_TIMESTEP] = \
- ((Translator_void_method_ptr) &T::stop_translation_timestep == (Translator_void_method_ptr) &Translator::stop_translation_timestep) \
- ? 0 \
- : &T::stop_translation_timestep_static; \
+ ptrs[STOP_TRANSLATION_TIMESTEP] = \
+ ((Translator_void_method_ptr) & T::stop_translation_timestep == (Translator_void_method_ptr) & Translator::stop_translation_timestep) \
+ ? 0 \
+ : (Translator_void_method_ptr) & T::stop_translation_timestep; \
\
- ptrs[PROCESS_MUSIC] = \
- ((Translator_void_method_ptr) &T::process_music == (Translator_void_method_ptr) &Translator::process_music) \
- ? 0 \
- : &T::process_music_static; \
+ ptrs[PROCESS_MUSIC] = \
+ ((Translator_void_method_ptr) & T::process_music == (Translator_void_method_ptr) & Translator::process_music) \
+ ? 0 \
+ : (Translator_void_method_ptr) & T::process_music; \
\
- ptrs[PROCESS_ACKNOWLEDGED] = \
- ((Translator_void_method_ptr) &T::process_acknowledged == (Translator_void_method_ptr) &Translator::process_acknowledged) \
- ? 0 \
- : &T::process_acknowledged_static; \
-}
+ ptrs[PROCESS_ACKNOWLEDGED] = \
+ ((Translator_void_method_ptr) & T::process_acknowledged == (Translator_void_method_ptr) & Translator::process_acknowledged) \
+ ? 0 \
+ : (Translator_void_method_ptr) & T::process_acknowledged; \
+ }
+
+void add_acknowledger (Engraver_void_function_engraver_grob_info ptr,
+ char const *func_name,
+ vector<Acknowledge_information> *ack_array);
+
+Engraver_void_function_engraver_grob_info
+generic_get_acknowledger (SCM sym,
+ vector<Acknowledge_information> const *ack_array);
+
+#define ADD_ACKNOWLEDGER(CLASS, NAME) \
+ void CLASS ## NAME ## _ack_adder () \
+ { \
+ add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_ ## NAME, #NAME, &CLASS::acknowledge_static_array_); \
+ } \
+ ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder);
#endif /* TRANSLATOR_ICC */