]> git.donarmstrong.com Git - lilypond.git/blob - lily/percent-repeat-iterator.cc
* flower
[lilypond.git] / lily / percent-repeat-iterator.cc
1 /*
2   percent-repeat-iterator.cc -- implement Percent_repeat_iterator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2001--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "percent-repeat-iterator.hh"
10
11 #include "repeated-music.hh"
12 #include "input.hh"
13
14 IMPLEMENT_CTOR_CALLBACK (Percent_repeat_iterator);
15
16 Percent_repeat_iterator::Percent_repeat_iterator ()
17 {
18   child_iter_ = 0;
19 }
20
21 void
22 Percent_repeat_iterator::do_quit ()
23 {
24   if (child_iter_)
25     child_iter_->quit ();
26 }
27
28 bool
29 Percent_repeat_iterator::ok () const
30 {
31   return child_iter_;
32 }
33
34 void
35 Percent_repeat_iterator::construct_children ()
36 {
37   Music *mus = get_music ();
38   finish_mom_ = mus->get_length ();
39   child_iter_ = unsmob_iterator (get_iterator (Repeated_music::body (mus)));
40 }
41
42 void
43 Percent_repeat_iterator::process (Moment m)
44 {
45   if (!m.to_bool ())
46     {
47       Music_iterator *yeah = try_music (get_music ());
48       if (yeah)
49         set_context (yeah->get_outlet ());
50       else
51         get_music ()->origin ()->warning (_ ("no one to print a percent"));
52     }
53
54   if (child_iter_->ok ())
55     child_iter_->process (m);
56
57   if (finish_mom_ <= m)
58     {
59       child_iter_->quit ();
60       child_iter_ = 0;
61     }
62 }
63
64 Moment
65 Percent_repeat_iterator::pending_moment ()const
66 {
67   if (child_iter_->ok ())
68     return child_iter_->pending_moment ();
69   else
70     return finish_mom_;
71 }
72
73 Music_iterator *
74 Percent_repeat_iterator::try_music_in_children (Music *m) const
75 {
76   return child_iter_->try_music (m);
77 }
78
79 void
80 Percent_repeat_iterator::derived_mark ()const
81 {
82   if (child_iter_)
83     scm_gc_mark (child_iter_->self_scm ());
84 }
85
86 void
87 Percent_repeat_iterator::derived_substitute (Context *f, Context *t)
88 {
89   if (child_iter_)
90     child_iter_->substitute_outlet (f, t);
91 }