[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
- Moving a number of C++ constructs to SCM, David Kastrup, 2016/05/02
- [PATCH 3/5] Add Method_instance class, David Kastrup, 2016/05/02
- [PATCH 1/5] Issue 4840: Make Translator/Performer/Engraver abstract base classes, David Kastrup, 2016/05/02
- [PATCH 4/5] Replace Engraver_dispatch_entry with Method_instance, David Kastrup, 2016/05/02
- [PATCH 2/5] Add Callback0_wrapper and Callback2_wrapper class, David Kastrup, 2016/05/02
- [PATCH 5/5] Replace Translator_method et al,
David Kastrup <=
- Re: Moving a number of C++ constructs to SCM, David Kastrup, 2016/05/03
- Re: Moving a number of C++ constructs to SCM, James Lowe, 2016/05/04