X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fmusic-iterator.hh;h=7bcb40fc8ac1965252637352e1f48999648d9bb2;hb=d9b43b93f2c885409bafdb157138158f65cc49aa;hp=d5ca0e0560dbea0c1c19a31d432118fe0b3bc054;hpb=8002fa018c81f70585c25232247c6dcba7f5cba0;p=lilypond.git diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index d5ca0e0560..7bcb40fc8a 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--1999 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ @@ -15,92 +15,124 @@ #include "moment.hh" #include "virtual-methods.hh" #include "interpretation-context-handle.hh" +#include "cxx-function-smob.hh" -/** Walk through music and deliver music to translation units, synced - in time. This class provides both the implementation of the shared - code, and the public interface. +/** + 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. - Derived classes should only have a public constructor. - The state of an iterator would be the intersection of the particular music - construct with one point in musical time. - */ -class Music_iterator { - Interpretation_context_handle handle_; + + ok () -- events left ? -protected: - bool playback_b_; // Should use SCMs + pending_mom () -- time tag of the next event to be processed. + PRECONDITION: this->ok () holds. - Music const * music_l_; + 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. - /// ugh. JUNKME - bool first_b_; + * Typically this reports the music to an interpretation context, + thus changing the state of the interpretation context. - /** - Do the actual printing. This should be overriden in derived classes. It - is called by #print#, in the public interface - */ - virtual void do_print() const; - - /** - Find a bottom notation context to deliver requests to. - */ - virtual Translator_group* get_req_translator_l(); + get_music (M) -- return all events starting at M (pre: no events + before M). No side-effects - /** - Get an iterator for MUS, inheriting the translation unit from THIS. - */ - Music_iterator* get_iterator_p (Music const*mus) const; + skip (M) -- remove all events starting before M (leave the ones that + start M). no side-effects on interpretation context - /** Do the actual move. This should be overriden in derived - classes. It is called by #process_and_next#, the public interface - */ - virtual void do_process_and_next (Moment until); + TODO: - virtual Music_iterator* try_music_in_children (Music const *) const; + merge pending_moment and process? +*/ +class Music_iterator +{ +protected: + Moment music_length_; + Moment start_mom_; 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 *) const; - + 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_l () const; void set_translator (Translator_group*); /** Get an iterator matching the type of MUS, and use TRANS to find - an accompanying translation unit. Repeated music can be fully - unfolded by setting PLAYING */ - static Music_iterator* static_get_iterator_p (Music const* mus, bool playing); - void init_translator (Music const *, Translator_group *); - - Music_iterator(); - - /// Find the next interesting point in time. - virtual Moment next_moment() const; - - - ///Are we finished with this piece of music? - virtual bool ok() const; - - virtual ~Music_iterator(); - + an accompanying translation unit + */ + static Music_iterator* static_get_iterator_p (Music * mus); + void init_translator (Music *, Translator_group *); - ///Report all musical information that occurs between now and UNTIL - void process_and_next (Moment until); + 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(); - void print() const; + 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