X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Ftranslator.icc;h=1d45061578ecc8338834c00eaf142ed36566c5d2;hb=91723da7360b372904979b2d572f3f941ebbc924;hp=827908901d4bbcacab37883369d16c57725181f5;hpb=59a6d1a06432fc0ca88c3023c646182f389ec1b5;p=lilypond.git diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 827908901d..1d45061578 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -20,9 +20,9 @@ #ifndef TRANSLATOR_ICC #define TRANSLATOR_ICC -#include "listener.hh" +#include "callback.hh" #include "std-vector.hh" -#include "translator.hh" +#include "engraver.hh" /* TODO: derive "foo-bar-interface" from Foo_bar classname. @@ -35,6 +35,7 @@ SCM T::static_description_ = SCM_EOL; \ static void _ ## T ## _adder () \ { \ + T::boot (); \ T *t = new T; \ T::static_description_ = \ scm_permanent_object (t->static_translator_description ()); \ @@ -44,7 +45,7 @@ { \ return static_description_; \ } \ - ADD_GLOBAL_CTOR (_ ## T ## _adder); \ + ADD_GLOBAL_CTOR (_ ## T ## _adder); \ /* end define */ #define DEFINE_TRANSLATOR_LISTENER_LIST(T) \ @@ -52,16 +53,12 @@ /* end define */ #define DEFINE_ACKNOWLEDGERS(classname) \ - Drul_array< std::vector > classname::acknowledge_static_array_drul_; \ - Translator::Grob_info_callback \ - classname::static_get_acknowledger (SCM sym) \ - { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[START]); \ - } \ - Translator::Grob_info_callback \ - classname::static_get_end_acknowledger (SCM sym) \ + Drul_array classname::acknowledge_static_array_drul_; \ + SCM \ + classname::static_get_acknowledger (SCM sym, Direction start_end) \ { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[STOP]); \ + return generic_get_acknowledger \ + (sym, acknowledge_static_array_drul_[start_end]); \ } \ /* end define */ @@ -74,73 +71,49 @@ #define ADD_TRANSLATOR(classname, desc, grobs, read, write) \ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \ + DEFINE_ACKNOWLEDGERS(classname); \ ADD_THIS_TRANSLATOR (classname); \ DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \ - DEFINE_ACKNOWLEDGERS(classname) \ - DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ + DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \ void \ - T::fetch_precomputable_methods (Translator::Callback ptrs[]) \ + T::fetch_precomputable_methods (SCM ptrs[]) \ { \ ptrs[START_TRANSLATION_TIMESTEP] = \ - (&T::start_translation_timestep \ - == &Translator::start_translation_timestep) \ - ? 0 \ - : static_cast (&T::start_translation_timestep); \ + method_finder <&T::start_translation_timestep> (); \ \ ptrs[STOP_TRANSLATION_TIMESTEP] = \ - (& T::stop_translation_timestep == & Translator::stop_translation_timestep) \ - ? 0 \ - : static_cast (&T::stop_translation_timestep); \ - \ + method_finder <&T::stop_translation_timestep> (); \ + \ ptrs[PROCESS_MUSIC] = \ - (&T::process_music == &Translator::process_music) \ - ? 0 \ - : static_cast (&T::process_music); \ + method_finder <&T::process_music> (); \ \ ptrs[PROCESS_ACKNOWLEDGED] = \ - (&T::process_acknowledged == &Translator::process_acknowledged) \ - ? 0 \ - : static_cast (&T::process_acknowledged); \ + method_finder <&T::process_acknowledged> (); \ } -void add_acknowledger (Translator::Grob_info_callback ptr, +void add_acknowledger (SCM ptr, char const *func_name, - std::vector *ack_array); - -Translator::Grob_info_callback -generic_get_acknowledger (SCM sym, - std::vector const *ack_array); + Protected_scm &ack_hash); #define ADD_ACKNOWLEDGER(CLASS, NAME) \ - void CLASS ## NAME ## _ack_adder () \ - { \ - add_acknowledger (static_cast (&CLASS::acknowledge_ ## NAME), #NAME, &CLASS::acknowledge_static_array_drul_[START]); \ - } \ - ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder); + add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_ ## NAME> (), \ + #NAME, CLASS::acknowledge_static_array_drul_[START]); + +#define ADD_END_ACKNOWLEDGER(CLASS, NAME) \ + add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_end_ ## NAME> (), \ + #NAME, CLASS::acknowledge_static_array_drul_[STOP]); -#define ADD_END_ACKNOWLEDGER(CLASS, NAME) \ - void CLASS ## NAME ## _end_ack_adder () \ - { \ - add_acknowledger (static_cast (&CLASS::acknowledge_end_ ## NAME), #NAME, &CLASS::acknowledge_static_array_drul_[STOP]); \ - } \ - ADD_SCM_INIT_FUNC (CLASS ## NAME ## _end_ack_adder_initclass, CLASS ## NAME ## _end_ack_adder); /* Implement the method cl::listen_##m, and make it listen to stream events of class m. */ -#define IMPLEMENT_TRANSLATOR_LISTENER(cl, m) \ -void \ -cl :: _internal_declare_ ## m () \ -{ \ +#define ADD_LISTENER(cl, m) \ listener_list_ = scm_acons \ (event_class_symbol (#m), \ - Callback_wrapper::make_smob (), \ - listener_list_); \ -} \ - \ -ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m); + Callback_wrapper::make_smob \ + > (), listener_list_); #endif /* TRANSLATOR_ICC */