X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffolded-repeat-iterator.cc;h=17ef87275e1dc2d17342e8326790760253c9321d;hb=1bba302abc6b79d82a822a6a1803e8bb0e0225a0;hp=38241b8cf413cb1e6fc7b3fb06b16a646300a893;hpb=9661ba1fb275f3e14f8a69f2cee2f02a2f893e48;p=lilypond.git diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 38241b8cf4..17ef87275e 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -1,53 +1,51 @@ -/* - repeated-music-iterator.cc -- implement Folded_repeat_iterator - +/* + folded-repeat-iterator.cc -- implement Folded_repeat_iterator + source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Han-Wen Nienhuys - - */ + + (c) 1999--2005 Han-Wen Nienhuys +*/ #include "folded-repeat-iterator.hh" + +#include "input.hh" #include "repeated-music.hh" -#include "music-list.hh" #include "simultaneous-music-iterator.hh" -#include "translator-group.hh" +#include "context.hh" Folded_repeat_iterator::Folded_repeat_iterator () { - main_iter_p_ = 0; - alternative_iter_p_ = 0; + main_iter_ = 0; + alternative_iter_ = 0; } bool Folded_repeat_iterator::ok () const { - return main_iter_p_ || alternative_iter_p_; + return main_iter_ || alternative_iter_; } - -Folded_repeat_iterator::~Folded_repeat_iterator () +void +Folded_repeat_iterator::do_quit () { - delete main_iter_p_; - delete alternative_iter_p_; + if (main_iter_)main_iter_->quit (); + if (alternative_iter_)alternative_iter_->quit (); } Moment -Folded_repeat_iterator::next_moment () const +Folded_repeat_iterator::pending_moment () const { - if (main_iter_p_) - { - return main_iter_p_->next_moment (); - } + if (main_iter_) + return main_iter_->pending_moment (); else - return main_length_mom_ + alternative_iter_p_->next_moment (); + return main_length_mom_ + alternative_iter_->pending_moment (); } void Folded_repeat_iterator::construct_children () { - Repeated_music * mus = dynamic_cast (music_l_); - main_iter_p_ = get_iterator_p (mus->body ()); - if (!main_iter_p_->ok()) + Music *mus = get_music (); + main_iter_ = unsmob_iterator (get_iterator (Repeated_music::body (mus))); + if (!main_iter_->ok ()) { leave_body (); enter_alternative (); @@ -55,34 +53,32 @@ Folded_repeat_iterator::construct_children () } void -Folded_repeat_iterator::do_process_and_next (Moment m) +Folded_repeat_iterator::process (Moment m) { - if (!m) + if (!m.to_bool ()) { - bool success = try_music (music_l_); + bool success = try_music (get_music ()); if (!success) - music_l_->origin ()->warning ( _("no one to print a repeat brace")); + get_music ()->origin ()->warning (_ ("no one to print a repeat brace")); } - - if (main_iter_p_) + + if (main_iter_) { - main_iter_p_->process_and_next (m); - if (!main_iter_p_->ok ()) + main_iter_->process (m); + if (!main_iter_->ok ()) leave_body (); } - if (!main_iter_p_ && !alternative_iter_p_) - { - enter_alternative (); - } - - if (alternative_iter_p_) + if (!main_iter_ && !alternative_iter_) + enter_alternative (); + + if (alternative_iter_) { - alternative_iter_p_->process_and_next (m - main_length_mom_); - if (!alternative_iter_p_->ok ()) + alternative_iter_->process (m - main_length_mom_); + if (!alternative_iter_->ok ()) { - delete alternative_iter_p_; - alternative_iter_p_ =0; + alternative_iter_->quit (); + alternative_iter_ = 0; } } } @@ -90,36 +86,58 @@ Folded_repeat_iterator::do_process_and_next (Moment m) void Folded_repeat_iterator::leave_body () { - Repeated_music * mus = dynamic_cast (music_l_); - delete main_iter_p_; - main_iter_p_ = 0; - main_length_mom_ += mus->body ()->length_mom (); + Music *mus = get_music (); + + main_iter_->quit (); + main_iter_ = 0; + main_length_mom_ += Repeated_music::body (mus)->get_length (); } void Folded_repeat_iterator::enter_alternative () { - Repeated_music * mus = dynamic_cast (music_l_); - if (mus->alternatives ()) + Music *mus = get_music (); + if (scm_is_pair (Repeated_music::alternatives (mus))) { - Simultaneous_music_iterator * s = new Simultaneous_music_iterator; - s->separate_contexts_b_ = true; - s->init_translator (mus->alternatives (), report_to_l ()); - - alternative_iter_p_ = s; - alternative_iter_p_->construct_children (); + /* + ugh. + */ + Simultaneous_music_iterator *s = new Simultaneous_music_iterator; + s->create_separate_contexts_ = true; + s->init_translator (mus, get_outlet ()); + + alternative_iter_ = s; + alternative_iter_->construct_children (); + + s->unprotect (); } } - -Music_iterator* -Folded_repeat_iterator::try_music_in_children (Music * m) const +Music_iterator * +Folded_repeat_iterator::try_music_in_children (Music *m) const { - if (main_iter_p_) - { - return main_iter_p_->try_music (m); - } - if (alternative_iter_p_) - return alternative_iter_p_->try_music (m); + if (main_iter_) + return main_iter_->try_music (m); + if (alternative_iter_) + return alternative_iter_->try_music (m); return 0; } +void +Folded_repeat_iterator::derived_mark () const +{ + if (main_iter_) + scm_gc_mark (main_iter_->self_scm ()); + if (alternative_iter_) + scm_gc_mark (alternative_iter_->self_scm ()); +} + +void +Folded_repeat_iterator::derived_substitute (Context *f, Context *t) +{ + if (main_iter_) + main_iter_->substitute_outlet (f, t); + if (alternative_iter_) + alternative_iter_->substitute_outlet (f, t); +} + +IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator);