]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-iterator.cc
release: 1.1.1
[lilypond.git] / lily / music-iterator.cc
1 /*
2   music-iterator.cc -- implement Music_iterator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8 #include "debug.hh"
9 #include "music-list.hh"
10 #include "music-iterator.hh"
11 #include "voice-iterator.hh"
12 #include "property-iterator.hh"
13 #include "chord-iterator.hh"
14 #include "request-iterator.hh"
15 #include "translator-group.hh"
16 #include "translation-property.hh"
17 #include "change-iterator.hh"
18 #include "change-translator.hh"
19 #include "music-wrapper.hh"
20 #include "music-wrapper-iterator.hh"
21 #include "compressed-music-iterator.hh"
22 #include "compressed-music.hh"
23
24
25
26 IMPLEMENT_IS_TYPE_B(Music_iterator);
27
28
29 void
30 Music_iterator::do_print() const
31 {
32
33 }
34
35 void
36 Music_iterator::print() const
37 {
38 #ifndef NPRINT
39   if (!check_debug)
40     return ;
41   DOUT << name() << "{";
42   DOUT << "report to " << 
43     report_to_l() << " (" << report_to_l ()->name () << ")\n";
44   if (ok())
45     DOUT << "next at " << next_moment() << " ";
46   else
47     DOUT << "not feeling well today..";
48   do_print();
49   DOUT << "}\n";
50 #endif
51 }
52
53 Translator_group*
54 Music_iterator::get_req_translator_l()
55 {
56   assert (report_to_l());
57   if (report_to_l()->is_bottom_translator_b ())
58     return report_to_l();
59
60   set_translator (report_to_l()->get_default_interpreter ());
61   return report_to_l();
62 }
63
64 void
65 Music_iterator::push_translator (Translator_group*t)
66 {
67   report_to_l_arr_.push (t);
68   t->iterator_count_ ++;
69 }
70
71 void
72 Music_iterator::pop_translator()
73 {
74   report_to_l()->iterator_count_ --;
75   assert (report_to_l()->iterator_count_ >=0);
76   report_to_l_arr_.pop();
77 }
78
79 Translator_group* 
80 Music_iterator::report_to_l() const
81 {
82   if (! report_to_l_arr_.size())
83     return 0;
84   return report_to_l_arr_.top();
85 }
86
87
88 void
89 Music_iterator::set_translator (Translator_group*trans)
90 {   
91   if (report_to_l()==trans)
92     return;
93   if (report_to_l())
94     pop_translator();
95   if (trans)
96     push_translator (trans);
97 }
98
99 void
100 Music_iterator::construct_children()
101 {
102
103 }
104
105 Music_iterator::~Music_iterator()
106 {
107   set_translator (0);
108 }
109
110 Moment
111 Music_iterator::next_moment() const
112 {
113   return 0;
114 }
115
116
117 void
118 Music_iterator::process_and_next (Moment m)
119 {
120   do_process_and_next (m);
121 }
122
123 void
124 Music_iterator::do_process_and_next (Moment)
125 {
126   first_b_ = false;
127 }
128
129 bool
130 Music_iterator::ok() const
131 {
132   return first_b_;
133 }
134
135 Music_iterator*
136 Music_iterator::static_get_iterator_p (Music const *m, Translator_group *report_l)
137 {
138   Music_iterator * p =0;
139   if (dynamic_cast<Request_chord  const *> (m))
140     p = new Request_chord_iterator;
141   else if (dynamic_cast<Simultaneous_music  const *> (m)) 
142     p =  new Simultaneous_music_iterator;
143   else if (dynamic_cast<Sequential_music  const *> (m)) 
144     p =  new Sequential_music_iterator;
145   else if (dynamic_cast<Translation_property  const *> (m))
146     p = new Property_iterator;
147   else if (dynamic_cast<Change_translator  const *> (m))
148     p = new Change_iterator;
149   else if (dynamic_cast<Compressed_music  const *> (m))
150     p = new Compressed_music_iterator;
151   else if (dynamic_cast<Music_wrapper  const *> (m))
152     p = new Music_wrapper_iterator;
153
154   p->music_l_ = m;
155   if (m->translator_type_str_.length_i ())
156     {
157       Translator_group* a =report_l->
158         find_create_translator_l (m->translator_type_str_, m->translator_id_str_);
159       p->set_translator (a);
160     }
161
162   if (! p->report_to_l())
163     p ->set_translator (report_l);
164
165   
166   return p;
167 }
168
169 void
170 Music_iterator::inherit_info(Music_iterator const *)
171 {
172 }
173
174 Music_iterator*
175 Music_iterator::get_iterator_p (Music const*m) const
176 {
177   Music_iterator*p = static_get_iterator_p (m, report_to_l());
178   p->inherit_info (this);
179   p->construct_children();
180   return p;
181 }
182
183 Music_iterator::Music_iterator()
184 {
185   first_b_ = true;
186 }
187
188