]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-iterator.cc
release: 1.1.39
[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--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8 #include "debug.hh"
9 #include "music-list.hh"
10 #include "music-iterator.hh"
11 #include "property-iterator.hh"
12 #include "request-iterator.hh"
13 #include "sequential-music-iterator.hh"
14 #include "simultaneous-music-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 "time-scaled-music-iterator.hh"
22 #include "time-scaled-music.hh"
23 #include "repeated-music.hh"
24 #include "repeated-music-iterator.hh"
25
26 void
27 Music_iterator::do_print() const
28 {
29 }
30
31 void
32 Music_iterator::print() const
33 {
34 #ifndef NPRINT
35   if (!check_debug)
36     return ;
37   DOUT << classname(this) << "{";
38   DOUT << "report to " << 
39     report_to_l() << " (" << classname (report_to_l ()) << ")\n";
40   if (ok())
41     DOUT << "next at " << next_moment() << " ";
42   else
43     DOUT << "not feeling well today..";
44   do_print();
45   DOUT << "}\n";
46 #endif
47 }
48
49 Translator_group*
50 Music_iterator::get_req_translator_l()
51 {
52   assert (report_to_l());
53   if (report_to_l()->is_bottom_translator_b ())
54     return report_to_l();
55
56   set_translator (report_to_l()->get_default_interpreter ());
57   return report_to_l();
58 }
59
60
61 Translator_group* 
62 Music_iterator::report_to_l() const
63 {
64   return handle_.report_to_l ();
65 }
66
67
68 void
69 Music_iterator::set_translator (Translator_group*trans)
70 {
71   handle_.set_translator (trans);
72 }
73
74 void
75 Music_iterator::construct_children()
76 {
77 }
78
79 Music_iterator::~Music_iterator()
80 {
81 }
82
83 Moment
84 Music_iterator::next_moment() const
85 {
86   return 0;
87 }
88
89
90 void
91 Music_iterator::process_and_next (Moment m)
92 {
93   do_process_and_next (m);
94 }
95
96 void
97 Music_iterator::do_process_and_next (Moment)
98 {
99   first_b_ = false;
100 }
101
102 bool
103 Music_iterator::ok() const
104 {
105   return first_b_;
106 }
107
108 Music_iterator*
109 Music_iterator::static_get_iterator_p (Music const *m, Translator_group *report_l)
110 {
111   Music_iterator * p =0;
112   if (dynamic_cast<Request_chord  const *> (m))
113     p = new Request_chord_iterator;
114   else if (dynamic_cast<Simultaneous_music  const *> (m)) 
115     p =  new Simultaneous_music_iterator;
116   else if (dynamic_cast<Sequential_music  const *> (m)) 
117     p =  new Sequential_music_iterator;
118   else if (dynamic_cast<Translation_property  const *> (m))
119     p = new Property_iterator;
120   else if (dynamic_cast<Change_translator  const *> (m))
121     p = new Change_iterator;
122   else if (dynamic_cast<Time_scaled_music  const *> (m))
123     p = new Time_scaled_music_iterator;
124   else if (dynamic_cast<Music_wrapper  const *> (m))
125     p = new Music_wrapper_iterator;
126   else if (dynamic_cast<Repeated_music const *> (m))
127     p = new Repeated_music_iterator;
128   else
129     assert (0);
130
131   p->music_l_ = m;
132   if (m->translator_type_str_.length_i ())
133     {
134       Translator_group* a =report_l->
135         find_create_translator_l (m->translator_type_str_, m->translator_id_str_);
136       p->set_translator (a);
137     }
138
139   if (! p->report_to_l())
140     p ->set_translator (report_l);
141
142   
143   return p;
144 }
145
146
147 Music_iterator*
148 Music_iterator::get_iterator_p (Music const*m) const
149 {
150   Music_iterator*p = static_get_iterator_p (m, report_to_l());
151   p->construct_children();
152   return p;
153 }
154
155 Music_iterator::Music_iterator()
156 {
157   first_b_ = true;
158 }
159
160