X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffolded-repeat-iterator.cc;h=f22e8b879b323ab82fe45694bf526e805115202c;hb=b7bda3ecd08b19f4b598f40ca8940e183083fd4f;hp=ddc6e68839099eaf68e7e3d53e91c1032d4468b6;hpb=7181c77e5d46a271f5f76e99bee7f844611e23e4;p=lilypond.git diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index ddc6e68839..f22e8b879b 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--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_; + 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,23 @@ Folded_repeat_iterator::construct_children () void Folded_repeat_iterator::process (Moment m) { - if (!m) - { - 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; } } } @@ -96,36 +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->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_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);