#include "flower-proto.hh"
-class Acknowledge_information;
class All_font_metrics;
class Audio_column;
class Audio_control_function_value_change;
class Dot_configuration;
class Dot_formatting_problem;
class Engraver;
-class Engraver;
class Engraver_group;
class Event;
class Event_chord;
#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) \
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);
/* 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);
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);
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