X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsimultaneous-music-iterator.cc;h=957b7bb628ba6ef388413702ae520ccc18159c30;hb=d765f3af45be51f15da55cf570a4b172200e1035;hp=45fd7cae7bbbdd242f85c84bcdfd380ed00e6cf4;hpb=194ef0e7e19c7a7c0836b6bd3ed2788a56220d2f;p=lilypond.git diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 45fd7cae7b..957b7bb628 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -3,94 +3,180 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include "translator-group.hh" -#include "debug.hh" +#include "warn.hh" #include "simultaneous-music-iterator.hh" #include "music-list.hh" #include "killing-cons.tcc" + Simultaneous_music_iterator::Simultaneous_music_iterator () { + separate_contexts_b_ = false; + children_list_ = SCM_EOL; } -Simultaneous_music_iterator::~Simultaneous_music_iterator () +Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator const& src) + : Music_iterator (src) { - children_p_list_.junk (); + separate_contexts_b_ + = src.separate_contexts_b_; + + 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::construct_children() +Simultaneous_music_iterator::derived_mark()const +{ + scm_gc_mark (children_list_); +} + +SCM +Simultaneous_music_iterator::get_pending_events (Moment m)const +{ + 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; +} + +void +Simultaneous_music_iterator::construct_children () { int j = 0; - Simultaneous_music const *sim = dynamic_cast (music_l_); - for (Cons *i = sim->music_p_list_p_->head_; i; i = i->next_, j++) + SCM i = get_music ()->get_mus_property ("elements"); + + children_list_ = SCM_EOL; + SCM * tail = &children_list_; + for (; gh_pair_p (i); i = ly_cdr (i), j++) { - Music_iterator * mi = get_iterator_p (i->car_); - if (mi->ok()) - { -#if 0 - if (sim->translator_type_str_.empty_b ()) - set_translator (mi->report_to_l()->ancestor_l (0)); // huh? -#endif + 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 + number number as name */ + + Translator_group * t = (j && separate_contexts_b_) + ? report_to ()->find_create_translator (report_to ()->type_string_, + to_string (j)) + : report_to (); - children_p_list_.append (new Killing_cons (mi,0)); + if (!t) + t = report_to (); + + mi->init_translator (mus, t); + mi->construct_children (); + + if (mi->ok ()) + { + *tail = scm_cons (scm_iter, *tail); + tail = SCM_CDRLOC (*tail); } else - delete mi; + mi->set_translator (0); } } - void -Simultaneous_music_iterator::do_print() const +Simultaneous_music_iterator::process (Moment until) { -#ifndef NPRINT - for (Cons *p = children_p_list_.head_; p; p = p->next_) - p->car_->print(); -#endif + SCM *proc = &children_list_; + while(gh_pair_p (*proc)) + { + Music_iterator * i = unsmob_iterator (gh_car (*proc)); + if (i->pending_moment () == until) + { + i->process (until); + } + if (!i->ok ()) + { + i->quit (); + *proc = gh_cdr (*proc); + } + else + { + proc = SCM_CDRLOC(*proc); + } + } } void -Simultaneous_music_iterator::do_process_and_next (Moment until) +Simultaneous_music_iterator::skip (Moment until) { - for (Cons **pp = &children_p_list_.head_; *pp; ) + SCM *proc = &children_list_; + while(gh_pair_p (*proc)) { - Music_iterator * i = (*pp)->car_; - if (i->next_moment() == until) + Music_iterator * i = unsmob_iterator (gh_car (*proc)); + if (i->pending_moment () <= until) + { + i->skip (until); + } + if (!i->ok ()) { - i->process_and_next (until); + i->quit (); + *proc = gh_cdr (*proc); } - if (!i->ok()) - delete children_p_list_.remove_cons (pp); else - pp = &(*pp)->next_; + { + proc = SCM_CDRLOC(*proc); + } } - Music_iterator::do_process_and_next (until); } - - - Moment -Simultaneous_music_iterator::next_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_->next_moment() ; + for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) + next = next pending_moment () ; return next; } bool -Simultaneous_music_iterator::ok() const +Simultaneous_music_iterator::ok () const +{ + return gh_pair_p (children_list_); +} + +Music_iterator* +Simultaneous_music_iterator::try_music_in_children (Music *m) const { - return children_p_list_.head_; + 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); + 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(); +} + + +IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);