]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/music-iterator.hh
patch::: 1.3.88.jcn1
[lilypond.git] / lily / include / music-iterator.hh
1 /*
2   music-iterator.hh -- declare Music_iterator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9
10 #ifndef MUSIC_ITERATOR_HH
11 #define MUSIC_ITERATOR_HH
12
13 #include "lily-proto.hh"
14 #include "array.hh"
15 #include "moment.hh"
16 #include "virtual-methods.hh"
17 #include "interpretation-context-handle.hh"
18
19 /** 
20   Conceptually a music-iterator operates on a queue of musical events
21   that are pending. This queue does not actually exist, but it is a
22   way of viewing and traversing music-expressions.
23
24   
25   ok () -- events left ?
26
27   pending_mom () -- time tag of the next event to be processed.
28   
29   process (M) -- process all at M (Precondition: no events exist before
30     M).  Side-effects:
31     
32     * This removes all events at M from the pending queue.
33
34     * Typically this reports the music to an interpretation context,
35     thus changing the state of the interpretation context.
36
37   get_music (M) -- return all events starting at M (pre: no events
38     before M).
39
40   skip (M) -- remove all events at M from the pending queue.
41
42 */
43 class Music_iterator
44 {
45 public:
46   VIRTUAL_COPY_CONS (Music_iterator);
47
48   Music_iterator ();
49   Music_iterator (Music_iterator const&);
50   virtual ~Music_iterator ();
51
52   /**
53      Do the reporting.  Will try MUSIC_L_ in its own translator first,
54      then its children. Returns the iterator that succeeded
55   */
56   Music_iterator *  try_music (Music  *) const;
57
58   /**
59     The translation unit that we this iterator is reporting  to now.
60    */
61   Translator_group* report_to_l () const;
62
63   void set_translator (Translator_group*);
64   
65   /** Get an iterator matching the type of MUS, and use TRANS to find
66     an accompanying translation unit
67    */
68   static Music_iterator* static_get_iterator_p (Music * mus);
69   void init_translator (Music  *, Translator_group *); 
70
71   virtual Moment pending_moment () const;
72   virtual bool ok () const;
73   virtual SCM get_music (Moment until)const;
74   virtual void process (Moment until);
75   virtual void skip (Moment until);
76
77   /**
78     Construct sub-iterators, and set the translator to 
79     report to.
80    */
81   virtual void construct_children ();
82
83 protected:
84   Music  * music_l_;
85
86   /**
87     Get an iterator for MUS, inheriting the translation unit from THIS.
88    */
89   Music_iterator* get_iterator_p (Music *) const;
90
91   virtual Music_iterator* try_music_in_children (Music *) const;
92
93 private:
94   Interpretation_context_handle handle_;
95 };
96
97 #endif // MUSIC_ITERATOR_HH