2 music-iterator.hh -- declare Music_iterator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #ifndef MUSIC_ITERATOR_HH
11 #define MUSIC_ITERATOR_HH
13 #include "lily-proto.hh"
16 #include "virtual-methods.hh"
17 #include "interpretation-context-handle.hh"
19 /** Walk through music and deliver music to translation units, synced
20 in time. This class provides both the implementation of the shared
21 code, and the public interface.
23 Derived classes should only have a public constructor.
24 The state of an iterator would be the intersection of the particular music
25 construct with one point in musical time.
27 class Music_iterator {
28 Interpretation_context_handle handle_;
31 bool playback_b_; // Should use SCMs
33 Music const * music_l_;
39 Do the actual printing. This should be overriden in derived classes. It
40 is called by #print#, in the public interface
42 virtual void do_print() const;
45 Find a bottom notation context to deliver requests to.
47 virtual Translator_group* get_req_translator_l();
50 Get an iterator for MUS, inheriting the translation unit from THIS.
52 Music_iterator* get_iterator_p (Music const*mus) const;
54 /** Do the actual move. This should be overriden in derived
55 classes. It is called by #process_and_next#, the public interface
57 virtual void do_process_and_next (Moment until);
60 virtual Music_iterator* try_music_in_children (Music const *) const;
65 Do the reporting. Will try MUSIC_L_ in its own translator first,
66 then its children. Returns the iterator that succeeded
68 Music_iterator * try_music (Music const *) const;
71 The translation unit that we this iterator is reporting to now.
73 Translator_group*report_to_l() const;
75 void set_translator (Translator_group*);
77 /** Get an iterator matching the type of MUS, and use TRANS to find
78 an accompanying translation unit. Repeated music can be fully
79 unfolded by setting PLAYING */
80 static Music_iterator* static_get_iterator_p (Music const* mus, bool playing);
81 void init_translator (Music const *, Translator_group *);
85 /// Find the next interesting point in time.
86 virtual Moment next_moment() const;
89 ///Are we finished with this piece of music?
90 virtual bool ok() const;
92 virtual ~Music_iterator();
95 ///Report all musical information that occurs between now and UNTIL
96 void process_and_next (Moment until);
99 Construct sub-iterators, and set the translator to
102 virtual void construct_children();
106 #endif // MUSIC_ITERATOR_HH