From: David Kastrup Date: Fri, 29 Apr 2016 15:45:57 +0000 (+0200) Subject: Issue 4842/4: Replace Translator_method et al X-Git-Tag: release/2.19.42-1~12 X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=0c538805488f6a6c134fe88ccef58995037535e9;p=lilypond.git Issue 4842/4: Replace Translator_method et al All of Translator_method, Translator_group_method, Translator_group_void_method, Callback can be expressed via SCM now. Translator_method_binding is replaced with Method_instance. --- diff --git a/lily/context.cc b/lily/context.cc index a6b1da6a36..d96382e968 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -49,9 +49,13 @@ Context::check_removal () ctx->check_removal (); if (ctx->is_removable ()) { - recurse_over_translators (ctx, &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (ctx, + Callback0_wrapper::make_smob + (), + Callback0_wrapper::make_smob + (), + UP); send_stream_event (ctx, "RemoveContext", 0, 0); } } diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh index d90c2929de..6eec2333a6 100644 --- a/lily/include/translator-group.hh +++ b/lily/include/translator-group.hh @@ -20,33 +20,10 @@ #ifndef TRANSLATOR_GROUP_HH #define TRANSLATOR_GROUP_HH +#include "callback.hh" #include "listener.hh" #include "translator.hh" -typedef void (Translator:: *Translator_method) (void); -typedef void (Translator_group:: *Translator_group_method) (void); -typedef void (*Translator_group_void_method) (Translator_group *); - -struct Translator_method_binding -{ - Translator *translator_; - Translator::Callback method_; - - Translator_method_binding () - { - } - Translator_method_binding (Translator *tr, Translator::Callback ptr) - { - translator_ = tr; - method_ = ptr; - } - void invoke () - { - if (method_) - (translator_->*method_) (); - } -}; - class Translator_group : public Smob { public: @@ -56,10 +33,10 @@ public: virtual ~Translator_group (); private: void precompute_method_bindings (); - vector + vector precomputed_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; - Translator_group_void_method + SCM precomputed_self_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; SCM protected_events_; @@ -80,7 +57,7 @@ public: void stop_translation_timestep (); void start_translation_timestep (); - virtual void fetch_precomputable_methods (Translator_group_void_method[]); + virtual void fetch_precomputable_methods (SCM []); Translator_group (); @@ -97,8 +74,8 @@ protected: }; SCM names_to_translators (SCM namelist, Context *tg); -void recurse_over_translators (Context *c, Translator_method ptr, - Translator_group_method ptr2, Direction); +void recurse_over_translators (Context *c, SCM tr_method, + SCM tr_group_method, Direction); void precomputed_recurse_over_translators (Context *c, Translator_precompute_index idx, Direction dir); Translator_group *get_translator_group (SCM sym); diff --git a/lily/include/translator.hh b/lily/include/translator.hh index ea8b9782ae..ad8765fd54 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -33,7 +33,7 @@ public: \ VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ static Drul_array > acknowledge_static_array_drul_; \ - virtual void fetch_precomputable_methods (Callback methods[]); \ + virtual void fetch_precomputable_methods (SCM methods[]); \ DECLARE_TRANSLATOR_CALLBACKS (NAME); \ TRANSLATOR_INHERIT (Translator) \ static SCM static_get_acknowledger (SCM sym); \ @@ -49,9 +49,12 @@ /* end #define */ #define TRANSLATOR_INHERIT(BASE) \ + using BASE::method_finder; \ using BASE::ack_finder; #define DECLARE_TRANSLATOR_CALLBACKS(NAME) \ + template \ + static SCM method_finder () { return method_find_base (); } \ template \ static SCM ack_finder () { return ack_find_base (); } \ /* end #define */ @@ -102,7 +105,6 @@ enum Translator_precompute_index class Translator : public Smob { public: - typedef void (Translator::*Callback) (void); int print_smob (SCM, scm_print_state *) const; SCM mark_smob () const; static const char type_p_name_[]; @@ -139,7 +141,7 @@ public: DECLARE_CLASSNAME (Translator); virtual Translator *clone () const = 0; - virtual void fetch_precomputable_methods (Callback methods[]) = 0; + virtual void fetch_precomputable_methods (SCM methods[]) = 0; virtual SCM get_listener_list () const = 0; virtual SCM translator_description () const = 0; virtual SCM get_acknowledger (SCM sym) = 0; @@ -161,6 +163,16 @@ protected: // should be private. return SCM_UNSPECIFIED; } + template + static SCM + method_find_base () { return Callback0_wrapper::make_smob (); } + + // Fallback for non-overriden callbacks for which &T::x degrades to + // &Translator::x + template + static SCM + method_finder () { return SCM_UNDEFINED; } + // Overriden in Engraver. template static SCM diff --git a/lily/include/translator.icc b/lily/include/translator.icc index cebfba52e9..1fc3f3a18a 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -84,28 +84,19 @@ #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 (SCM ptr, diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 3e4fb97315..88ea4af86f 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -58,9 +58,11 @@ Score_engraver::prepare (SCM) void Score_engraver::finish (SCM) { - recurse_over_translators (context (), &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (context (), + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + UP); } #define MUSIC_FONT "emmentaler-20" diff --git a/lily/score-performer.cc b/lily/score-performer.cc index 4ea42ed143..b44bb489f5 100644 --- a/lily/score-performer.cc +++ b/lily/score-performer.cc @@ -118,10 +118,11 @@ Score_performer::finish (SCM) SCM channel_mapping = context ()->get_property ("midiChannelMapping"); bool use_ports = scm_is_eq (channel_mapping, ly_symbol2scm ("voice")); performance_->ports_ = use_ports; - recurse_over_translators (context (), - &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (context (), + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + UP); } void diff --git a/lily/translator-group.cc b/lily/translator-group.cc index e3f8cba3e8..6e47a85ad9 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -36,10 +36,10 @@ #include "warn.hh" void -translator_each (SCM list, Translator_method method) +translator_each (SCM list, SCM method) { for (SCM p = list; scm_is_pair (p); p = scm_cdr (p)) - (unsmob (scm_car (p))->*method) (); + scm_call_1 (method, scm_car (p)); } void @@ -219,10 +219,11 @@ Translator_group::create_child_translator (SCM sev) g->connect_to_context (new_context); g->unprotect (); - recurse_over_translators (new_context, - &Translator::initialize, - &Translator_group::initialize, - DOWN); + recurse_over_translators + (new_context, + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + DOWN); } SCM @@ -255,15 +256,15 @@ precomputed_recurse_over_translators (Context *c, Translator_precompute_index id } void -recurse_over_translators (Context *c, Translator_method ptr, - Translator_group_method tg_ptr, Direction dir) +recurse_over_translators (Context *c, SCM ptr, + SCM tg_ptr, Direction dir) { - Translator_group *tg - = dynamic_cast (c->implementation ()); + Translator_group *tg = c->implementation (); + SCM tg_scm = tg ? tg->self_scm () : SCM_UNDEFINED; if (tg && dir == DOWN) { - (tg->*tg_ptr) (); + scm_call_1 (tg_ptr, tg_scm); translator_each (tg->get_simple_trans_list (), ptr); } @@ -276,7 +277,7 @@ recurse_over_translators (Context *c, Translator_method ptr, translator_each (tg->get_simple_trans_list (), ptr); - (tg->*tg_ptr) (); + scm_call_1 (tg_ptr, tg_scm); } } @@ -299,14 +300,14 @@ Translator_group::precompute_method_bindings () for (SCM s = simple_trans_list_; scm_is_pair (s); s = scm_cdr (s)) { Translator *tr = unsmob (scm_car (s)); - Translator::Callback ptrs[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; + SCM ptrs[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; tr->fetch_precomputable_methods (ptrs); assert (tr); for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) { - if (ptrs[i]) - precomputed_method_bindings_[i].push_back (Translator_method_binding (tr, ptrs[i])); + if (!SCM_UNBNDP (ptrs[i])) + precomputed_method_bindings_[i].push_back (Method_instance (ptrs[i], tr)); } } @@ -316,23 +317,23 @@ Translator_group::precompute_method_bindings () void Translator_group::precomputed_translator_foreach (Translator_precompute_index idx) { - vector &bindings (precomputed_method_bindings_[idx]); + vector &bindings (precomputed_method_bindings_[idx]); for (vsize i = 0; i < bindings.size (); i++) - bindings[i].invoke (); + bindings[i](); } void -Translator_group::fetch_precomputable_methods (Translator_group_void_method ptrs[]) +Translator_group::fetch_precomputable_methods (SCM ptrs[]) { for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) - ptrs[i] = 0; + ptrs[i] = SCM_UNDEFINED; } void Translator_group::call_precomputed_self_method (Translator_precompute_index idx) { - if (precomputed_self_method_bindings_[idx]) - (*precomputed_self_method_bindings_[idx]) (this); + if (!SCM_UNBNDP (precomputed_self_method_bindings_[idx])) + scm_call_1 (precomputed_self_method_bindings_[idx], self_scm ()); } Translator_group::~Translator_group ()