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 ();
52 if (!mus
->volta_fold_b_
)
55 if (alternative_cons_l_
)
57 current_iter_p_
= get_iterator_p (alternative_cons_l_
->car_
);
60 else if (done_count_
< mus
->repeats_i_
&& !mus
->volta_fold_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 (mus
->volta_fold_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
83 if (mus
->volta_fold_b_
)
87 if (done_count_
< mus
->repeats_i_
&& alternative_cons_l_
)
89 if (mus
->volta_fold_b_
)
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 alternative_cons_l_
= (mus
->alternatives_p_
)
118 ? mus
->alternatives_p_
->music_p_list_p_
->head_
121 for (Cons
<Music
> *p
= alternative_cons_l_
; p
; p
= p
->next_
)
122 alternative_count_i_
++;
124 if (mus
->repeat_body_p_
)
126 current_iter_p_
= get_iterator_p (mus
->repeat_body_p_
);
129 else if (alternative_cons_l_
)
131 current_iter_p_
= get_iterator_p (alternative_cons_l_
->car_
);
137 Unfolded_repeat_iterator::do_process_and_next (Moment m
)
141 Music_iterator
*yeah
= try_music (music_l_
);
143 set_translator (yeah
->report_to_l ());
145 music_l_
->warning ( _("No one to print a volta bracket"));
149 while (!current_iter_p_
->ok ())
153 if (!current_iter_p_
)
157 if (m
- done_mom_
>= current_iter_p_
->next_moment ())
158 current_iter_p_
->process_and_next (m
- done_mom_
);
165 Unfolded_repeat_iterator::do_print () const
168 DOUT
<< "count " << done_count_
<< "done time " << done_mom_
<< '\n';
170 current_iter_p_
->print();
175 Unfolded_repeat_iterator::try_music_in_children (Music
const * m
) const
177 return current_iter_p_
->try_music (m
);