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()
35 music_l_->origin ()->warning (_ ("Must stop before this music ends"));
42 Sequential_music_iterator::do_print() const
49 Sequential_music_iterator::construct_children()
51 cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_list ();
53 while (gh_pair_p (cursor_ ))
62 set_sequential_music_translator();
69 Sequential_music_iterator::leave_element()
73 Moment elt_time = unsmob_music (gh_car (cursor_))->length_mom ();
74 here_mom_ += elt_time;
75 cursor_ =gh_cdr (cursor_);
79 Sequential_music_iterator::start_next_element()
82 iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
86 Sequential_music_iterator::set_sequential_music_translator()
88 Translator_group * child_report = child_report = iter_p_->report_to_l ();
89 if (dynamic_cast<Grace_iterator*> (iter_p_))
90 child_report = child_report->daddy_trans_l_;
92 if (report_to_l()->depth_i () < child_report->depth_i ())
93 set_translator (child_report);
97 Sequential_music_iterator::get_music ()
100 return scm_listify (scm_cons (SCM_CAR (cursor_),
101 report_to_l ()->self_scm ()),
108 Sequential_music_iterator::next ()
115 b = iter_p_->next ();
118 set_sequential_music_translator ();
120 if (gh_pair_p (cursor_))
121 start_next_element ();
130 set_sequential_music_translator ();
132 if (gh_pair_p (cursor_))
133 start_next_element ();
141 This should use get_music () and next ()
144 Sequential_music_iterator::do_process (Moment until)
152 Moment local_until = until - here_mom_;
153 while (iter_p_->ok ())
155 Moment here = iter_p_->next_moment ();
156 if (here != local_until)
157 return Music_iterator::do_process (until);
159 iter_p_->process (local_until);
164 set_sequential_music_translator ();
167 if (gh_pair_p (cursor_))
168 start_next_element ();
170 return Music_iterator::do_process (until);
178 Sequential_music_iterator::next_moment() const
180 return iter_p_->next_moment() + here_mom_;
185 Sequential_music_iterator::ok() const
191 Sequential_music_iterator::try_music_in_children (Music *m) const
193 return iter_p_ ? iter_p_->try_music (m) : 0;