2 unfolded-repeat-iterator.cc -- implement Unfolded_repeat_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "repeated-music.hh"
12 #include "music-list.hh"
13 #include "unfolded-repeat-iterator.hh"
15 #include "translator-group.hh"
17 Unfolded_repeat_iterator::~Unfolded_repeat_iterator ()
19 delete current_iter_p_;
22 Unfolded_repeat_iterator::Unfolded_repeat_iterator ()
27 alternative_count_i_ =0;
32 If we are in the body of the repeat always go to the current alternative.
34 If we are not in the body, then we are in an alternative. If we are
35 fully unfolding, advance the current alternative and go back to main.
36 If we are semi-unfolding, advance the current alternative, and go to
37 the alternative just set.
41 Unfolded_repeat_iterator::next_element ()
43 Repeated_music const* mus =dynamic_cast<Repeated_music const*> (music_l_);
44 delete current_iter_p_;
50 done_mom_ += mus->repeat_body_p_->length_mom ();
55 if (alternative_cons_l_)
57 current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
60 else if (done_count_ < mus->repeats_i_ && full_unfold_b_)
62 current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
69 we're not in the main part. So we're either in an alternative, or
72 if (alternative_cons_l_)
74 done_mom_ += alternative_cons_l_->car_->length_mom ();
76 if (!full_unfold_b_ ||
77 mus->repeats_i_ - done_count_ < alternative_count_i_)
78 alternative_cons_l_ = alternative_cons_l_->next_;
81 we've done the main body as well, but didn't go over the other
87 if (done_count_ < mus->repeats_i_ && alternative_cons_l_)
90 current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
93 current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
102 Unfolded_repeat_iterator::ok () const
104 return current_iter_p_ ;
108 Unfolded_repeat_iterator::next_moment () const
110 return done_mom_ + current_iter_p_->next_moment ();
114 Unfolded_repeat_iterator::construct_children ()
116 Repeated_music const* mus =dynamic_cast<Repeated_music const*> (music_l_);
117 full_unfold_b_ = playback_b_ || (!mus->volta_fold_b_);
119 alternative_cons_l_ = (mus->alternatives_p_)
120 ? mus->alternatives_p_->music_p_list_p_->head_
123 for (Cons<Music> *p = alternative_cons_l_; p; p = p->next_)
124 alternative_count_i_ ++;
126 if (mus->repeat_body_p_)
128 current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
131 else if (alternative_cons_l_)
133 current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
139 Unfolded_repeat_iterator::do_process_and_next (Moment m)
143 Music_iterator *yeah = try_music (music_l_);
145 set_translator (yeah->report_to_l ());
147 music_l_->warning ( _("no one to print a volta bracket"));
151 while (!current_iter_p_->ok ())
155 if (!current_iter_p_)
159 if (m - done_mom_ >= current_iter_p_->next_moment ())
160 current_iter_p_->process_and_next (m - done_mom_);
167 Unfolded_repeat_iterator::do_print () const
170 DEBUG_OUT << "count " << done_count_ << "done time " << done_mom_ << '\n';
171 DEBUG_OUT << "current: ";
172 current_iter_p_->print();
177 Unfolded_repeat_iterator::try_music_in_children (Music const * m) const
179 return current_iter_p_->try_music (m);