]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-iterator.cc
release: 0.1.13
[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 Han-Wen Nienhuys <hanwen@stack.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
18 IMPLEMENT_IS_TYPE_B(Music_iterator);
19
20
21 void
22 Music_iterator::do_print() const
23 {
24
25 }
26
27 void
28 Music_iterator::print() const
29 {
30 #ifndef NPRINT
31   if (!check_debug)
32     return ;
33   DOUT << name() << "{";
34   DOUT << "report to " << 
35     report_to_l() << " (" << report_to_l ()->name () << ")\n";
36   if (ok())
37     DOUT << "next at " << next_moment() << " ";
38   else
39     DOUT << "not feeling well today..";
40   do_print();
41   DOUT << "}\n";
42 #endif
43 }
44
45 Translator_group*
46 Music_iterator::get_req_translator_l()
47 {
48   assert (report_to_l());
49   if (report_to_l()->is_bottom_translator_b ())
50     return report_to_l();
51
52   set_translator (report_to_l()->get_default_interpreter ());
53   return report_to_l();
54 }
55
56 void
57 Music_iterator::push_translator (Translator_group*t)
58 {
59   report_to_l_arr_.push (t);
60   t->iterator_count_ ++;
61 }
62
63 void
64 Music_iterator::pop_translator()
65 {
66   report_to_l()->iterator_count_ --;
67   assert (report_to_l()->iterator_count_ >=0);
68   report_to_l_arr_.pop();
69 }
70
71 Translator_group* 
72 Music_iterator::report_to_l() const
73 {
74   if (! report_to_l_arr_.size())
75     return 0;
76   return report_to_l_arr_.top();
77 }
78
79
80 void
81 Music_iterator::set_translator (Translator_group*trans)
82 {   
83   if (report_to_l()==trans)
84     return;
85   if (report_to_l())
86     pop_translator();
87   if (trans)
88     push_translator (trans);
89 }
90
91 void
92 Music_iterator::construct_children()
93 {
94
95 }
96
97 Music_iterator::~Music_iterator()
98 {
99   set_translator (0);
100 }
101
102 Moment
103 Music_iterator::next_moment() const
104 {
105   return 0;
106 }
107
108 void
109 Music_iterator::process_and_next (Moment)
110 {
111   first_b_ = false;
112 }
113
114 bool
115 Music_iterator::ok() const
116 {
117   return first_b_;
118 }
119
120 Music_iterator*
121 Music_iterator::static_get_iterator_p (Music *m,
122                                        Translator_group*report_l)
123 {
124   Music_iterator * p =0;
125   if (m->is_type_b (Request_chord::static_name()))
126     p = new Request_chord_iterator ((Request_chord*) m);
127   else if (m->is_type_b (Chord::static_name())) 
128     p =  new Chord_iterator ((Chord*) m);
129   else if (m->is_type_b (Voice::static_name())) 
130     p =  new Voice_iterator ((Voice*) m);
131   else if (m->is_type_b (Translation_property::static_name ()))
132     p = new Property_iterator((Translation_property *) m);
133       
134   if (m -> translator_type_str_)
135     {
136       Translator_group* a =report_l->
137         find_create_translator_l (m-> translator_type_str_, m->translator_id_str_);
138       p->set_translator (a);
139     }
140
141
142   if (! p->report_to_l())
143     p ->set_translator (report_l);
144   
145   return p;
146 }
147
148 Music_iterator*
149 Music_iterator::get_iterator_p (Music*m) const
150 {
151   Music_iterator*p = static_get_iterator_p (m,report_to_l());
152   p->daddy_iter_l_ = (Music_iterator*)this;
153   p->construct_children();
154   return p;
155 }
156
157 Music_iterator::Music_iterator()
158 {
159   daddy_iter_l_ =0;
160   first_b_ = true;
161 }
162