lilypond-1.1.55
[lilypond.git] / lily / sequential-music-iterator.cc
blobd75713e30783aef542d65d97b1512c3e911c5aab
1 /*
2 Sequential_music_iterator.cc -- implement Sequential_music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
9 #include "translator-group.hh"
10 #include "debug.hh"
11 #include "sequential-music-iterator.hh"
12 #include "music-list.hh"
14 void
15 Sequential_music_iterator::do_print() const
17 if (iter_p_)
18 iter_p_->print();
21 Sequential_music_iterator::Sequential_music_iterator ()
23 cursor_ = 0;
24 here_mom_ = 0;
25 iter_p_ =0;
26 per_elt_b_ = false;
29 void
30 Sequential_music_iterator::construct_children()
32 cursor_ = dynamic_cast<Music_sequence const*> (music_l_)->music_p_list_p_->head_;
34 while (cursor_)
36 start_next_element();
37 if (!iter_p_->ok())
39 leave_element();
41 else
43 set_sequential_music_translator();
44 break;
49 void
50 Sequential_music_iterator::leave_element()
52 delete iter_p_;
53 iter_p_ =0;
54 Moment elt_time = cursor_->car_->length_mom ();
55 here_mom_ += elt_time;
56 cursor_ =cursor_->next_;
59 void
60 Sequential_music_iterator::start_next_element()
62 assert (!iter_p_);
63 iter_p_ = get_iterator_p (cursor_->car_);
66 void
67 Sequential_music_iterator::set_sequential_music_translator()
69 if (iter_p_->report_to_l()->depth_i () > report_to_l ()->depth_i ())
70 set_translator (iter_p_->report_to_l());
73 Sequential_music_iterator::~Sequential_music_iterator()
75 assert (! iter_p_);
81 void
82 Sequential_music_iterator::do_process_and_next (Moment until)
84 if (!iter_p_)
85 return;
87 while (1)
89 Moment local_until = until - here_mom_;
90 while (iter_p_->ok())
92 Moment here = iter_p_->next_moment();
93 if (here != local_until)
94 goto loopexit;
96 iter_p_->process_and_next (local_until);
99 if (!iter_p_->ok())
101 leave_element();
103 if (cursor_)
105 start_next_element();
106 set_sequential_music_translator();
108 if (per_elt_b_)
109 goto loopexit; // ugh.
111 else
113 goto loopexit;
118 loopexit:
120 Music_iterator::do_process_and_next (until);
123 Moment
124 Sequential_music_iterator::next_moment() const
126 return iter_p_->next_moment() + here_mom_;
129 bool
130 Sequential_music_iterator::ok() const
132 return iter_p_;