X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fmusic-iterator.hh;h=bc99f499d3422fb3eb20cb60378729ebe977d64b;hb=5b6181075e3615dce049711973d3cd5caa60e5db;hp=a0501d7fc9e60e9a60cc9ad8548e99a24b57cd97;hpb=036af34aa44a151b9e67c18e0acccaafdfae9de8;p=lilypond.git diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index a0501d7fc9..bc99f499d3 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -1,9 +1,9 @@ /* - music-iterator.hh -- declare {Music,Chord,Voice}_iterator + music-iterator.hh -- declare Music_iterator source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--2001 Han-Wen Nienhuys */ @@ -11,86 +11,128 @@ #define MUSIC_ITERATOR_HH #include "lily-proto.hh" -#include "plist.hh" +#include "array.hh" #include "moment.hh" +#include "virtual-methods.hh" +#include "interpretation-context-handle.hh" +#include "cxx-function-smob.hh" -class Music_iterator { -protected: - bool first_b_; - -public: - Music_iterator *daddy_iter_l_; - NAME_MEMBERS(); - Register_group_register *report_to_reg_l_; +/** + Conceptually a music-iterator operates on a queue of musical events + that are pending. This queue does not actually exist, but it is a + way of viewing and traversing music-expressions. + + + ok () -- events left ? + + pending_mom () -- time tag of the next event to be processed. + PRECONDITION: this->ok () holds. + + process (M) -- process all at M (Precondition: no events exist + before M, this->ok () holds). Side-effects: - static Music_iterator* static_get_iterator_p(Music*,Register_group_register*); - Music_iterator* get_iterator_p(Music*)const; - Music_iterator(); - virtual void next(Moment until); - virtual Moment next_moment()const; - virtual bool ok()const; - virtual ~Music_iterator(); - virtual void construct_children(); - virtual Register_group_register * get_req_acceptor_l(); -}; + * This removes all events at M from the pending queue. -// duh. -class Request_iterator : public Music_iterator { - Request *req_l_; -public: - Request_iterator(Request const *); - NAME_MEMBERS(); -protected: - virtual void next(Moment); -}; + * Typically this reports the music to an interpretation context, + thus changing the state of the interpretation context. -class Change_iterator : public Music_iterator { - Change_reg * change_l_; -public: - NAME_MEMBERS(); - virtual void next(Moment); - Change_iterator(Change_reg*); -}; + get_music (M) -- return all events starting at M (pre: no events + before M). No side-effects + + skip (M) -- remove all events starting before M (leave the ones that + start M). no side-effects on interpretation context -class Chord_iterator : public Music_iterator -{ - const Chord *chord_C_; - Pointer_list children_p_list_; -public: - Chord_iterator(Chord const*); - NAME_MEMBERS(); -protected: - virtual void construct_children(); - virtual void next(Moment); - virtual Moment next_moment()const; - virtual bool ok()const; -}; -class Voice_element_iterator : public Chord_iterator { + TODO: + merge pending_moment and process? + +*/ +class Music_iterator +{ protected: - virtual void construct_children(); + Moment music_length_; + Moment start_mom_; public: - Voice_element_iterator(Voice_element*); - NAME_MEMBERS(); -}; + VIRTUAL_COPY_CONS (Music_iterator); + Moment music_length_mom () const; + Moment music_start_mom () const; + Music_iterator (); + Music_iterator (Music_iterator const&); + virtual ~Music_iterator (); -class Voice_iterator : private PCursor, public Music_iterator -{ - Moment here_mom_; - const Voice * voice_C_; - Music_iterator * iter_p_; - void next_element(); -public: - Voice_iterator(Voice const*); - NAME_MEMBERS(); -protected: - virtual void construct_children(); - ~Voice_iterator(); - virtual void next(Moment); - virtual Moment next_moment()const; - virtual bool ok()const; + /** + Do the reporting. Will try MUSIC_L_ in its own translator first, + then its children. Returns the iterator that succeeded + */ + Music_iterator * try_music (Music *) const; + + /** + The translation unit that we this iterator is reporting to now. + */ + Translator_group* report_to_l () const; + + void set_translator (Translator_group*); + + /** Get an iterator matching the type of MUS, and use TRANS to find + an accompanying translation unit + */ + static Music_iterator* static_get_iterator_p (Music * mus); + void init_translator (Music *, Translator_group *); + + virtual Moment pending_moment () const; + virtual bool ok () const; + virtual SCM get_music (Moment until)const; + virtual void process (Moment until); + virtual void skip (Moment until); + + /** + Construct sub-iterators, and set the translator to + report to. + */ + virtual void construct_children (); + static SCM constructor_cxx_function; + + /** + Get an iterator for MUS, inheriting the translation unit from THIS. + */ + Music_iterator* get_iterator_p (Music *) const; + + virtual Music_iterator* try_music_in_children (Music *) const; + + Music * music_l () const; +private: + Interpretation_context_handle handle_; + Music * music_l_; }; + +/* + implement Class::constructor, a SCM function that + returns an encapsulated factory function. + */ +#define IMPLEMENT_CTOR_CALLBACK(Class) \ +static void * \ +Class ## _ctor (SCM) \ +{ \ + return new Class ; \ +} \ +SCM Class :: constructor_cxx_function;\ +void \ +Class ## _constructor_init () \ +{ \ + SCM s = smobify_cxx_function (& Class ## _ctor); \ + scm_permanent_object (s);\ + gh_define (#Class "::constructor", s);\ + Class :: constructor_cxx_function = s;\ +}\ +ADD_SCM_INIT_FUNC (Class ## _ctor_init, Class ## _constructor_init); + + + + + + + #endif // MUSIC_ITERATOR_HH