X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffolded-repeat-iterator.cc;h=b927653e0c1dfa02fed41e1a9fedfb0f6b6df287;hb=8347f6f06cd4c56d7a2d2ec482647afaaade1267;hp=71328c87d245098c16c2bab5c560e9a1563e8ec2;hpb=8da6cef580cce3365b219f6aca429b434cb60fcf;p=lilypond.git diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 71328c87d2..b927653e0c 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -1,59 +1,52 @@ -/* - repeated-music-iterator.cc -- implement Folded_repeat_iterator - - source file of the GNU LilyPond music typesetter - - (c) 1999--2000 Han-Wen Nienhuys - - */ +/* + folded-repeat-iterator.cc -- implement Folded_repeat_iterator + source file of the GNU LilyPond music typesetter -/* - Folded repeats are a stupid idea at this point, so we refrain from - implementing get_music () and skip (). + (c) 1999--2006 Han-Wen Nienhuys */ #include "folded-repeat-iterator.hh" + +#include "context.hh" +#include "input.hh" +#include "international.hh" #include "repeated-music.hh" -#include "music-list.hh" #include "simultaneous-music-iterator.hh" -#include "translator-group.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::pending_moment () const { - if (main_iter_p_) - { - return main_iter_p_->pending_moment (); - } + if (main_iter_) + 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()) + Music *mus = get_music (); + main_iter_ = unsmob_iterator (get_iterator (Repeated_music::body (mus))); + if (!main_iter_->ok ()) { leave_body (); enter_alternative (); @@ -63,32 +56,30 @@ Folded_repeat_iterator::construct_children () void 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 (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 (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; } } } @@ -96,38 +87,58 @@ 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; - 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); +IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator);