]> git.donarmstrong.com Git - lilypond.git/blob - lily/simultaneous-music-iterator.cc
release: 1.5.0
[lilypond.git] / lily / simultaneous-music-iterator.cc
1 /*
2   Simultaneous_music-iterator.cc -- implement Simultaneous_music_iterator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "translator-group.hh"
10 #include "debug.hh"
11 #include "simultaneous-music-iterator.hh"
12 #include "music-list.hh"
13 #include "killing-cons.tcc"
14
15
16 Simultaneous_music_iterator::Simultaneous_music_iterator ()
17 {
18   separate_contexts_b_ = false;
19 }
20
21 Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator const& src)
22   : Music_iterator (src)
23 {
24   separate_contexts_b_ = src.separate_contexts_b_;
25   for (Cons<Music_iterator> *p = src.children_p_list_.head_; p; p = p->next_)
26     {
27       Music_iterator *i = p->car_;
28       children_p_list_.append (new Killing_cons<Music_iterator> (i->clone (), 0));
29     }
30 }
31
32 Simultaneous_music_iterator::~Simultaneous_music_iterator ()
33 {
34   children_p_list_.junk ();
35 }
36
37 SCM
38 Simultaneous_music_iterator::get_music (Moment m)const
39 {
40   SCM s = SCM_EOL;
41   for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
42     {
43       s = gh_append2 (p->car_->get_music (m), s);
44     }
45   return s;
46 }
47
48 void
49 Simultaneous_music_iterator::construct_children ()
50 {
51   int j = 0;
52   Music_sequence const *sim = dynamic_cast<Music_sequence const*> (music_l ());
53
54   SCM i = sim->music_list ();
55   for (; gh_pair_p (i); i = gh_cdr (i), j++)
56     {
57       Music *mus = unsmob_music (gh_car (i));
58       Music_iterator * mi = static_get_iterator_p (mus);
59
60       /* if separate_contexts_b_ is set, create a new context with the
61          number number as name */
62       
63       Translator_group * t = (j && separate_contexts_b_)
64         ? report_to_l ()->find_create_translator_l (report_to_l ()->type_str_,
65                                                     to_str (j))
66         : report_to_l ();
67
68       if (!t)
69         t = report_to_l ();
70
71       mi->init_translator (mus, t);
72       mi->construct_children ();
73       
74       if (mi->ok ()) 
75         {
76           children_p_list_.append (new Killing_cons<Music_iterator> (mi,0));
77         }
78       else
79         delete mi;
80     }
81 }
82
83
84 void
85 Simultaneous_music_iterator::process (Moment until)
86 {
87   for (Cons<Music_iterator> **pp = &children_p_list_.head_; *pp;)
88     {
89       Music_iterator * i = (*pp)->car_;
90       if (i->pending_moment () == until) 
91         {
92           i->process (until);
93         }
94       if (!i->ok ())
95         delete children_p_list_.remove_cons (pp);
96       else
97         pp = & (*pp)->next_;
98     }
99 }
100
101 void
102 Simultaneous_music_iterator::skip (Moment until)
103 {
104   for (Cons<Music_iterator> **pp = &children_p_list_.head_; *pp;)
105     {
106       Music_iterator * i = (*pp)->car_;
107       if (i->pending_moment () <= until) 
108         {
109           i->skip (until);
110         }
111       if (!i->ok ())
112         delete children_p_list_.remove_cons (pp);
113       else
114         pp = & (*pp)->next_;
115     }
116 }
117
118 Moment
119 Simultaneous_music_iterator::pending_moment () const
120 {
121   Moment next;
122   next.set_infinite (1);
123   
124   for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
125     next = next <? p->car_->pending_moment () ;
126   return next;
127 }
128
129
130
131 bool
132 Simultaneous_music_iterator::ok () const
133 {
134   return children_p_list_.head_;
135 }
136
137 Music_iterator*
138 Simultaneous_music_iterator::try_music_in_children (Music *m) const
139 {
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);
143   return b;
144 }
145
146
147
148 IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);