X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsequential-music-iterator.cc;h=d99381cf5415a8645039c6251cf44388c58e6575;hb=9661ba1fb275f3e14f8a69f2cee2f02a2f893e48;hp=66a479efad0599370f7ce047f8a37426ce4a0c58;hpb=42ab6ff971c06253b34f96ed122836ab88d09cc0;p=lilypond.git diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc index 66a479efad..d99381cf54 100644 --- a/lily/sequential-music-iterator.cc +++ b/lily/sequential-music-iterator.cc @@ -3,13 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys + (c) 1997--2000 Han-Wen Nienhuys */ - +#include "grace-iterator.hh" #include "translator-group.hh" #include "debug.hh" #include "sequential-music-iterator.hh" #include "music-list.hh" +#include "request-chord-iterator.hh" + void Sequential_music_iterator::do_print() const @@ -28,9 +30,9 @@ Sequential_music_iterator::Sequential_music_iterator () void Sequential_music_iterator::construct_children() { - cursor_ = dynamic_cast (music_l_)->music_p_list_p_->head_; + cursor_ = dynamic_cast (music_l_)->music_list (); - while (cursor_) + while (gh_pair_p (cursor_ )) { start_next_element(); if (!iter_p_->ok()) @@ -50,36 +52,46 @@ Sequential_music_iterator::leave_element() { delete iter_p_; iter_p_ =0; - Moment elt_time = cursor_->car_->length_mom (); + Moment elt_time = unsmob_music (gh_car (cursor_))->length_mom (); here_mom_ += elt_time; - cursor_ =cursor_->next_; + cursor_ =gh_cdr (cursor_); } void Sequential_music_iterator::start_next_element() { assert (!iter_p_); - iter_p_ = get_iterator_p (cursor_->car_); + iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_))); } void Sequential_music_iterator::set_sequential_music_translator() { - if (iter_p_->report_to_l()->depth_i () > report_to_l ()->depth_i ()) - set_translator (iter_p_->report_to_l()); + Translator_group * child_report = child_report = iter_p_->report_to_l (); + if (dynamic_cast (iter_p_)) + child_report = child_report->daddy_trans_l_; + + if (report_to_l()->depth_i () < child_report->depth_i ()) + set_translator (child_report); } Sequential_music_iterator::~Sequential_music_iterator() { - assert (! iter_p_); + if (iter_p_) + { + if (iter_p_->ok ()) + music_l_->origin ()->warning (_ ("Must stop before this music ends")); + delete iter_p_; + iter_p_ = 0; + } } - - - void Sequential_music_iterator::do_process_and_next (Moment until) { + if (!iter_p_) + return; + while (1) { Moment local_until = until - here_mom_; @@ -91,20 +103,16 @@ Sequential_music_iterator::do_process_and_next (Moment until) iter_p_->process_and_next (local_until); } - + if (!iter_p_->ok()) { + set_sequential_music_translator(); leave_element(); - if (cursor_) - { - start_next_element(); - set_sequential_music_translator(); - } + if (gh_pair_p (cursor_)) + start_next_element(); else - { - goto loopexit; - } + goto loopexit; } } @@ -119,9 +127,15 @@ Sequential_music_iterator::next_moment() const return iter_p_->next_moment() + here_mom_; } + bool Sequential_music_iterator::ok() const { return iter_p_; } +Music_iterator* +Sequential_music_iterator::try_music_in_children (Music *m) const +{ + return iter_p_ ? iter_p_->try_music (m) : 0; +}