]> git.donarmstrong.com Git - lilypond.git/blob - lily/folded-repeat-iterator.cc
release: 1.3.92
[lilypond.git] / lily / folded-repeat-iterator.cc
1 /*   
2   repeated-music-iterator.cc --  implement Folded_repeat_iterator
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10
11 /*
12    Folded repeats are a stupid idea at this point, so we refrain from
13    implementing get_music () and skip ().
14 */
15
16 #include "folded-repeat-iterator.hh"
17 #include "repeated-music.hh"
18 #include "music-list.hh"
19 #include "simultaneous-music-iterator.hh"
20 #include "translator-group.hh"
21
22 Folded_repeat_iterator::Folded_repeat_iterator ()
23 {
24   main_iter_p_ = 0;
25   alternative_iter_p_ = 0;
26 }
27
28 bool
29 Folded_repeat_iterator::ok () const
30 {
31   return main_iter_p_ || alternative_iter_p_;
32 }
33
34 Folded_repeat_iterator::~Folded_repeat_iterator ()
35 {
36   delete main_iter_p_;
37   delete alternative_iter_p_;
38 }
39
40 Moment
41 Folded_repeat_iterator::pending_moment () const
42 {
43   if (main_iter_p_)
44     {
45       return main_iter_p_->pending_moment ();
46     }
47   else
48     return main_length_mom_ + alternative_iter_p_->pending_moment ();
49 }
50
51 void
52 Folded_repeat_iterator::construct_children ()
53 {
54   Repeated_music  *  mus = dynamic_cast<Repeated_music*> (music_l_);
55   main_iter_p_ = get_iterator_p (mus->body ());
56   if (!main_iter_p_->ok())
57     {
58       leave_body ();
59       enter_alternative ();
60     }
61 }
62
63 void
64 Folded_repeat_iterator::process (Moment m)
65 {
66   if (!m)
67     {
68       bool success = try_music (music_l_);
69       if (!success)
70         music_l_->origin ()->warning ( _("no one to print a repeat brace"));
71     }
72   
73   if (main_iter_p_)
74     {
75       main_iter_p_->process (m);
76       if (!main_iter_p_->ok ())
77         leave_body ();
78     }
79
80   if (!main_iter_p_ && !alternative_iter_p_)
81     {
82       enter_alternative ();
83     }
84   
85   if (alternative_iter_p_)
86     {
87       alternative_iter_p_->process (m - main_length_mom_);
88       if (!alternative_iter_p_->ok ())
89         {
90           delete alternative_iter_p_;
91           alternative_iter_p_ =0;
92         }
93     }
94 }
95
96 void
97 Folded_repeat_iterator::leave_body ()
98 {
99   Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l_);
100   delete main_iter_p_;
101   main_iter_p_ = 0;
102   main_length_mom_ +=  mus->body ()->length_mom ();
103 }
104
105 void
106 Folded_repeat_iterator::enter_alternative ()
107 {
108   Repeated_music *  mus = dynamic_cast<Repeated_music *> (music_l_);  
109   if (mus->alternatives ())
110     {
111       Simultaneous_music_iterator * s = new Simultaneous_music_iterator;
112       s->separate_contexts_b_ = true;
113       s->init_translator (mus->alternatives (), report_to_l ());
114   
115       alternative_iter_p_ = s;
116       alternative_iter_p_->construct_children ();
117     }
118 }
119
120
121 Music_iterator*
122 Folded_repeat_iterator::try_music_in_children (Music * m) const
123 {
124   if (main_iter_p_)
125     {
126       return main_iter_p_->try_music (m);
127     }
128   if (alternative_iter_p_)
129     return alternative_iter_p_->try_music (m);
130   return 0;
131 }