]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4842/5: Store acknowledgers in a Scheme_hash_table
authorDavid Kastrup <dak@gnu.org>
Tue, 3 May 2016 16:07:49 +0000 (18:07 +0200)
committerDavid Kastrup <dak@gnu.org>
Sun, 8 May 2016 15:17:00 +0000 (17:17 +0200)
lily/include/lily-proto.hh
lily/include/translator.hh
lily/include/translator.icc
lily/translator.cc

index f574b39c3f25c0ecb69523bbce3bef8437d28742..ee3946e0fd02921167b4a3f57d142bee0a64d017 100644 (file)
@@ -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;
index ad8765fd54c1bf902b83c14f12d0ef2c5795c6ef..02761d3d2e10acd40e9a5dcf7b3c1f0859fcf881 100644 (file)
@@ -32,7 +32,7 @@
 #define TRANSLATOR_FAMILY_DECLARATIONS(NAME)                            \
   public:                                                               \
   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);                          \
-  static Drul_array<vector<Acknowledge_information> > acknowledge_static_array_drul_; \
+  static Drul_array<Protected_scm> 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);
index 1fc3f3a18a73ebb75873fdfc86e2306b1df78ac8..980f12451a94419ba08bbb8354416d4766598b8d 100644 (file)
   /* end define */
 
 #define DEFINE_ACKNOWLEDGERS(classname) \
-  Drul_array< vector<Acknowledge_information> > classname::acknowledge_static_array_drul_;      \
+  Drul_array<Protected_scm> 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 */
 
 
 void add_acknowledger (SCM ptr,
                        char const *func_name,
-                       vector<Acknowledge_information> *ack_array);
+                       Protected_scm &ack_hash);
 
 SCM
-generic_get_acknowledger (SCM sym,
-                          vector<Acknowledge_information> 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);
 
index 780ef1befc17be217d884d9af43c374021cdc72d..4a234e28172f48b4c55ceee0a0c07a82bb6cc05b 100644 (file)
@@ -232,32 +232,27 @@ Translator::print_smob (SCM port, scm_print_state *) const
 void
 add_acknowledger (SCM ptr,
                   char const *func_name,
-                  vector<Acknowledge_information> *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<Scheme_hash_table> (ack_hash)
+    ->set (ly_symbol2scm (interface_name.c_str ()), ptr);
 }
 
 SCM
-generic_get_acknowledger (SCM sym, vector<Acknowledge_information> 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<Scheme_hash_table> (ack_hash)->get (sym);
 }
 
 Moment