2 simultaneous-music-iterator.cc -- implement Simultaneous_music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "simultaneous-music-iterator.hh"
13 #include "context-def.hh"
15 Simultaneous_music_iterator::Simultaneous_music_iterator ()
17 create_separate_contexts_
= false;
18 children_list_
= SCM_EOL
;
22 Simultaneous_music_iterator::derived_mark () const
24 scm_gc_mark (children_list_
);
28 Simultaneous_music_iterator::derived_substitute (Context
*f
, Context
*t
)
30 for (SCM s
= children_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
31 unsmob_iterator (scm_car (s
))->substitute_outlet (f
, t
);
35 Simultaneous_music_iterator::construct_children ()
39 SCM i
= get_music ()->get_property ("elements");
41 children_list_
= SCM_EOL
;
42 SCM
*tail
= &children_list_
;
43 for (; scm_is_pair (i
); i
= scm_cdr (i
), j
++)
45 Music
*mus
= unsmob_music (scm_car (i
));
47 SCM scm_iter
= get_static_get_iterator (mus
);
48 Music_iterator
*mi
= unsmob_iterator (scm_iter
);
50 /* if create_separate_contexts_ is set, create a new context with the
51 number number as name */
53 SCM name
= ly_symbol2scm (get_outlet ()->context_name ().c_str ());
54 Context
*c
= (j
&& create_separate_contexts_
)
55 ? get_outlet ()->find_create_context (name
, to_string (j
), SCM_EOL
)
61 mi
->init_context (mus
, c
);
62 mi
->construct_children ();
66 *tail
= scm_cons (scm_iter
, *tail
);
67 tail
= SCM_CDRLOC (*tail
);
75 Simultaneous_music_iterator::process (Moment until
)
77 SCM
*proc
= &children_list_
;
78 while (scm_is_pair (*proc
))
80 Music_iterator
*i
= unsmob_iterator (scm_car (*proc
));
82 || i
->pending_moment () == until
)
87 *proc
= scm_cdr (*proc
);
90 proc
= SCM_CDRLOC (*proc
);
95 Simultaneous_music_iterator::pending_moment () const
98 next
.set_infinite (1);
100 for (SCM s
= children_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
102 Music_iterator
*it
= unsmob_iterator (scm_car (s
));
103 next
= min (next
, it
->pending_moment ());
110 Simultaneous_music_iterator::ok () const
112 bool run_always_ok
= false;
113 for (SCM s
= children_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
115 Music_iterator
*it
= unsmob_iterator (scm_car (s
));
116 if (!it
->run_always ())
119 run_always_ok
= run_always_ok
|| it
->ok ();
121 return run_always_ok
;
125 Simultaneous_music_iterator::run_always () const
127 for (SCM s
= children_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
129 Music_iterator
*it
= unsmob_iterator (scm_car (s
));
130 if (it
->run_always ())
137 Simultaneous_music_iterator::do_quit ()
139 for (SCM s
= children_list_
; scm_is_pair (s
); s
= scm_cdr (s
))
140 unsmob_iterator (scm_car (s
))->quit ();
143 IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator
);