X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffolded-repeat-iterator.cc;h=b2e07aed32d6ba45a581dd93b30ac962bbd8c0f3;hb=d765f3af45be51f15da55cf570a4b172200e1035;hp=58b1decf54da23986825673f5882d7e84ab50cff;hpb=ebd181bdf74b864a670d12a0a8cc8392595f3408;p=lilypond.git diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 58b1decf54..b2e07aed32 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -1,16 +1,16 @@ /* - 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--2001 Han-Wen Nienhuys + (c) 1999--2002 Han-Wen Nienhuys */ /* Folded repeats are a stupid idea at this point, so we refrain from - implementing get_music () and skip (). + implementing get_pending_events () and skip (). */ #include "folded-repeat-iterator.hh" @@ -21,49 +21,53 @@ 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(); } Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src) : Music_iterator (src) { - main_iter_p_ = src.main_iter_p_ ? src.main_iter_p_->clone () : 0; - alternative_iter_p_ = src.alternative_iter_p_ ? src.alternative_iter_p_->clone () : 0; + main_iter_ = src.main_iter_ ? src.main_iter_->clone () : 0; + alternative_iter_ = src.alternative_iter_ ? src.alternative_iter_->clone () : 0; main_length_mom_ = src.main_length_mom_; + if (main_iter_) + scm_gc_unprotect_object (main_iter_->self_scm()); + if (alternative_iter_) + scm_gc_unprotect_object (alternative_iter_->self_scm()); } Moment Folded_repeat_iterator::pending_moment () const { - if (main_iter_p_) + if (main_iter_) { - return main_iter_p_->pending_moment (); + return main_iter_->pending_moment (); } else - return main_length_mom_ + alternative_iter_p_->pending_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 ()) + Repeated_music * mus = dynamic_cast (get_music ()); + main_iter_ = unsmob_iterator (get_iterator (mus->body ())); + if (!main_iter_->ok ()) { - leave_body (); + leave_body (); enter_alternative (); } } @@ -73,30 +77,30 @@ Folded_repeat_iterator::process (Moment 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 (m); - if (!main_iter_p_->ok ()) + main_iter_->process (m); + if (!main_iter_->ok ()) leave_body (); } - if (!main_iter_p_ && !alternative_iter_p_) + if (!main_iter_ && !alternative_iter_) { enter_alternative (); } - if (alternative_iter_p_) + if (alternative_iter_) { - alternative_iter_p_->process (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; } } } @@ -104,24 +108,30 @@ Folded_repeat_iterator::process (Moment m) void Folded_repeat_iterator::leave_body () { - Repeated_music * mus = dynamic_cast (music_l ()); - delete main_iter_p_; - main_iter_p_ = 0; + Repeated_music * mus = dynamic_cast (get_music ()); + + main_iter_->quit (); + main_iter_ = 0; main_length_mom_ += mus->body ()->length_mom (); } void Folded_repeat_iterator::enter_alternative () { - Repeated_music * mus = dynamic_cast (music_l ()); + Repeated_music * mus = dynamic_cast (get_music ()); if (mus->alternatives ()) { + /* + ugh. + */ Simultaneous_music_iterator * s = new Simultaneous_music_iterator; s->separate_contexts_b_ = true; - s->init_translator (mus, report_to_l ()); + s->init_translator (mus, report_to ()); - alternative_iter_p_ = s; - alternative_iter_p_->construct_children (); + alternative_iter_ = s; + alternative_iter_->construct_children (); + + scm_gc_unprotect_object (s->self_scm()); } } @@ -129,13 +139,20 @@ Folded_repeat_iterator::enter_alternative () Music_iterator* Folded_repeat_iterator::try_music_in_children (Music * m) const { - if (main_iter_p_) + if (main_iter_) { - return main_iter_p_->try_music (m); + return main_iter_->try_music (m); } - if (alternative_iter_p_) - return alternative_iter_p_->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()); +} IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator);