X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftranslator-group.cc;h=ccd0dd7dbe6588709efa9b6f50b39aeba6456b09;hb=abc2e31b608746a1ac924085a87244cc32ee7178;hp=5846c2bb37dac7c543e3449103ee9a551ae0ad24;hpb=69b9cead5afe7164b9053d26eba582fec3825ef8;p=lilypond.git diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 5846c2bb37..ccd0dd7dbe 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -3,27 +3,32 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "music-output-def.hh" #include "translator-group.hh" #include "translator.hh" #include "debug.hh" -#include "pcursor.hh" #include "rational.hh" +#include "dictionary-iter.hh" + +#include "killing-cons.tcc" Translator_group::Translator_group (Translator_group const&s) : Translator(s) { consists_str_arr_ = s.consists_str_arr_; + consists_end_str_arr_ = s.consists_end_str_arr_; accepts_str_arr_ = s.accepts_str_arr_; iterator_count_ =0; + properties_dict_ = s.properties_dict_; } Translator_group::~Translator_group () { assert (removable_b()); + trans_p_list_.junk (); } @@ -35,33 +40,84 @@ Translator_group::Translator_group() void Translator_group::check_removal() { - for (int i =0; i < group_l_arr ().size();) + Link_array groups (group_l_arr ()); + + for (int i =0; i < groups.size(); i++) { - group_l_arr ()[i]->check_removal(); - if (group_l_arr ()[i]->removable_b()) - terminate_translator (group_l_arr ()[i]); - else - i++; + groups[i]->check_removal(); + if (groups[i]->removable_b()) + terminate_translator (groups[i]); } } - - -IMPLEMENT_IS_TYPE_B1(Translator_group, Translator); - void -Translator_group::add (Translator *trans_p) +Translator_group::add_translator (Translator *trans_p) { - trans_p_list_.bottom().add (trans_p); + trans_p_list_.append (new Killing_cons (trans_p,0)); + trans_p->daddy_trans_l_ = this; trans_p->output_def_l_ = output_def_l_; trans_p->add_processing (); } +void +Translator_group::set_acceptor (String accepts, bool add) +{ + if (add) + accepts_str_arr_.push (accepts); + else + for (int i=accepts_str_arr_.size (); i--; ) + if (accepts_str_arr_[i] == accepts) + accepts_str_arr_.del (i); +} + +void +Translator_group::add_last_element (String s) +{ + if (!get_translator_l (s)) + error ("Program has no such type"); + + for (int i=consists_end_str_arr_.size (); i--; ) + if (consists_end_str_arr_[i] == s) + warning (_f("Already contains a `%s\'", s)); + + consists_end_str_arr_.push (s); +} + +void +Translator_group::set_element (String s, bool add) +{ + if (!get_translator_l (s)) + error ("Program has no such type"); + + if (add) + { + for (int i=consists_str_arr_.size (); i--; ) + if (consists_str_arr_[i] == s) + warning (_f("Already contains a `%s\'", s)); + + consists_str_arr_.push (s); + } + else + { + for (int i=consists_str_arr_.size (); i--; ) + if (consists_str_arr_[i] == s) + consists_str_arr_.del (i); + for (int i=consists_end_str_arr_.size (); i--; ) + if (consists_end_str_arr_[i] == s) + consists_end_str_arr_.del (i); + } +} bool Translator_group::removable_b() const { - return !(iterator_count_ || group_l_arr ().size()); + for (Cons *p = trans_p_list_.head_; p; p = p->next_) + { + if (dynamic_cast (p->car_)) + return false; + } + + return !iterator_count_; } Translator_group * @@ -69,10 +125,12 @@ Translator_group::find_existing_translator_l (String n, String id) { if (is_alias_b (n) && (id_str_ == id || id.empty_b ())) return this; + + Link_array groups (group_l_arr ()); Translator_group* r = 0; - for (int i =0; !r && i < group_l_arr ().size(); i++) + for (int i =0; !r && i < groups.size(); i++) { - r = group_l_arr ()[i]->find_existing_translator_l (n,id); + r = groups[i]->find_existing_translator_l (n,id); } return r; @@ -85,9 +143,9 @@ Translator_group::path_to_acceptable_translator (String type) const for (int i=0; i < accepts_str_arr_.size (); i++) { Translator *t = output_def_l ()->find_translator_l (accepts_str_arr_[i]); - if (!t || !t->group_l ()) + if (!t || !dynamic_cast (t)) continue; - accepted_arr.push (t->group_l()); + accepted_arr.push (dynamic_cast (t)); } @@ -133,8 +191,8 @@ 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 = path[i]->clone ()->group_l (); - current->add (new_group); + Translator_group * new_group = dynamic_cast(path[i]->clone ()); + current->add_translator (new_group); current = new_group; } current->id_str_ = id; @@ -146,21 +204,31 @@ Translator_group::find_create_translator_l (String n, String id) ret = daddy_trans_l_->find_create_translator_l (n,id); else { - warning (_("Can't find or create `") + n + _("' called `") + id + "'\n"); + warning (_f ("can't find or create `%s\' called `%s\'", n, id)); ret =0; } return ret; } - bool -Translator_group::do_try_request (Request* req_l) +Translator_group::try_music_on_nongroup_children (Music *m) { bool hebbes_b =false; - for (int i =0; !hebbes_b && i < nongroup_l_arr ().size() ; i++) - hebbes_b =nongroup_l_arr ()[i]->try_request (req_l); + + Link_array nongroups (nongroup_l_arr ()); + + for (int i =0; !hebbes_b && i < nongroups.size() ; i++) + hebbes_b =nongroups[i]->try_music (m); + return hebbes_b; +} + +bool +Translator_group::do_try_music (Music* m) +{ + bool hebbes_b = try_music_on_nongroup_children (m); + if (!hebbes_b && daddy_trans_l_) - hebbes_b = daddy_trans_l_->try_request (req_l); + hebbes_b = daddy_trans_l_->try_music (m); return hebbes_b ; } @@ -183,10 +251,10 @@ Link_array Translator_group::group_l_arr () const { Link_array groups; - for (PCursor i (trans_p_list_.top ()); i.ok (); i++) + for (Cons *p = trans_p_list_.head_; p; p = p->next_) { - if (i->group_l ()) - groups.push (i->group_l ()); + if (dynamic_cast (p->car_)) + groups.push (dynamic_cast (p->car_)); } return groups; } @@ -195,48 +263,58 @@ Link_array Translator_group::nongroup_l_arr () const { Link_array groups; - for (PCursor i (trans_p_list_.top ()); i.ok (); i++) + for (Cons *p = trans_p_list_.head_; p; p = p->next_) { - if (!i->group_l ()) - groups.push (i.ptr ()); + if (!dynamic_cast (p->car_)) + groups.push (p->car_); } return groups; } +/** + End translator: call "destructor", remove from hierarchy, and delete + */ void Translator_group::terminate_translator (Translator*r_l) { - DOUT << "Removing " << r_l->name() << " at " << now_moment () << "\n"; + DOUT << "Removing " << classname (r_l) << " at " << now_mom () << '\n'; r_l->removal_processing(); Translator * trans_p =remove_translator_p (r_l); delete trans_p; } + +/** + Remove a translator from the hierarchy. + */ Translator * Translator_group::remove_translator_p (Translator*trans_l) { assert (trans_l); - PCursor trans_cur (trans_p_list_.find (trans_l)); - Translator * t = trans_cur.remove_p(); - /* - For elegant design, we would do this too. Alas, it does not work yet.. + for (Cons **pp = &trans_p_list_.head_; *pp; pp = &(*pp)->next_) + if ((*pp)->car_ == trans_l) + { + Cons *r = trans_p_list_.remove_cons (pp); + r->car_ =0; + trans_l->daddy_trans_l_ =0; + delete r; + return trans_l; + } - t-> removal_processing (); - */ - t-> daddy_trans_l_ = 0; - return t; + return 0; } Translator* -Translator_group::get_simple_translator (char const *type) const +Translator_group::get_simple_translator (String type) const { - for (int i=0; i < nongroup_l_arr ().size(); i++) + Link_array nongroups (nongroup_l_arr ()); + for (int i=0; i < nongroups.size(); i++) { - if (nongroup_l_arr ()[i]->name() == type) - return nongroup_l_arr ()[i]; + if (classname (nongroups[i]) == type) + return nongroups[i]; } if (daddy_trans_l_) return daddy_trans_l_->get_simple_translator (type); @@ -258,8 +336,13 @@ Translator_group::get_default_interpreter() if (accepts_str_arr_.size()) { Translator*t = output_def_l ()->find_translator_l (accepts_str_arr_[0]); - Translator_group * g= t->clone ()->group_l (); - add (g); + if (!t) + { + warning (_f ("can't find or create `%s\'", accepts_str_arr_[0])); + t = this; + } + Translator_group * g= dynamic_cast (t->clone ()); + add_translator (g); if (!g->is_bottom_translator_b ()) return g->get_default_interpreter (); @@ -272,15 +355,16 @@ Translator_group::get_default_interpreter() void Translator_group::each (Method_pointer method) { - for (PCursor i (trans_p_list_.top ()); i.ok (); i++) - (i.ptr()->*method) (); + for (Cons *p = trans_p_list_.head_; p; p = p->next_) + (p->car_->*method) (); } + void Translator_group::each (Const_method_pointer method) const { - for (PCursor i (trans_p_list_.top ()); i.ok (); i++) - (i.ptr()->*method) (); + for (Cons *p = trans_p_list_.head_; p; p = p->next_) + (p->car_->*method) (); } void @@ -289,6 +373,10 @@ Translator_group::do_print() const #ifndef NPRINT if (!check_debug) return ; + for (Dictionary_iter i (properties_dict_); i.ok (); i++) + { + DOUT << i.key () << "=" << i.val () << '\n'; + } if (status == ORPHAN) { DOUT << "consists of: "; @@ -302,7 +390,7 @@ Translator_group::do_print() const { if (id_str_.length_i ()) DOUT << "ID: " << id_str_ ; - DOUT << " iterators: " << iterator_count_<< "\n"; + DOUT << " iterators: " << iterator_count_<< '\n'; } each (&Translator::print); #endif @@ -343,10 +431,47 @@ Translator_group::do_add_processing () { for (int i=0; i < consists_str_arr_.size(); i++) { - Translator * t = output_def_l ()->find_translator_l (consists_str_arr_[i]); + String s = consists_str_arr_[i]; + Translator * t = output_def_l ()->find_translator_l (s); if (!t) - warning (_("Could not find `") +consists_str_arr_[i]+ "'"); + warning (_f ("can't find `%s\'", s)); else - add (t->clone ()); + add_translator (t->clone ()); + } + for (int i=0; i-- < consists_end_str_arr_.size (); i++) + { + String s = consists_end_str_arr_[i]; + Translator * t = output_def_l ()->find_translator_l (s); + if (!t) + warning (_f ("can't find `%s\'", s)); + else + add_translator (t->clone ()); + } +} + +Scalar +Translator_group::get_property (String id, + Translator_group **where_l) const +{ + if (properties_dict_.elem_b (id)) + { + if (where_l) + *where_l = (Translator_group*) this; // ugh + return properties_dict_[id]; } + +#if 1 + if (daddy_trans_l_) + return daddy_trans_l_->get_property (id, where_l); +#endif + + if (where_l) + *where_l = 0; + return ""; +} + +void +Translator_group::set_property (String id, Scalar val) +{ + properties_dict_[id] = val; }