lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/5] Replace Translator_method et al


From: David Kastrup
Subject: [PATCH 5/5] Replace Translator_method et al
Date: Tue, 3 May 2016 00:58:32 +0200

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.
---
 lily/context.cc                  | 10 +++++++---
 lily/include/translator-group.hh | 35 ++++++--------------------------
 lily/include/translator.hh       | 18 ++++++++++++++---
 lily/include/translator.icc      | 21 ++++++--------------
 lily/score-engraver.cc           |  8 +++++---
 lily/score-performer.cc          |  9 +++++----
 lily/translator-group.cc         | 43 ++++++++++++++++++++--------------------
 7 files changed, 66 insertions(+), 78 deletions(-)

diff --git a/lily/context.cc b/lily/context.cc
index a6b1da6..d96382e 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
+             <Translator, &Translator::finalize> (),
+             Callback0_wrapper::make_smob
+             <Translator_group, &Translator_group::finalize> (),
+             UP);
           send_stream_event (ctx, "RemoveContext", 0, 0);
         }
     }
diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh
index d90c292..6eec233 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<Translator_group>
 {
 public:
@@ -56,10 +33,10 @@ public:
   virtual ~Translator_group ();
 private:
   void precompute_method_bindings ();
-  vector<Translator_method_binding>
+  vector<Method_instance>
   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 ea8b978..ad8765f 100644
--- a/lily/include/translator.hh
+++ b/lily/include/translator.hh
@@ -33,7 +33,7 @@
   public:                                                               \
   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);                          \
   static Drul_array<vector<Acknowledge_information> > 
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 <void (NAME::*mf)()>                                         \
+  static SCM method_finder () { return method_find_base<NAME, mf> (); } \
   template <void (NAME::*callback)(Grob_info)>                          \
   static SCM ack_finder () { return ack_find_base<NAME, callback> (); } \
   /* end #define */
@@ -102,7 +105,6 @@ enum Translator_precompute_index
 class Translator : public Smob<Translator>
 {
 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 <class T, void (T::*mf)()>
+  static SCM
+  method_find_base () { return Callback0_wrapper::make_smob<T, mf> (); }
+
+  // Fallback for non-overriden callbacks for which &T::x degrades to
+  // &Translator::x
+  template <void (Translator::*)()>
+  static SCM
+  method_finder () { return SCM_UNDEFINED; }
+
   // Overriden in Engraver.
   template <class T, void (T::*callback)(Grob_info)>
   static SCM
diff --git a/lily/include/translator.icc b/lily/include/translator.icc
index cebfba5..1fc3f3a 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<Callback> (&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<Callback> (&T::stop_translation_timestep);         \
-                                                                       \
+      method_finder <&T::stop_translation_timestep> ();                 \
+                                                                        \
     ptrs[PROCESS_MUSIC] =                                              \
-      (&T::process_music == &Translator::process_music)                        
\
-      ? 0                                                              \
-      : static_cast<Callback> (&T::process_music);                     \
+      method_finder <&T::process_music> ();                             \
                                                                        \
     ptrs[PROCESS_ACKNOWLEDGED] =                                       \
-      (&T::process_acknowledged == &Translator::process_acknowledged)  \
-      ? 0                                                              \
-      : static_cast<Callback> (&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 3e4fb97..88ea4af 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<Translator, &Translator::finalize> (),
+     Callback0_wrapper::make_smob<Translator_group, 
&Translator_group::finalize> (),
+     UP);
 }
 
 #define MUSIC_FONT "emmentaler-20"
diff --git a/lily/score-performer.cc b/lily/score-performer.cc
index 4ea42ed..b44bb48 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<Translator, &Translator::finalize> (),
+     Callback0_wrapper::make_smob<Translator_group, 
&Translator_group::finalize> (),
+     UP);
 }
 
 void
diff --git a/lily/translator-group.cc b/lily/translator-group.cc
index e3f8cba..6e47a85 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<Translator> (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<Translator, &Translator::initialize> (),
+     Callback0_wrapper::make_smob<Translator_group, 
&Translator_group::initialize> (),
+     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<Translator_group *> (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<Translator> (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<Translator_method_binding> &bindings 
(precomputed_method_bindings_[idx]);
+  vector<Method_instance> &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 ()
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]