X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsimultaneous-music-iterator.cc;h=3723c2695fe238ecf31a8d2f00e35df621e8d7e5;hb=74e906db27770282e2d3c180298e5968ebff9360;hp=538ea4406a9c0916638083605bee166af7a7d881;hpb=8aad615ea7bb31f49a0c2afc21eea5ff5de20437;p=lilypond.git diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 538ea4406a..3723c2695f 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -1,92 +1,154 @@ /* - Simultaneous_music-iterator.cc -- implement Simultaneous_music_iterator + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2011 Han-Wen Nienhuys - (c) 1997--1999 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ -#include "translator-group.hh" -#include "debug.hh" #include "simultaneous-music-iterator.hh" - -#include "music-list.hh" +#include "music.hh" +#include "context.hh" +#include "warn.hh" +#include "context-def.hh" Simultaneous_music_iterator::Simultaneous_music_iterator () { + create_separate_contexts_ = false; + children_list_ = SCM_EOL; } -Simultaneous_music_iterator::~Simultaneous_music_iterator () +void +Simultaneous_music_iterator::derived_mark () const { + scm_gc_mark (children_list_); } void -Simultaneous_music_iterator::construct_children() +Simultaneous_music_iterator::derived_substitute (Context *f, Context *t) { - int j = 0; - Simultaneous_music const *sim = dynamic_cast (music_l_); - for (PCursor i (sim->music_p_list_p_->top()); - i.ok(); j++, i++) - { - Music_iterator * mi = get_iterator_p (i.ptr()); - if (mi->ok()) - { - if (sim->translator_type_str_.empty_b ()) - set_translator (mi->report_to_l()->ancestor_l (0)); // huh? - children_p_list_.bottom().add (mi); - } - else - delete mi; - } + for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) + unsmob_iterator (scm_car (s))->substitute_outlet (f, t); } - void -Simultaneous_music_iterator::do_print() const +Simultaneous_music_iterator::construct_children () { -#ifndef NPRINT - for (PCursor i (children_p_list_.top()); i.ok (); i++) + int j = 0; + + SCM i = get_music ()->get_property ("elements"); + + children_list_ = SCM_EOL; + SCM *tail = &children_list_; + for (; scm_is_pair (i); i = scm_cdr (i), j++) { - i->print(); + Music *mus = unsmob_music (scm_car (i)); + + 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 */ + + SCM name = ly_symbol2scm (get_outlet ()->context_name ().c_str ()); + Context *c = (j && create_separate_contexts_) + ? get_outlet ()->find_create_context (name, to_string (j), SCM_EOL) + : get_outlet (); + + if (!c) + c = get_outlet (); + + mi->init_context (mus, c); + mi->construct_children (); + + if (mi->ok ()) + { + *tail = scm_cons (scm_iter, *tail); + tail = SCM_CDRLOC (*tail); + } + else + mi->quit (); } -#endif } void -Simultaneous_music_iterator::do_process_and_next (Moment until) +Simultaneous_music_iterator::process (Moment until) { - for (PCursor i (children_p_list_.top()); i.ok ();) + SCM *proc = &children_list_; + while (scm_is_pair (*proc)) { - if (i->next_moment() == until) + Music_iterator *i = unsmob_iterator (scm_car (*proc)); + if (i->run_always () + || i->pending_moment () == until) + i->process (until); + if (!i->ok ()) { - i->process_and_next (until); + i->quit (); + *proc = scm_cdr (*proc); } - if (!i->ok()) - delete i.remove_p(); else - i++; + 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 (PCursor i (children_p_list_.top()); i.ok (); i++) - next = next next_moment() ; + + for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) + { + Music_iterator *it = unsmob_iterator (scm_car (s)); + next = min (next, it->pending_moment ()); + } + return next; } - +bool +Simultaneous_music_iterator::ok () const +{ + bool run_always_ok = false; + for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) + { + Music_iterator *it = unsmob_iterator (scm_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 +{ + for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) + { + Music_iterator *it = unsmob_iterator (scm_car (s)); + if (it->run_always ()) + return true; + } + return false; +} + +void +Simultaneous_music_iterator::do_quit () { - return children_p_list_.size(); + for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) + unsmob_iterator (scm_car (s))->quit (); } +IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);