X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsimultaneous-music-iterator.cc;h=c90cd21767dfe9cb4fea945466f51227db894478;hb=712b6f387c98454e0fc8c5b6c7f0848acf4b29ec;hp=f860241448d502217871bbe109fe6edea643a556;hpb=287611887cd612ac84dbf10c5fe4e1a44cc56596;p=lilypond.git diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index f860241448..c90cd21767 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -3,132 +3,156 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include "translator-group.hh" -#include "debug.hh" +#include "context.hh" +#include "warn.hh" #include "simultaneous-music-iterator.hh" #include "music-list.hh" -#include "killing-cons.tcc" +#include "context-def.hh" + Simultaneous_music_iterator::Simultaneous_music_iterator () { - separate_contexts_b_ = false; - cursor_i_ = 0; + create_separate_contexts_ = false; + children_list_ = SCM_EOL; } -Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator const& src) - : Music_iterator (src) -{ - cursor_i_ = src.cursor_i_; - separate_contexts_b_ = src.separate_contexts_b_; - for (Cons *p = children_p_list_.head_; p; p = p->next_) - { - Music_iterator *i = p->car_; - children_p_list_.append (new Killing_cons (i->clone (), 0)); - } -} -Simultaneous_music_iterator::~Simultaneous_music_iterator () +void +Simultaneous_music_iterator::derived_mark () const { - children_p_list_.junk (); + scm_gc_mark (children_list_); } -/* - Should roll next () into this as well - - - huh? --hwn - */ -SCM -Simultaneous_music_iterator::get_music (Moment m)const +void +Simultaneous_music_iterator::derived_substitute (Context *f,Context *t) { - SCM s = SCM_EOL; - for (Cons *p = children_p_list_.head_; p; p = p->next_) - { - s = gh_append2 (p->car_->get_music (m), s); - } - return s; + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) + unsmob_iterator (ly_car (s))-> substitute_outlet (f,t); } void -Simultaneous_music_iterator::construct_children() +Simultaneous_music_iterator::construct_children () { int j = 0; - Music_sequence const *sim = dynamic_cast (music_l_); - SCM i = sim->music_list (); - for (; gh_pair_p(i); i = gh_cdr(i), j++) + SCM i = get_music ()->get_property ("elements"); + + children_list_ = SCM_EOL; + SCM * tail = &children_list_; + for (; ly_c_pair_p (i); i = ly_cdr (i), j++) { - Music *mus = unsmob_music (gh_car (i)); - Music_iterator * mi = static_get_iterator_p (mus); + Music *mus = unsmob_music (ly_car (i)); - /* if separate_contexts_b_ is set, create a new context with the + SCM scm_iter = get_static_get_iterator (mus); + Music_iterator * mi = unsmob_iterator (scm_iter); + + /* if create_separate_contexts_ is set, create a new context with the number number as name */ - - Translator_group * t = (j && separate_contexts_b_) - ? report_to_l ()->find_create_translator_l (report_to_l()->type_str_, - to_str (j)) - : report_to_l (); + + 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_l (); + t = get_outlet (); mi->init_translator (mus, t); mi->construct_children (); - - if (mi->ok()) + + if (mi->ok ()) { - children_p_list_.append (new Killing_cons (mi,0)); + *tail = scm_cons (scm_iter, *tail); + tail = SCM_CDRLOC (*tail); } else - delete mi; + mi->set_translator (0); } } - void Simultaneous_music_iterator::process (Moment until) { - for (Cons **pp = &children_p_list_.head_; *pp;) + SCM *proc = &children_list_; + while (ly_c_pair_p (*proc)) { - Music_iterator * i = (*pp)->car_; - if (i->pending_moment() == until) + Music_iterator * i = unsmob_iterator (ly_car (*proc)); + if (i->run_always () + || i->pending_moment () == until) { i->process (until); } - if (!i->ok()) - delete children_p_list_.remove_cons (pp); + if (!i->ok ()) + { + i->quit (); + *proc = ly_cdr (*proc); + } else - pp = &(*pp)->next_; + { + proc = SCM_CDRLOC (*proc); + } } } Moment -Simultaneous_music_iterator::pending_moment() const +Simultaneous_music_iterator::pending_moment () const { Moment next; next.set_infinite (1); - for (Cons *p = children_p_list_.head_; p; p = p->next_) - next = next car_->pending_moment() ; + for (SCM s = children_list_; ly_c_pair_p (s); s = ly_cdr (s)) + { + Music_iterator * it = unsmob_iterator (ly_car (s)); + next = next pending_moment (); + } + return next; } - +bool +Simultaneous_music_iterator::ok () const +{ + bool run_always_ok = false; + 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; + else + run_always_ok = run_always_ok || it->ok (); + } + return run_always_ok; +} bool -Simultaneous_music_iterator::ok() const +Simultaneous_music_iterator::run_always () const { - return children_p_list_.head_; + 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; } Music_iterator* Simultaneous_music_iterator::try_music_in_children (Music *m) const { Music_iterator * b=0; - for (Cons *p = children_p_list_.head_; !b && p; p = p->next_) - b =p->car_->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_; ly_c_pair_p (s); s = ly_cdr (s)) + unsmob_iterator (ly_car (s))->quit (); +} + +IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);