2 Simultaneous_music-iterator.cc -- implement Simultaneous_music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "translator-group.hh"
11 #include "simultaneous-music-iterator.hh"
12 #include "music-list.hh"
13 #include "killing-cons.tcc"
15 Simultaneous_music_iterator::Simultaneous_music_iterator ()
17 separate_contexts_b_
= false;
20 Simultaneous_music_iterator::~Simultaneous_music_iterator ()
22 children_p_list_
.junk ();
26 Simultaneous_music_iterator::construct_children()
29 Music_sequence
const *sim
= dynamic_cast<Music_sequence
const*> (music_l_
);
31 SCM i
= sim
->music_list ();
32 for (; gh_pair_p(i
); i
= gh_cdr(i
), j
++)
34 Music
*mus
= unsmob_music (gh_car (i
));
35 Music_iterator
* mi
= static_get_iterator_p (mus
);
37 /* if separate_contexts_b_ is set, create a new context with the
38 number number as name */
40 Translator_group
* t
= (j
&& separate_contexts_b_
)
41 ? report_to_l ()->find_create_translator_l (report_to_l()->type_str_
,
48 mi
->init_translator (mus
, t
);
49 mi
->construct_children ();
53 children_p_list_
.append (new Killing_cons
<Music_iterator
> (mi
,0));
61 Simultaneous_music_iterator::do_print() const
64 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; p
; p
= p
->next_
)
70 Simultaneous_music_iterator::do_process_and_next (Moment until
)
72 for (Cons
<Music_iterator
> **pp
= &children_p_list_
.head_
; *pp
; )
74 Music_iterator
* i
= (*pp
)->car_
;
75 if (i
->next_moment() == until
)
77 i
->process_and_next (until
);
80 delete children_p_list_
.remove_cons (pp
);
84 Music_iterator::do_process_and_next (until
);
91 Simultaneous_music_iterator::next_moment() const
94 next
.set_infinite (1);
96 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; p
; p
= p
->next_
)
97 next
= next
<? p
->car_
->next_moment() ;
104 Simultaneous_music_iterator::ok() const
106 return children_p_list_
.head_
;
110 Simultaneous_music_iterator::try_music_in_children (Music
*m
) const
112 Music_iterator
* b
=0;
113 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; !b
&& p
; p
= p
->next_
)
114 b
=p
->car_
->try_music (m
);