X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffolded-repeat-iterator.cc;h=f22e8b879b323ab82fe45694bf526e805115202c;hb=8c0213576d4f811c826a828c38fe418ab50b66ce;hp=ec30d1b5485030e0e96875183893146859f3ebe9;hpb=d9b43b93f2c885409bafdb157138158f65cc49aa;p=lilypond.git diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index ec30d1b548..f22e8b879b 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -1,69 +1,54 @@ -/* - repeated-music-iterator.cc -- implement Folded_repeat_iterator - - source file of the GNU LilyPond music typesetter - - (c) 1999--2002 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--2007 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_; -} - -Folded_repeat_iterator::~Folded_repeat_iterator () -{ - delete main_iter_p_; - delete alternative_iter_p_; + return main_iter_ || alternative_iter_; } - -Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src) - : Music_iterator (src) +void +Folded_repeat_iterator::do_quit () { - 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_length_mom_ = src.main_length_mom_; + 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 (); + leave_body (); enter_alternative (); } } @@ -71,32 +56,23 @@ Folded_repeat_iterator::construct_children () void Folded_repeat_iterator::process (Moment m) { - if (!m.to_bool () ) - { - bool success = try_music (music_l ()); - if (!success) - music_l ()->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; } } } @@ -104,38 +80,49 @@ 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, 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_context (mus, get_outlet ()); + + alternative_iter_ = s; + alternative_iter_->construct_children (); + + s->unprotect (); } } +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 ()); +} -Music_iterator* -Folded_repeat_iterator::try_music_in_children (Music * m) const +void +Folded_repeat_iterator::derived_substitute (Context *f, Context *t) { - if (main_iter_p_) - { - return main_iter_p_->try_music (m); - } - if (alternative_iter_p_) - return alternative_iter_p_->try_music (m); - return 0; + if (main_iter_) + main_iter_->substitute_outlet (f, t); + if (alternative_iter_) + alternative_iter_->substitute_outlet (f, t); } IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator);