From: David Kastrup Date: Tue, 3 May 2016 16:07:49 +0000 (+0200) Subject: Issue 4842/5: Store acknowledgers in a Scheme_hash_table X-Git-Tag: release/2.19.42-1~11 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0e00ce29ec21b053824754651b07c9cc02124d16;p=lilypond.git Issue 4842/5: Store acknowledgers in a Scheme_hash_table --- diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index f574b39c3f..ee3946e0fd 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -22,7 +22,6 @@ #include "flower-proto.hh" -class Acknowledge_information; class All_font_metrics; class Audio_column; class Audio_control_function_value_change; @@ -59,7 +58,6 @@ class Dot_column; class Dot_configuration; class Dot_formatting_problem; class Engraver; -class Engraver; class Engraver_group; class Event; class Event_chord; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index ad8765fd54..02761d3d2e 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -32,7 +32,7 @@ #define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ public: \ VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ - static Drul_array > acknowledge_static_array_drul_; \ + static Drul_array acknowledge_static_array_drul_; \ virtual void fetch_precomputable_methods (SCM methods[]); \ DECLARE_TRANSLATOR_CALLBACKS (NAME); \ TRANSLATOR_INHERIT (Translator) \ @@ -193,19 +193,6 @@ protected: // should be private. friend class Translator_group; }; -struct Acknowledge_information -{ - SCM symbol_; - SCM function_; - - Acknowledge_information () - { - symbol_ = SCM_EOL; - function_ = SCM_UNDEFINED; - } -}; - - void add_translator (Translator *trans); Translator *get_translator (SCM s); diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 1fc3f3a18a..980f12451a 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -52,16 +52,16 @@ /* end define */ #define DEFINE_ACKNOWLEDGERS(classname) \ - Drul_array< vector > classname::acknowledge_static_array_drul_; \ + Drul_array classname::acknowledge_static_array_drul_; \ SCM \ classname::static_get_acknowledger (SCM sym) \ { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[START]); \ + return generic_get_acknowledger (sym, acknowledge_static_array_drul_[START]); \ } \ SCM \ classname::static_get_end_acknowledger (SCM sym) \ { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[STOP]); \ + return generic_get_acknowledger (sym, acknowledge_static_array_drul_[STOP]); \ } \ /* end define */ @@ -101,17 +101,16 @@ void add_acknowledger (SCM ptr, char const *func_name, - vector *ack_array); + Protected_scm &ack_hash); SCM -generic_get_acknowledger (SCM sym, - vector const *ack_array); +generic_get_acknowledger (SCM sym, SCM ack_hash); #define ADD_ACKNOWLEDGER(CLASS, NAME) \ void CLASS ## NAME ## _ack_adder () \ { \ add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_ ## NAME> (), \ - #NAME, &CLASS::acknowledge_static_array_drul_[START]); \ + #NAME, CLASS::acknowledge_static_array_drul_[START]); \ } \ ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder); @@ -119,7 +118,7 @@ generic_get_acknowledger (SCM sym, void CLASS ## NAME ## _end_ack_adder () \ { \ add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_end_ ## NAME> (), \ - #NAME, &CLASS::acknowledge_static_array_drul_[STOP]); \ + #NAME, CLASS::acknowledge_static_array_drul_[STOP]); \ } \ ADD_SCM_INIT_FUNC (CLASS ## NAME ## _end_ack_adder_initclass, CLASS ## NAME ## _end_ack_adder); diff --git a/lily/translator.cc b/lily/translator.cc index 780ef1befc..4a234e2817 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -232,32 +232,27 @@ Translator::print_smob (SCM port, scm_print_state *) const void add_acknowledger (SCM ptr, char const *func_name, - vector *ack_array) + Protected_scm &ack_hash) { - Acknowledge_information inf; - inf.function_ = ptr; + if (SCM_UNBNDP (SCM (ack_hash))) + ack_hash = Scheme_hash_table::make_smob (); string interface_name (func_name); interface_name = replace_all (&interface_name, '_', '-'); interface_name += "-interface"; - /* - this is only called during program init, so safe to use scm_gc_protect_object () - */ - inf.symbol_ = scm_gc_protect_object (ly_symbol2scm (interface_name.c_str ())); - ack_array->push_back (inf); + unsmob (ack_hash) + ->set (ly_symbol2scm (interface_name.c_str ()), ptr); } SCM -generic_get_acknowledger (SCM sym, vector const *ack_array) +generic_get_acknowledger (SCM sym, SCM ack_hash) { - for (vsize i = 0; i < ack_array->size (); i++) - { - if (ack_array->at (i).symbol_ == sym) - return ack_array->at (i).function_; - } - return SCM_UNDEFINED; + if (SCM_UNBNDP (ack_hash)) + return SCM_UNDEFINED; + + return unsmob (ack_hash)->get (sym); } Moment