]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/music-iterator.hh
release: 1.3.107
[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 #include "music-iterator-ctor.hh"
19
20 /** 
21   Conceptually a music-iterator operates on a queue of musical events
22   that are pending. This queue does not actually exist, but it is a
23   way of viewing and traversing music-expressions.
24
25   
26   ok () -- events left ?
27
28   pending_mom () -- time tag of the next event to be processed.
29     PRECONDITION: this->ok() holds.
30   
31   process (M) -- process all at M (Precondition: no events exist
32     before M, this->ok() holds).  Side-effects:
33     
34     * This removes all events at M from the pending queue.
35
36     * Typically this reports the music to an interpretation context,
37     thus changing the state of the interpretation context.
38
39   get_music (M) -- return all events starting at M (pre: no events
40     before M). No side-effects
41
42   skip (M) -- remove all events starting before M (leave the ones that
43     start M).  no side-effects on interpretation context
44
45
46   TODO:
47
48   merge pending_moment and process?
49   
50 */
51 class Music_iterator
52 {
53 protected:
54   Moment music_length_;
55
56 public:
57   VIRTUAL_COPY_CONS (Music_iterator);
58
59   Moment music_length_mom () const;
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   static SCM constructor_cxx_function;
95   
96 protected:
97   Music  * music_l_;
98
99   /**
100     Get an iterator for MUS, inheriting the translation unit from THIS.
101    */
102   Music_iterator* get_iterator_p (Music *) const;
103
104   virtual Music_iterator* try_music_in_children (Music *) const;
105
106 private:
107   Interpretation_context_handle handle_;
108 };
109
110
111 /*
112   implement Class::constructor, a SCM function that
113   returns an encapsulated factory function.
114  */
115 #define IMPLEMENT_CTOR_CALLBACK(Class)          \
116 static void *                                           \
117 Class ## _ctor (SCM)                            \
118 {                                               \
119   return new Class ;                            \
120 }                                               \
121 SCM Class :: constructor_cxx_function;\
122 void                                            \
123 Class ## _constructor_init()                            \
124 {                                               \
125   SCM s = smobify_cxx_function (& Class ## _ctor);      \
126   scm_permanent_object (s);\
127   gh_define (#Class "::constructor", s);\
128   Class :: constructor_cxx_function = s;\
129 }\
130 ADD_SCM_INIT_FUNC(Class ## _ctor_init, Class ## _constructor_init); 
131
132  
133
134
135
136
137
138 #endif // MUSIC_ITERATOR_HH