]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/music-iterator.hh
1709a5d8e81bec1c212171f594cd8b45438904fd
[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). No side-effects
39
40   skip (M) -- remove all events starting before M (leave the ones that
41     start M).  no side-effects on interpretation context
42
43
44   TODO:
45
46   merge pending_moment and process.
47   
48 */
49 class Music_iterator
50 {
51 protected:
52   Moment music_length_;
53
54 public:
55   VIRTUAL_COPY_CONS (Music_iterator);
56
57   Moment music_length_mom () const;
58
59   
60   Music_iterator ();
61   Music_iterator (Music_iterator const&);
62   virtual ~Music_iterator ();
63
64   /**
65      Do the reporting.  Will try MUSIC_L_ in its own translator first,
66      then its children. Returns the iterator that succeeded
67   */
68   Music_iterator *  try_music (Music  *) const;
69   
70   /**
71     The translation unit that we this iterator is reporting  to now.
72    */
73   Translator_group* report_to_l () const;
74
75   void set_translator (Translator_group*);
76   
77   /** Get an iterator matching the type of MUS, and use TRANS to find
78     an accompanying translation unit
79    */
80   static Music_iterator* static_get_iterator_p (Music * mus);
81   void init_translator (Music  *, Translator_group *); 
82
83   virtual Moment pending_moment () const;
84   virtual bool ok () const;
85   virtual SCM get_music (Moment until)const;
86   virtual void process (Moment until);
87   virtual void skip (Moment until);
88
89   /**
90     Construct sub-iterators, and set the translator to 
91     report to.
92    */
93   virtual void construct_children ();
94
95 protected:
96   Music  * music_l_;
97
98   /**
99     Get an iterator for MUS, inheriting the translation unit from THIS.
100    */
101   Music_iterator* get_iterator_p (Music *) const;
102
103   virtual Music_iterator* try_music_in_children (Music *) const;
104
105 private:
106   Interpretation_context_handle handle_;
107 };
108
109 #endif // MUSIC_ITERATOR_HH