2 Sequential_music_iterator.cc -- implement Sequential_music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
8 #include "grace-iterator.hh"
9 #include "translator-group.hh"
11 #include "sequential-music-iterator.hh"
12 #include "music-list.hh"
13 #include "request-chord-iterator.hh"
15 Sequential_music_iterator::Sequential_music_iterator ()
22 Sequential_music_iterator::Sequential_music_iterator (Sequential_music_iterator const &src)
23 : Music_iterator (src)
25 cursor_ = src.cursor_;
26 here_mom_ = src.here_mom_;
27 iter_p_ = src.iter_p_->clone ();
30 Sequential_music_iterator::~Sequential_music_iterator()
34 /* if (iter_p_->ok () )
35 music_l_->origin ()->warning (_ ("Must stop before this music ends"));
44 Sequential_music_iterator::construct_children()
46 cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_list ();
48 while (gh_pair_p (cursor_ ))
57 set_sequential_music_translator();
64 Sequential_music_iterator::leave_element()
68 Moment elt_time = unsmob_music (gh_car (cursor_))->length_mom ();
69 here_mom_ += elt_time;
70 cursor_ =gh_cdr (cursor_);
74 Sequential_music_iterator::start_next_element()
77 iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
81 Sequential_music_iterator::set_sequential_music_translator()
83 Translator_group * child_report = child_report = iter_p_->report_to_l ();
84 if (dynamic_cast<Grace_iterator*> (iter_p_))
85 child_report = child_report->daddy_trans_l_;
87 if (report_to_l()->depth_i () < child_report->depth_i ())
88 set_translator (child_report);
93 Sequential_music_iterator::get_music (Moment until)const
97 FIXME: get_music () is const, so we must operate on a copy of child-iter.
99 hmm, part-combiner does work on a copy; why copy again?
100 Also, simply `working on a copy' doesn't work: if request-chord's
101 get_music doesn't do next (), we'll stay in this loop forever?
104 Sequential_music_iterator* urg = (Sequential_music_iterator*)this;
108 Moment local_until = until - here_mom_;
109 while (urg->iter_p_->ok ())
111 Moment here = iter_p_->pending_moment ();
112 if (here != local_until)
115 s = gh_append2 (urg->iter_p_->get_music (local_until), s);
118 if (!urg->iter_p_->ok ())
120 urg->leave_element ();
122 if (gh_pair_p (urg->cursor_))
123 urg->start_next_element ();
135 Sequential_music_iterator::process (Moment until)
141 Moment local_until = until - here_mom_;
142 while (iter_p_->ok ())
144 Moment here = iter_p_->pending_moment ();
145 if (here != local_until)
148 iter_p_->process (local_until);
153 set_sequential_music_translator ();
156 if (gh_pair_p (cursor_))
157 start_next_element ();
166 Sequential_music_iterator::pending_moment() const
168 return iter_p_->pending_moment() + here_mom_;
173 Sequential_music_iterator::ok() const
179 Sequential_music_iterator::try_music_in_children (Music *m) const
181 return iter_p_ ? iter_p_->try_music (m) : 0;