X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Funfolded-repeat-iterator.cc;h=737b4a29b49f78753327aae2302d139affac4a42;hb=1bbcb5955cad9c9067b66c88caf0b5e77ebb579a;hp=0550a46f06ccd3636d27e278e9919677e26965e0;hpb=d6048913c2c793a6298a3e16a1a25c76711463b1;p=lilypond.git diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc index 0550a46f06..737b4a29b4 100644 --- a/lily/unfolded-repeat-iterator.cc +++ b/lily/unfolded-repeat-iterator.cc @@ -1,144 +1,63 @@ -/* - unfolded-repeat-iterator.cc -- implement Unfolded_repeat_iterator - - source file of the GNU LilyPond music typesetter - - (c) 1999 Han-Wen Nienhuys - - */ +/* + This file is part of LilyPond, the GNU music typesetter. + Copyright (C) 2002--2011 Han-Wen Nienhuys -#include "new-repeated-music.hh" -#include "music-list.hh" -#include "unfolded-repeat-iterator.hh" -#include "debug.hh" -#include "translator-group.hh" + 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. -Unfolded_repeat_iterator::~Unfolded_repeat_iterator () -{ - delete current_iter_p_; -} + 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. -Unfolded_repeat_iterator::Unfolded_repeat_iterator () -{ - done_count_ =0; - current_iter_p_ =0; - do_main_b_ = false; -} + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ -/** +#include "music.hh" +#include "sequential-iterator.hh" +#include "context.hh" -If we are in the body of the repeat always go to the current alternative. +class Unfolded_repeat_iterator : public Sequential_iterator +{ +public: + DECLARE_SCHEME_CALLBACK (constructor, ()); +protected: + virtual SCM get_music_list () const; +}; -If we are not in the body, then we are in an alternative. If we are -fully unfolding, advance the current alternative and go back to main. -If we are semi-unfolding, advance the current alternative, and go to -the alternative just set. - - */ -void -Unfolded_repeat_iterator::next_element () +SCM +Unfolded_repeat_iterator::get_music_list () const { - New_repeated_music const* mus =dynamic_cast (music_l_); - delete current_iter_p_; - current_iter_p_ =0; + SCM l = SCM_EOL; + SCM *tail = &l; + SCM body = get_music ()->get_property ("element"); + SCM alts = get_music ()->get_property ("elements"); + int alt_count = scm_ilength (alts); + int rep_count = scm_to_int (get_music ()->get_property ("repeat-count")); - if (do_main_b_) - { - done_mom_ += mus->repeat_body_p_->length_mom (); - if (alternative_cons_l_) - { - current_iter_p_ = get_iterator_p (alternative_cons_l_->car_); - do_main_b_ = false; - } - } - else + for (int i = 0; i < rep_count; i++) { - if (alternative_cons_l_) - { - done_mom_ += alternative_cons_l_->car_->length_mom (); - alternative_cons_l_ = alternative_cons_l_->next_; - done_count_ ++; - } + if (unsmob_music (body)) + *tail = scm_cons (body, SCM_EOL); - if (done_count_ < mus->repeats_i_ && alternative_cons_l_) - { - if (mus->semi_fold_b_) - current_iter_p_ = get_iterator_p (alternative_cons_l_->car_); - else - { - current_iter_p_ = get_iterator_p (mus->repeat_body_p_); - do_main_b_ = true; - } - } - } -} + tail = SCM_CDRLOC (*tail); -bool -Unfolded_repeat_iterator::ok () const -{ - return current_iter_p_ ; -} + if (alt_count) + { + *tail = scm_cons (scm_car (alts), SCM_EOL); + tail = SCM_CDRLOC (*tail); + if (i >= rep_count - alt_count) -Moment -Unfolded_repeat_iterator::next_moment () const -{ - return done_mom_ + current_iter_p_->next_moment (); -} - -void -Unfolded_repeat_iterator::construct_children () -{ - New_repeated_music const* mus =dynamic_cast (music_l_); - alternative_cons_l_ = (mus->alternatives_p_) - ? mus->alternatives_p_->music_p_list_p_->head_ - : 0; - - if (mus->repeat_body_p_) - { - current_iter_p_ = get_iterator_p (mus->repeat_body_p_); - do_main_b_ = true; - } - else if (alternative_cons_l_) - { - current_iter_p_ = get_iterator_p (alternative_cons_l_->car_); - do_main_b_ = false; - } -} - -void -Unfolded_repeat_iterator::do_process_and_next (Moment m) -{ - if (!m) - { - bool success = report_to_l ()->try_music (music_l_); - if (!success) - music_l_->warning ( _("No one to print a volta bracket")); + alts = scm_cdr (alts); + } } - while (1) - { - while (!current_iter_p_->ok ()) - { - next_element(); - if (!current_iter_p_) - return; - } - - if (m - done_mom_ >= current_iter_p_->next_moment ()) - current_iter_p_->process_and_next (m - done_mom_); - else - return; - } -} - -void -Unfolded_repeat_iterator::do_print () const -{ -#ifndef NPRINT - DOUT << "count " << done_count_ << "done time " << done_mom_ << '\n'; - DOUT << "current: "; - current_iter_p_->print(); -#endif + return l; } + +IMPLEMENT_CTOR_CALLBACK (Unfolded_repeat_iterator);