X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftranslator-group.cc;h=24416817d00941fb8a32113d78cbf357e636f99a;hb=f988425624a6f6d1a48aea0ac0c1c84ff0857e56;hp=d2b7c83a04dbcd637bdf31ac8ab7759d81a9ed23;hpb=f1346920f64c571a1475d3ded295b9637560c6bc;p=lilypond.git diff --git a/lily/translator-group.cc b/lily/translator-group.cc index d2b7c83a04..24416817d0 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -13,6 +13,7 @@ #include "moment.hh" #include "scm-hash.hh" #include "killing-cons.tcc" +#include "translator-def.hh" Translator_group::Translator_group (Translator_group const&s) : Translator(s) @@ -32,7 +33,8 @@ Translator_group::properties_dict () const Translator_group::~Translator_group () { - assert (removable_b()); + + //assert (removable_b()); } @@ -73,11 +75,6 @@ Translator_group::add_translator (SCM list, Translator *t) return list; } void -Translator_group::add_simple_translator (Translator*t) -{ - simple_trans_list_ = add_translator (simple_trans_list_, t); -} -void Translator_group::add_group_translator (Translator *t) { trans_group_list_ = add_translator (trans_group_list_,t); @@ -108,45 +105,8 @@ Translator_group::find_existing_translator_l (String n, String id) return r; } -Link_array -Translator_group::path_to_acceptable_translator (String type, Music_output_def* odef) const -{ - Link_array accepted_arr; - for (SCM s = accepts_name_list_; gh_pair_p (s); s = gh_cdr (s)) - { - - Translator *t = odef->find_translator_l (ly_scm2string (gh_car (s))); - if (!t || !dynamic_cast (t)) - continue; - accepted_arr.push (dynamic_cast (t)); - } - - for (int i=0; i < accepted_arr.size (); i++) - if (accepted_arr[i]->type_str_ == type) - { - Link_array retval; - retval.push (accepted_arr[i]); - return retval; - } - Link_array best_result; - int best_depth= INT_MAX; - for (int i=0; i < accepted_arr.size (); i++) - { - Translator_group * g = accepted_arr[i]; - - Link_array result - = g->path_to_acceptable_translator (type, odef); - if (result.size () && result.size () < best_depth) - { - result.insert (g,0); - best_result = result; - } - } - - return best_result; -} Translator_group* Translator_group::find_create_translator_l (String n, String id) @@ -155,8 +115,8 @@ Translator_group::find_create_translator_l (String n, String id) if (existing) return existing; - Link_array path - = path_to_acceptable_translator (n, output_def_l ()); + Link_array path + = unsmob_translator_def (definition_)->path_to_acceptable_translator (ly_str02scm ((char*)n.ch_C()), output_def_l ()); if (path.size ()) { @@ -165,7 +125,7 @@ Translator_group::find_create_translator_l (String n, String id) // start at 1. The first one (index 0) will be us. for (int i=0; i < path.size (); i++) { - Translator_group * new_group = dynamic_cast(path[i]->clone ()); + Translator_group * new_group = path[i]->instantiate (output_def_l_); current->add_group_translator (new_group); current = new_group; @@ -227,10 +187,10 @@ void Translator_group::terminate_translator (Translator*r_l) { r_l->removal_processing(); - Translator * trans_p =remove_translator_p (r_l); /* - forget trans_p, GC does the rest. + Return value ignored. GC does the rest. */ + remove_translator_p (r_l); } @@ -247,7 +207,10 @@ Translator_group::remove_translator_p (Translator*trans_l) return trans_l; } - +#if 0 +/* + should not use, instead: use properties to communicate between engravers. + */ Translator* Translator_group::get_simple_translator (String type) const { @@ -260,35 +223,36 @@ Translator_group::get_simple_translator (String type) const return daddy_trans_l_->get_simple_translator (type); return 0; } - +#endif bool Translator_group::is_bottom_translator_b () const { - return accepts_name_list_ == SCM_EOL; -} - + return !gh_string_p (unsmob_translator_def (definition_)->default_child_context_name ()); +} Translator_group* Translator_group::get_default_interpreter() { - if (gh_pair_p (accepts_name_list_)) + if (!is_bottom_translator_b ()) { - String str = ly_scm2string (gh_car (accepts_name_list_)); - Translator*t = output_def_l ()->find_translator_l (str); + SCM nm = unsmob_translator_def (definition_)->default_child_context_name (); + SCM st = output_def_l ()->find_translator_l (nm); + + Translator_def *t = unsmob_translator_def (st); if (!t) { - warning (_f ("can't find or create: `%s'", str)); - t = this; + warning (_f ("can't find or create: `%s'", ly_scm2string (nm).ch_C())); + t = unsmob_translator_def (this->definition_); } - Translator_group * g= dynamic_cast (t->clone ()); - add_group_translator (g); + Translator_group *tg = t->instantiate (output_def_l_); + add_group_translator (tg); - if (!g->is_bottom_translator_b ()) - return g->get_default_interpreter (); + if (!tg->is_bottom_translator_b ()) + return tg->get_default_interpreter (); else - return g; + return tg; } return this; } @@ -308,66 +272,17 @@ Translator_group::each (Method_pointer method) static_each (trans_group_list_, method); } -void -Translator_group::do_print() const -{ -#ifndef NPRINT -#endif -} - -static SCM -trans_list (SCM namelist, Music_output_def *mdef) -{ - SCM l = SCM_EOL; - for (SCM s = namelist; gh_pair_p (s) ; s = gh_cdr (s)) - { - Translator * t = mdef->find_translator_l (ly_scm2string (gh_car (s))); - if (!t) - warning (_f ("can't find: `%s'", s)); - else - { - Translator * tr = t->clone (); - SCM str = tr->self_scm (); - l = gh_cons (str, l); - scm_unprotect_object (str); - } - } - return l; -} void Translator_group::do_add_processing () { - assert (simple_trans_list_== SCM_EOL); - - SCM correct_order = scm_reverse (property_pushes_); // pity of the mem. - for (SCM s = correct_order; gh_pair_p (s); s = gh_cdr (s)) - { - SCM entry = gh_car (s); - SCM val = gh_cddr (entry); - val = gh_pair_p (val) ? gh_car (val) : SCM_UNDEFINED; - - Translator_group_initializer::apply_pushpop_property (this, gh_car (entry), - gh_cadr (entry), - val); - } - - SCM l1 = trans_list (consists_name_list_, output_def_l ()); - SCM l2 =trans_list (end_consists_name_list_, output_def_l ()); - l1 = scm_reverse_x (l1, l2); - - simple_trans_list_ = l1; - for (SCM s = l1; gh_pair_p (s) ; s = gh_cdr (s)) + unsmob_translator_def (definition_)->apply_property_operations (this); + for (SCM s = simple_trans_list_; gh_pair_p (s) ; s = gh_cdr (s)) { Translator * t = unsmob_translator (gh_car (s)); - - t->daddy_trans_l_ = this; - t->output_def_l_ = output_def_l_; t->add_processing (); } - - } /* @@ -387,15 +302,14 @@ Translator_group::where_defined (SCM sym) const SCM Translator_group::get_property (SCM sym) const { - if (properties_dict ()->elem_b (sym)) - { - return properties_dict ()->get (sym); - } + SCM val =SCM_UNDEFINED; + if (properties_dict ()->try_retrieve (sym, &val)) + return val; if (daddy_trans_l_) return daddy_trans_l_->get_property (sym); - return SCM_UNDEFINED; + return val; } void @@ -423,8 +337,15 @@ Translator_group::execute_single_pushpop_property (SCM prop, SCM eltprop, SCM va { SCM prev = get_property (prop); - prev = gh_cons (gh_cons (eltprop, val), prev); - set_property (prop, prev); + /* + we don't tack onto SCM_UNDEFINED, because it creates + errors down the line, if we do scm_assoc(). + */ + if (gh_pair_p (prev) || prev == SCM_EOL) + { + prev = gh_cons (gh_cons (eltprop, val), prev); + set_property (prop, prev); + } } else {