X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsimultaneous-music-iterator.cc;h=c90cd21767dfe9cb4fea945466f51227db894478;hb=712b6f387c98454e0fc8c5b6c7f0848acf4b29ec;hp=b875668ef74c1ce0c2bfd6387ed23c367452da0b;hpb=b9fc4bb5b3ce7d75e7e5284352eeaa04bbe78e14;p=lilypond.git diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index b875668ef7..c90cd21767 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -3,59 +3,34 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include "translator-group.hh" +#include "context.hh" #include "warn.hh" #include "simultaneous-music-iterator.hh" #include "music-list.hh" -#include "translator-def.hh" +#include "context-def.hh" Simultaneous_music_iterator::Simultaneous_music_iterator () { - separate_contexts_b_ = false; + create_separate_contexts_ = false; children_list_ = SCM_EOL; } -Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator const& src) - : Music_iterator (src) -{ - separate_contexts_b_ - = src.separate_contexts_b_; - children_list_ = SCM_EOL; - - SCM children_list = SCM_EOL; - SCM *tail = &children_list; - for (SCM s = src.children_list_; gh_pair_p (s); s = gh_cdr(s)) - { - Music_iterator *i = unsmob_iterator (gh_car (s)); - SCM cl = i->clone ()->self_scm(); - *tail = scm_cons (cl, *tail); - tail = SCM_CDRLOC (*tail); - scm_gc_unprotect_object (cl); - } - - children_list_ = children_list; - scm_remember_upto_here_1 (children_list); -} void -Simultaneous_music_iterator::derived_mark()const +Simultaneous_music_iterator::derived_mark () const { scm_gc_mark (children_list_); } -SCM -Simultaneous_music_iterator::get_pending_events (Moment m)const +void +Simultaneous_music_iterator::derived_substitute (Context *f,Context *t) { - SCM l = SCM_EOL; - for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) - { - l = gh_append2 (unsmob_iterator (gh_car (s))->get_pending_events (m), l); - } - return l; + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) + unsmob_iterator (ly_car (s))-> substitute_outlet (f,t); } void @@ -63,27 +38,27 @@ Simultaneous_music_iterator::construct_children () { int j = 0; - SCM i = get_music ()->get_mus_property ("elements"); + SCM i = get_music ()->get_property ("elements"); children_list_ = SCM_EOL; SCM * tail = &children_list_; - for (; gh_pair_p (i); i = ly_cdr (i), j++) + for (; ly_c_pair_p (i); i = ly_cdr (i), j++) { Music *mus = unsmob_music (ly_car (i)); SCM scm_iter = get_static_get_iterator (mus); Music_iterator * mi = unsmob_iterator (scm_iter); - /* if separate_contexts_b_ is set, create a new context with the + /* if create_separate_contexts_ is set, create a new context with the number number as name */ - SCM name = unsmob_context_def (report_to ()->definition_)->get_context_name (); - Translator_group * t = (j && separate_contexts_b_) - ? report_to ()->find_create_translator (name, to_string (j), SCM_EOL) - : report_to (); + SCM name = ly_symbol2scm (get_outlet ()->context_name ().to_str0 ()); + Context * t = (j && create_separate_contexts_) + ? get_outlet ()->find_create_context (name, to_string (j), SCM_EOL) + : get_outlet (); if (!t) - t = report_to (); + t = get_outlet (); mi->init_translator (mus, t); mi->construct_children (); @@ -102,9 +77,9 @@ void Simultaneous_music_iterator::process (Moment until) { SCM *proc = &children_list_; - while(gh_pair_p (*proc)) + while (ly_c_pair_p (*proc)) { - Music_iterator * i = unsmob_iterator (gh_car (*proc)); + Music_iterator * i = unsmob_iterator (ly_car (*proc)); if (i->run_always () || i->pending_moment () == until) { @@ -113,34 +88,11 @@ Simultaneous_music_iterator::process (Moment until) if (!i->ok ()) { i->quit (); - *proc = gh_cdr (*proc); - } - else - { - proc = SCM_CDRLOC(*proc); - } - } -} - -void -Simultaneous_music_iterator::skip (Moment until) -{ - SCM *proc = &children_list_; - while(gh_pair_p (*proc)) - { - Music_iterator * i = unsmob_iterator (gh_car (*proc)); - if (i->pending_moment () <= until) - { - i->skip (until); - } - if (!i->ok ()) - { - i->quit (); - *proc = gh_cdr (*proc); + *proc = ly_cdr (*proc); } else { - proc = SCM_CDRLOC(*proc); + proc = SCM_CDRLOC (*proc); } } } @@ -151,23 +103,38 @@ Simultaneous_music_iterator::pending_moment () const Moment next; next.set_infinite (1); - for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) { - Music_iterator * it = unsmob_iterator (gh_car (s)); - if (!it-> run_always ()) - next = next pending_moment (); + Music_iterator * it = unsmob_iterator (ly_car (s)); + next = next pending_moment (); } + return next; } bool Simultaneous_music_iterator::ok () const { - for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) + bool run_always_ok = false; + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) { - Music_iterator * it = unsmob_iterator (gh_car (s)); + Music_iterator * it = unsmob_iterator (ly_car (s)); if (!it->run_always ()) return true; + else + run_always_ok = run_always_ok || it->ok (); + } + return run_always_ok; +} + +bool +Simultaneous_music_iterator::run_always () const +{ + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) + { + Music_iterator * it = unsmob_iterator (ly_car (s)); + if (it->run_always ()) + return true; } return false; } @@ -176,17 +143,16 @@ Music_iterator* Simultaneous_music_iterator::try_music_in_children (Music *m) const { Music_iterator * b=0; - for (SCM s = children_list_; !b && gh_pair_p (s); s = gh_cdr(s)) - b =unsmob_iterator (gh_car (s))->try_music (m); + for (SCM s = children_list_; !b && ly_c_pair_p (s); s = ly_cdr (s)) + b =unsmob_iterator (ly_car (s))->try_music (m); return b; } void Simultaneous_music_iterator::do_quit () { - for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) - unsmob_iterator (gh_car (s))->quit(); + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) + unsmob_iterator (ly_car (s))->quit (); } - IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);