X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fsequential-iterator.cc;h=105126cc75cbdbe43ed753bb84ce4b2cf2c24d08;hb=832c21ee509c9ad488e1490ad59a650e89c8f53a;hp=c63d812ccb95b790fd7a7f54c7363555dac51997;hpb=e37010af17faa8b185de836664b6544bd29dc1d0;p=lilypond.git diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index c63d812ccb..105126cc75 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -10,9 +10,7 @@ #include "context.hh" #include "sequential-iterator.hh" #include "music-list.hh" - -Grace_fixup *copy_grace_fixups (Grace_fixup* src); -Grace_fixup *get_grace_fixups (SCM cursor); +#include "grace-fixup.hh" /* @@ -25,7 +23,7 @@ Grace_fixup *get_grace_fixups (SCM cursor); Invariant for the data structure. - if (gh_pair_p (cursor_)) + if (ly_c_pair_p (cursor_)) iter_->music_ == unsmob_music (ly_car (cursor_)) else iter_ == 0; @@ -39,10 +37,9 @@ Grace_fixup *get_grace_fixups (SCM cursor); Sequential_iterator::Sequential_iterator () { here_mom_ = Moment (0); - list_ = SCM_EOL; cursor_ = SCM_EOL; grace_fixups_ = 0; - iter_ =0; + iter_ = 0; } SCM @@ -55,49 +52,50 @@ void Sequential_iterator::do_quit () { if (iter_) - iter_->quit(); + iter_->quit (); } void -Sequential_iterator::derived_mark ()const +Sequential_iterator::derived_mark () const { if (iter_) - scm_gc_mark (iter_->self_scm()); - scm_gc_mark (list_); + scm_gc_mark (iter_->self_scm ()); scm_gc_mark (cursor_); } void -Sequential_iterator::derived_substitute (Context *f,Context *t) +Sequential_iterator::derived_substitute (Context *f, Context *t) { if (iter_) - iter_->substitute_outlet (f,t); - + iter_->substitute_outlet (f, t); } +/* + TODO: this should be made lazily. + */ Grace_fixup * -get_grace_fixups (SCM cursor) +create_grace_fixup_list (SCM cursor) { Moment here; Moment last (-1); Grace_fixup *head = 0; Grace_fixup **tail = &head; - for (; gh_pair_p (cursor); cursor = ly_cdr (cursor)) + for (; ly_c_pair_p (cursor); cursor = ly_cdr (cursor)) { - Music * mus = unsmob_music (ly_car (cursor)); + Music *mus = unsmob_music (ly_car (cursor)); Moment s = mus->start_mom (); - Moment l =mus->get_length () - s; + Moment l = mus->get_length () - s; if (s.grace_part_) { if (last != Moment (-1)) { - Grace_fixup *p =new Grace_fixup; + Grace_fixup *p = new Grace_fixup; p->start_ = last; p->length_ = here - last; p->grace_start_ = s.grace_part_; @@ -109,41 +107,25 @@ get_grace_fixups (SCM cursor) here.grace_part_ = s.grace_part_; } - if (l.to_bool()) + if (l.to_bool ()) { last = here; here += l; } } - return head; -} - -Grace_fixup * -copy_grace_fixups (Grace_fixup* src) -{ - Grace_fixup * head = 0; - Grace_fixup **dest = &head; - - while (src) - { - *dest = new Grace_fixup (*src); - dest = & (*dest)->next_; - src = src ->next_; - } - + return head; } void Sequential_iterator::construct_children () { - list_ = get_music_list (); - cursor_ = list_; + cursor_ = get_music_list (); iter_ = 0; - if (gh_pair_p (cursor_)) + if (ly_c_pair_p (cursor_)) { - Music *m =unsmob_music (ly_car (cursor_)); + Music *m = unsmob_music (ly_car (cursor_)); iter_ = unsmob_iterator (get_iterator (m)); } @@ -152,14 +134,15 @@ Sequential_iterator::construct_children () next_element (true); } + last_mom_ = Moment (-1); here_mom_ = get_music ()->start_mom (); - grace_fixups_ = get_grace_fixups (cursor_); + grace_fixups_ = create_grace_fixup_list (cursor_); /* iter_->ok () is tautology, but what the heck. */ if (iter_ && iter_->ok ()) - descend_to_child (); + descend_to_child (iter_->get_outlet ()); } @@ -173,18 +156,20 @@ Sequential_iterator::next_element (bool) Moment len =iter_->music_get_length () - iter_->music_start_mom (); assert (!grace_fixups_ || grace_fixups_->start_ >= here_mom_); - if (len.main_part_ && grace_fixups_ && - grace_fixups_->start_ == here_mom_) + if (len.main_part_ + && get_grace_fixup ()) { - here_mom_ += grace_fixups_->length_; - here_mom_.grace_part_ += grace_fixups_->grace_start_; + Grace_fixup *gf = get_grace_fixup (); + + last_mom_ = here_mom_; + here_mom_ += gf->length_; + here_mom_.grace_part_ += gf->grace_start_; - Grace_fixup * n =grace_fixups_->next_; - delete grace_fixups_; - grace_fixups_ = n; + next_grace_fixup (); } else if (len.grace_part_ && !len.main_part_) { + last_mom_ = here_mom_; here_mom_.grace_part_ =0; } else @@ -196,38 +181,19 @@ Sequential_iterator::next_element (bool) in that chunk should be in len.grace_part_ */ + last_mom_ = here_mom_;; here_mom_ += len; } cursor_ = ly_cdr (cursor_); - iter_->quit(); - if (gh_pair_p (cursor_)) + iter_->quit (); + if (ly_c_pair_p (cursor_)) iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_)))); else iter_ = 0; } -/* - move to context of child iterator if it is deeper down in the - hierarchy. - */ -void -Sequential_iterator::descend_to_child () -{ - Context * child_report = child_report = iter_->get_outlet (); - Context * me_report = get_outlet (); - - Context * c = child_report; - while (c && c != me_report) - { - c= c->daddy_context_; - } - - if (c == me_report) - set_translator (child_report); -} - void @@ -235,10 +201,10 @@ Sequential_iterator::process (Moment until) { while (iter_) { - if (grace_fixups_ && - grace_fixups_->start_ == here_mom_ - && (grace_fixups_->start_ + grace_fixups_->length_ - + Moment (Rational (0), grace_fixups_->grace_start_) == until)) + Grace_fixup * gf = get_grace_fixup (); + if (gf + && gf->start_ + gf->length_ + + Moment (Rational (0), gf->grace_start_) == until) { /* do the stuff/note/rest preceding a grace. @@ -246,8 +212,11 @@ Sequential_iterator::process (Moment until) iter_->process (iter_->music_get_length ()); } else - iter_->process (until - here_mom_ + iter_->music_start_mom ()); - + { + Moment w = until - here_mom_ + iter_->music_start_mom (); + iter_->process (w); + } + /* if the iter is still OK, there must be events left that have @@ -257,7 +226,7 @@ Sequential_iterator::process (Moment until) if (iter_->ok ()) return ; - descend_to_child (); + descend_to_child (iter_->get_outlet ()); next_element (true); } } @@ -270,10 +239,11 @@ Sequential_iterator::pending_moment () const /* Fix-up a grace note halfway in the music. */ - if (grace_fixups_ && here_mom_ == grace_fixups_->start_ - && grace_fixups_->length_ + iter_->music_start_mom () == cp) + Grace_fixup * gf = get_grace_fixup (); + if (gf + && gf->length_ + iter_->music_start_mom () == cp) { - return here_mom_ + grace_fixups_->length_ + Moment (0, grace_fixups_->grace_start_); + return here_mom_ + gf->length_ + Moment (0, gf->grace_start_); } /* @@ -302,3 +272,20 @@ Sequential_iterator::run_always () const { return iter_ ? iter_->run_always () : false; } + +void +Sequential_iterator::next_grace_fixup () +{ + Grace_fixup * n = grace_fixups_->next_; + delete grace_fixups_; + grace_fixups_ = n; +} + +Grace_fixup* +Sequential_iterator::get_grace_fixup () const +{ + if (grace_fixups_ && grace_fixups_->start_ == here_mom_) + return grace_fixups_; + else + return 0; +}