virtual bool must_be_last () const;
private:
- void acknowledge_grob_by_hash (Grob_info info, SCM iface_function_hash);
+ virtual SCM get_acknowledger (SCM sym)
+ {
+ return generic_get_acknowledger (sym, interface_acknowledger_hash_);
+ }
+ virtual SCM get_end_acknowledger (SCM sym)
+ {
+ return generic_get_acknowledger (sym, interface_end_acknowledger_hash_);
+ }
+
void init_acknowledgers (SCM alist, SCM *hash);
// For now no description. In future, something derived from the
// definition might make sense.
SCM translator_description () const { return SCM_EOL; }
- DECLARE_ACKNOWLEDGER (grob);
- DECLARE_END_ACKNOWLEDGER (grob);
-
bool must_be_last_;
SCM acknowledge_grob_function_;
#define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \
public: \
VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \
- static Drul_array<Protected_scm> acknowledge_static_array_drul_; \
virtual void fetch_precomputable_methods (SCM methods[]); \
DECLARE_TRANSLATOR_CALLBACKS (NAME); \
TRANSLATOR_INHERIT (Translator) \
- static SCM static_get_acknowledger (SCM sym); \
- static SCM static_get_end_acknowledger(SCM); \
- virtual SCM get_acknowledger (SCM sym) \
- { \
- return static_get_acknowledger (sym); \
- } \
- virtual SCM get_end_acknowledger (SCM sym) \
- { \
- return static_get_end_acknowledger (sym); \
- } \
/* end #define */
#define TRANSLATOR_INHERIT(BASE) \
#define TRANSLATOR_DECLARATIONS(NAME) \
public: \
TRANSLATOR_FAMILY_DECLARATIONS (NAME); \
+ static Drul_array<Protected_scm> acknowledge_static_array_drul_; \
static SCM static_description_; \
static Protected_scm listener_list_; \
+ static SCM static_get_acknowledger (SCM sym); \
+ static SCM static_get_end_acknowledger(SCM); \
+ virtual SCM get_acknowledger (SCM sym) \
+ { \
+ return static_get_acknowledger (sym); \
+ } \
+ virtual SCM get_end_acknowledger (SCM sym) \
+ { \
+ return static_get_end_acknowledger (sym); \
+ } \
public: \
NAME (); \
virtual SCM static_translator_description () const; \
void add_translator (Translator *trans);
Translator *get_translator (SCM s);
+
+SCM
+generic_get_acknowledger (SCM sym, SCM ack_hash);
+
Moment get_event_length (Stream_event *s, Moment now);
Moment get_event_length (Stream_event *s);
}
#define ADD_TRANSLATOR_FAMILY(classname) \
- IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \
- DEFINE_ACKNOWLEDGERS(classname) \
+ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname);
#define ADD_TRANSLATOR(classname, desc, grobs, read, write) \
ADD_TRANSLATOR_FAMILY (classname); \
+ DEFINE_ACKNOWLEDGERS(classname); \
ADD_THIS_TRANSLATOR (classname); \
DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \
DEFINE_TRANSLATOR_LISTENER_LIST(classname) \
char const *func_name,
Protected_scm &ack_hash);
-SCM
-generic_get_acknowledger (SCM sym, SCM ack_hash);
-
#define ADD_ACKNOWLEDGER(CLASS, NAME) \
void CLASS ## NAME ## _ack_adder () \
{ \
#include "translator.icc"
+#include "scm-hash.hh"
+
Scheme_engraver::Scheme_engraver (SCM definition)
{
stop_translation_timestep_function_ = SCM_EOL;
Scheme_engraver::init_acknowledgers (SCM alist,
SCM *hash)
{
- *hash = scm_c_make_hash_table (7);
+ *hash = Scheme_hash_table::make_smob ();
for (SCM p = alist; scm_is_pair (p); p = scm_cdr (p))
{
SCM iface = scm_caar (p);
if (!(ly_is_procedure (proc) && ly_is_symbol (iface)))
continue;
- scm_hashq_set_x (*hash, iface, proc);
- }
-}
-
-// This is the easy way to do it, at the cost of too many invocations
-// of Scheme_engraver::acknowledge_grob. The clever dispatching of
-// acknowledgers is hardwired to have 1 method per engraver per
-// grob-type, which doesn't work for this case.
-void
-Scheme_engraver::acknowledge_grob (Grob_info info)
-{
- acknowledge_grob_by_hash (info, interface_acknowledger_hash_);
-}
-
-void
-Scheme_engraver::acknowledge_end_grob (Grob_info info)
-{
- acknowledge_grob_by_hash (info, interface_end_acknowledger_hash_);
-}
-
-void
-Scheme_engraver::acknowledge_grob_by_hash (Grob_info info,
- SCM iface_function_hash)
-{
- SCM meta = info.grob ()->get_property ("meta");
- SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta));
- for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s))
- {
- SCM func = scm_hashq_ref (iface_function_hash,
- scm_car (s), SCM_BOOL_F);
-
- if (ly_is_procedure (func))
- scm_call_3 (func, self_scm (), info.grob ()->self_scm (),
- info.origin_translator ()->self_scm ());
+ unsmob<Scheme_hash_table>(*hash)->set (iface, proc);
}
}
scm_gc_mark (interface_end_acknowledger_hash_);
}
-ADD_ACKNOWLEDGER (Scheme_engraver, grob);
-ADD_END_ACKNOWLEDGER (Scheme_engraver, grob);
-
ADD_TRANSLATOR_FAMILY (Scheme_engraver);