X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fmusic-iterator.hh;h=e005bd60d395c5f71bddc6c7a6548721e2f6633f;hb=d765f3af45be51f15da55cf570a4b172200e1035;hp=2f9c6cf7cc887f3109c0b8353a75972315dbc396;hpb=287611887cd612ac84dbf10c5fe4e1a44cc56596;p=lilypond.git diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 2f9c6cf7cc..e005bd60d3 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ @@ -15,8 +15,18 @@ #include "moment.hh" #include "virtual-methods.hh" #include "interpretation-context-handle.hh" +#include "smobs.hh" -/** +/** + --- + + Music_iterator is an object type that traverses the Music structure and + reports the events it finds to interpretation contexts. It is not yet + user-serviceable. + + + --- + 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. @@ -25,75 +35,106 @@ 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). Side-effects: + process (M) -- process all at M (Precondition: no events exist + before M, this->ok () holds). Side-effects: * This removes all events at M from the pending queue. * Typically this reports the music to an interpretation context, thus changing the state of the interpretation context. - get_music (M) -- return all events starting at M (pre: no events - before M). Side effects: + get_pending_events (M) -- return all events starting at M (pre: no events + before M). No side-effects - * This removes all events at M from the pending queue. + skip (M) -- remove all events starting before M (leave the ones that + start M). no side-effects on interpretation context - Because next (M) is rolled into process () as a side effect, - we need to roll next (M) into get_music too. Urg. - + + TODO: + + merge pending_moment and process? + */ class Music_iterator { +protected: + Moment music_length_; + Moment start_mom_; + + DECLARE_SMOBS (Music_iterator,dummy); public: 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 (); /** 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; + Translator_group* report_to () 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); + static SCM get_static_get_iterator (Music * mus); void init_translator (Music *, Translator_group *); +void quit (); + virtual Moment pending_moment () const; virtual bool ok () const; - virtual SCM get_music (Moment until)const; + virtual SCM get_pending_events (Moment until)const; virtual void process (Moment until); - + virtual void skip (Moment until); + virtual void derived_mark ()const; + virtual void construct_children (); + /** Construct sub-iterators, and set the translator to report to. */ - virtual void construct_children (); - -protected: - Music * music_l_; + DECLARE_SCHEME_CALLBACK(constructor, ()); + /** Get an iterator for MUS, inheriting the translation unit from THIS. */ - Music_iterator* get_iterator_p (Music *) const; + SCM get_iterator (Music *) const; virtual Music_iterator* try_music_in_children (Music *) const; + Music * get_music () const; +protected: + virtual void do_quit(); private: Interpretation_context_handle handle_; + Music * music_; }; + +#define IMPLEMENT_CTOR_CALLBACK(Class) \ +LY_DEFINE_MEMBER_FUNCTION(Class,constructor, #Class "::constructor",\ + 0,0,0,\ + (),\ + "Construct a " #Class " music iterator")\ +{ \ + SCM val = (new Class)->self_scm(); \ + scm_gc_unprotect_object (val);\ + return val ; \ +} \ + +DECLARE_UNSMOB(Music_iterator, iterator); + #endif // MUSIC_ITERATOR_HH