]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/sequential-iterator.cc
2003 -> 2004
[lilypond.git] / lily / sequential-iterator.cc
index de12d9362e33bf805e6799abfd96ae95de258106..e0fef5778b2776a6ac882a43d0e19b71229f733c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "translator-group.hh"
@@ -21,28 +21,14 @@ Grace_fixup *get_grace_fixups (SCM cursor);
 
 */
 
-/*
-
-  TODO: the grace note handling hasn't been done for skip() and
-  get_music(), meaning that staff-switching and partcombining will be
-  broken with grace notes.
-  
- */
-/*
-
-  TODO: the grace note handling hasn't been done for skip() and
-  get_music(), meaning that staff-switching and partcombining will be
-  broken with grace notes.
-  
- */
 /*
   Invariant for the data structure.
 
 
   if (gh_pair_p (cursor_))
-    iter_p_->music_l_ == unsmob_music (ly_car (cursor_))
+    iter_->music_ == unsmob_music (ly_car (cursor_))
   else
-    iter_p_ == 0;
+    iter_ == 0;
 
   The length of musiclist from start to up to cursor_ (cursor_ not
   including), is summed
@@ -53,8 +39,10 @@ Grace_fixup *get_grace_fixups (SCM cursor);
 Sequential_iterator::Sequential_iterator ()
 {
   here_mom_ = Moment (0);
+  list_ = SCM_EOL;
+  cursor_ = SCM_EOL; 
   grace_fixups_ = 0;
-  iter_p_ =0;
+  iter_ =0;
 }
 
 SCM 
@@ -63,25 +51,34 @@ Sequential_iterator::get_music_list () const
   return SCM_EOL;
 }
 
-Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
-  : Music_iterator (src)
+void
+Sequential_iterator::do_quit ()
 {
-  grace_fixups_ = copy_grace_fixups (src.grace_fixups_);
-  cursor_ = src.cursor_;
-  list_ = src.cursor_;
-  here_mom_ = src.here_mom_;
-  if (src.iter_p_)
-    iter_p_ = src.iter_p_->clone ();
-  else
-    iter_p_ = 0;
+  if (iter_)
+    iter_->quit();
 }
 
-Sequential_iterator::~Sequential_iterator ()
+
+
+
+void
+Sequential_iterator::derived_mark ()const
 {
-  delete iter_p_;
+  if (iter_)
+    scm_gc_mark (iter_->self_scm());
+  scm_gc_mark (list_);
+  scm_gc_mark (cursor_);
 }
 
 
+void
+Sequential_iterator::derived_substitute (Translator_group*f,Translator_group*t)
+{
+  if (iter_)
+    iter_->substitute_outlet (f,t);
+  
+}
+
 Grace_fixup *
 get_grace_fixups (SCM cursor)
 {
@@ -94,7 +91,7 @@ get_grace_fixups (SCM cursor)
     {
       Music * mus = unsmob_music (ly_car (cursor));
       Moment s = mus->start_mom ();
-      Moment l =mus->length_mom () - s;
+      Moment l =mus->get_length () - s;
 
       if (s.grace_part_)
        {
@@ -143,19 +140,25 @@ Sequential_iterator::construct_children ()
   list_ = get_music_list ();
   cursor_ = list_; 
 
-  iter_p_ = gh_pair_p (cursor_) ?  get_iterator_p (unsmob_music (ly_car (cursor_))) : 0;
-  while (iter_p_ && !iter_p_->ok ())
+  iter_ = 0;
+  if (gh_pair_p (cursor_))
+    {
+      Music *m  =unsmob_music (ly_car (cursor_));
+      iter_ = unsmob_iterator (get_iterator (m));
+    }
+  
+  while (iter_ && !iter_->ok ())
     {
       next_element (true);
     }
 
-  here_mom_ = music_l ()->start_mom ();
+  here_mom_ = get_music ()->start_mom ();
   grace_fixups_ = get_grace_fixups (cursor_);
 
   /*
-    iter_p_->ok () is tautology, but what the heck.
+    iter_->ok () is tautology, but what the heck.
    */
-  if (iter_p_ && iter_p_->ok ()) 
+  if (iter_ && iter_->ok ()) 
     descend_to_child ();
 }
 
@@ -165,9 +168,9 @@ Sequential_iterator::construct_children ()
   swoop.
 */
 void
-Sequential_iterator::next_element (bool side_effect)
+Sequential_iterator::next_element (bool)
 {
-  Moment len =iter_p_->music_length_mom () - iter_p_->music_start_mom ();
+  Moment len =iter_->music_get_length () - iter_->music_start_mom ();
   assert (!grace_fixups_  || grace_fixups_->start_ >= here_mom_);
   
   if (len.main_part_ && grace_fixups_ &&
@@ -196,13 +199,13 @@ Sequential_iterator::next_element (bool side_effect)
       here_mom_ += len;
     }
   
-  delete iter_p_;
   cursor_ = ly_cdr (cursor_);
 
+  iter_->quit();
   if (gh_pair_p (cursor_))
-    iter_p_ = get_iterator_p (unsmob_music (ly_car (cursor_)));
+    iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
   else
-    iter_p_ = 0;
+    iter_ = 0;
 }
 
 /*
@@ -212,92 +215,25 @@ Sequential_iterator::next_element (bool side_effect)
 void
 Sequential_iterator::descend_to_child ()
 {
-}
-
-
-/*
-  Retrieve all music (starting at HERE), until a music with length L >
-  0 is found.  From the precondition, we know that UNTIL is later than
-  the earliest event. Hence we know
-  
-  L >= (UNTIL - HERE)
-
-  so something that comes after this thing with L > 0 happens after
-
-  HERE + L >= HERE + (UNTIL - HERE) = UNTIL
-
-  Hence all events after the one with L>0 are uninteresting, so we
-  ignore them.
-  
-*/
-
-SCM
-Sequential_iterator::get_music (Moment until)const
-{
-  SCM s = SCM_EOL;
-  if (until <  pending_moment ())
-    return s;
+  Translator_group  * child_report = child_report = iter_->get_outlet ();
+  Translator_group * me_report = get_outlet ();
 
-  Sequential_iterator * me =
-    dynamic_cast<Sequential_iterator*> (clone ());
-  while (me->ok ())
+  Translator_group * c = child_report;
+  while (c && c != me_report)
     {
-      SCM nm = me->iter_p_->get_music (until - me->here_mom_);
-      s = gh_append2 (nm, s);
-      
-      Moment m = 0;
-      for (SCM i = nm; gh_pair_p (i); i = ly_cdr (i))
-       {
-         Music *mus=unsmob_music (ly_car (i));
-         m = m >? (mus->length_mom () - mus->start_mom ());
-       }
-      if (m > Moment (0))
-       break ;
-      else
-       me->next_element (false);
+      c= c->daddy_trans_;
     }
-  delete me;
   
-  return s;
+  if (c == me_report)
+    set_translator (child_report);
 }
 
 
-/*
-  Skip events till UNTIL. We don't do any other side effects such as
-  descending to child iterator contexts, because they might depend on
-  \context specs and \translator changes being executed
-
-  TODO: check support for grace notes here.
- */
-void
-Sequential_iterator::skip (Moment until)
-{
-  while (ok ())
-    {
-      if (grace_fixups_ &&
-         grace_fixups_->start_ == here_mom_
-         && (grace_fixups_->start_ + grace_fixups_->length_
-             + Moment (Rational (0), grace_fixups_->grace_start_) == until))
-       {
-         /*
-           do the stuff/note/rest preceding a grace.
-          */
-         iter_p_->skip (iter_p_->music_length_mom ());
-       }
-      else if (iter_p_->music_length_mom () >= until - here_mom_)
-       iter_p_->skip (until - here_mom_ + iter_p_->music_start_mom ());
-
-      if (iter_p_->ok ())
-       return ; 
-
-      next_element (false);
-    }
-}
 
 void
 Sequential_iterator::process (Moment until)
 {
-  while (iter_p_)
+  while (iter_)
     {
       if (grace_fixups_ &&
          grace_fixups_->start_ == here_mom_
@@ -307,10 +243,10 @@ Sequential_iterator::process (Moment until)
          /*
            do the stuff/note/rest preceding a grace.
           */
-         iter_p_->process (iter_p_->music_length_mom ());
+         iter_->process (iter_->music_get_length ());
        }
       else
-       iter_p_->process (until - here_mom_ + iter_p_->music_start_mom ());
+       iter_->process (until - here_mom_ + iter_->music_start_mom ());
 
       /*
        if the iter is still OK, there must be events left that have
@@ -318,7 +254,7 @@ Sequential_iterator::process (Moment until)
          TIME > LEFT
          
       */
-      if (iter_p_->ok ())
+      if (iter_->ok ())
        return ;
 
       descend_to_child ();
@@ -329,13 +265,13 @@ Sequential_iterator::process (Moment until)
 Moment
 Sequential_iterator::pending_moment () const
 {
-  Moment cp = iter_p_->pending_moment ();
+  Moment cp = iter_->pending_moment ();
 
   /*
     Fix-up a grace note halfway in the music.
   */
   if (grace_fixups_ && here_mom_ == grace_fixups_->start_
-      && grace_fixups_->length_ + iter_p_->music_start_mom () == cp)
+      && grace_fixups_->length_ + iter_->music_start_mom () == cp)
     {
       return here_mom_ + grace_fixups_->length_ + Moment (0, grace_fixups_->grace_start_);
     }
@@ -343,20 +279,26 @@ Sequential_iterator::pending_moment () const
   /*
     Fix-up a grace note at  the start of the music.
   */
-  return cp + here_mom_ - iter_p_->music_start_mom ();
+  return cp + here_mom_ - iter_->music_start_mom ();
 }
 
 
 bool
 Sequential_iterator::ok () const
 {
-  return iter_p_;
+  return iter_;
 }
 
 Music_iterator*
 Sequential_iterator::try_music_in_children (Music *m) const
 { 
-  return iter_p_ ? iter_p_->try_music (m) : 0;
+  return iter_ ? iter_->try_music (m) : 0;
 }
 
 IMPLEMENT_CTOR_CALLBACK (Sequential_iterator);
+
+bool
+Sequential_iterator::run_always () const
+{
+  return iter_ ? iter_->run_always () : false; 
+}