+}
+
+void
+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];
+ 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]));
+ }
+ }
+
+ fetch_precomputable_methods (precomputed_self_method_bindings_);
+}
+
+void
+Translator_group::precomputed_translator_foreach (Translator_precompute_index idx)
+{
+ vector<Translator_method_binding> &bindings (precomputed_method_bindings_[idx]);
+ for (vsize i = 0; i < bindings.size (); i++)
+ bindings[i].invoke ();
+}
+
+void
+Translator_group::fetch_precomputable_methods (Translator_group_void_method ptrs[])
+{
+ for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++)
+ ptrs[i] = 0;
+}
+
+void
+Translator_group::call_precomputed_self_method (Translator_precompute_index idx)
+{
+ if (precomputed_self_method_bindings_[idx])
+ (*precomputed_self_method_bindings_[idx]) (this);
+}
+
+Translator_group::~Translator_group ()
+{
+}
+
+
+const char Translator_group::type_p_name_[] = "ly:translator-group?";
+
+int
+Translator_group::print_smob (SCM port, scm_print_state *) const
+{
+ scm_puts ("#<Translator_group ", port);
+ scm_puts (class_name (), port);
+ scm_display (simple_trans_list_, port);
+ scm_puts (" >", port);
+ return 1;
+}
+
+SCM
+Translator_group::mark_smob () const
+{
+ derived_mark ();
+ scm_gc_mark (protected_events_);
+ return simple_trans_list_;