2 Simultaneous_music-iterator.cc -- implement Simultaneous_music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2001 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"
16 Simultaneous_music_iterator::Simultaneous_music_iterator ()
18 separate_contexts_b_
= false;
21 Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator
const& src
)
22 : Music_iterator (src
)
24 separate_contexts_b_
= src
.separate_contexts_b_
;
25 for (Cons
<Music_iterator
> *p
= src
.children_p_list_
.head_
; p
; p
= p
->next_
)
27 Music_iterator
*i
= p
->car_
;
28 children_p_list_
.append (new Killing_cons
<Music_iterator
> (i
->clone (), 0));
32 Simultaneous_music_iterator::~Simultaneous_music_iterator ()
34 children_p_list_
.junk ();
38 Simultaneous_music_iterator::get_music (Moment m
)const
41 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; p
; p
= p
->next_
)
43 s
= gh_append2 (p
->car_
->get_music (m
), s
);
49 Simultaneous_music_iterator::construct_children ()
52 Music_sequence
const *sim
= dynamic_cast<Music_sequence
const*> (music_l ());
54 SCM i
= sim
->music_list ();
55 for (; gh_pair_p (i
); i
= gh_cdr (i
), j
++)
57 Music
*mus
= unsmob_music (gh_car (i
));
58 Music_iterator
* mi
= static_get_iterator_p (mus
);
60 /* if separate_contexts_b_ is set, create a new context with the
61 number number as name */
63 Translator_group
* t
= (j
&& separate_contexts_b_
)
64 ? report_to_l ()->find_create_translator_l (report_to_l ()->type_str_
,
71 mi
->init_translator (mus
, t
);
72 mi
->construct_children ();
76 children_p_list_
.append (new Killing_cons
<Music_iterator
> (mi
,0));
85 Simultaneous_music_iterator::process (Moment until
)
87 for (Cons
<Music_iterator
> **pp
= &children_p_list_
.head_
; *pp
;)
89 Music_iterator
* i
= (*pp
)->car_
;
90 if (i
->pending_moment () == until
)
95 delete children_p_list_
.remove_cons (pp
);
102 Simultaneous_music_iterator::skip (Moment until
)
104 for (Cons
<Music_iterator
> **pp
= &children_p_list_
.head_
; *pp
;)
106 Music_iterator
* i
= (*pp
)->car_
;
107 if (i
->pending_moment () <= until
)
112 delete children_p_list_
.remove_cons (pp
);
119 Simultaneous_music_iterator::pending_moment () const
122 next
.set_infinite (1);
124 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; p
; p
= p
->next_
)
125 next
= next
<? p
->car_
->pending_moment () ;
132 Simultaneous_music_iterator::ok () const
134 return children_p_list_
.head_
;
138 Simultaneous_music_iterator::try_music_in_children (Music
*m
) const
140 Music_iterator
* b
=0;
141 for (Cons
<Music_iterator
> *p
= children_p_list_
.head_
; !b
&& p
; p
= p
->next_
)
142 b
=p
->car_
->try_music (m
);
148 IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator
);