]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/sequential-iterator.cc
* input/test/staff-container.ly: update file
[lilypond.git] / lily / sequential-iterator.cc
index 64247fd72714cd8143bbf549b041ffdfe2f8c598..e8812c486ea859b508e435140fd486677f947636 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--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 #include "translator-group.hh"
@@ -21,20 +21,6 @@ Grace_fixup *get_grace_fixups (SCM cursor);
 
 */
 
-/*
-
-  TODO: the grace note handling hasn't been done for skip() and
-  get_pending_events(), 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_pending_events(), meaning that staff-switching and partcombining will be
-  broken with grace notes.
-  
- */
 /*
   Invariant for the data structure.
 
@@ -53,6 +39,8 @@ 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_ =0;
 }
@@ -63,6 +51,14 @@ Sequential_iterator::get_music_list () const
   return SCM_EOL;
 }
 
+void
+Sequential_iterator::do_quit ()
+{
+  if (iter_)
+    iter_->quit();
+}
+
+
 Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
   : Music_iterator (src)
 {
@@ -70,15 +66,22 @@ Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
   cursor_ = src.cursor_;
   list_ = src.cursor_;
   here_mom_ = src.here_mom_;
+  iter_ = 0;
+
   if (src.iter_)
-    iter_ = src.iter_->clone ();
-  else
-    iter_ = 0;
+    {
+      iter_ = src.iter_->clone ();
+      scm_gc_unprotect_object (iter_->self_scm());
+    }
 }
 
-Sequential_iterator::~Sequential_iterator ()
+void
+Sequential_iterator::derived_mark ()const
 {
-  delete iter_;
+  if (iter_)
+    scm_gc_mark (iter_->self_scm());
+  scm_gc_mark (list_);
+  scm_gc_mark (cursor_);
 }
 
 
@@ -94,7 +97,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,7 +146,13 @@ Sequential_iterator::construct_children ()
   list_ = get_music_list ();
   cursor_ = list_; 
 
-  iter_ = gh_pair_p (cursor_) ?  get_iterator (unsmob_music (ly_car (cursor_))) : 0;
+  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);
@@ -165,9 +174,9 @@ Sequential_iterator::construct_children ()
   swoop.
 */
 void
-Sequential_iterator::next_element (bool side_effect)
+Sequential_iterator::next_element (bool)
 {
-  Moment len =iter_->music_length_mom () - iter_->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,11 +205,11 @@ Sequential_iterator::next_element (bool side_effect)
       here_mom_ += len;
     }
   
-  delete iter_;
   cursor_ = ly_cdr (cursor_);
 
+  iter_->quit();
   if (gh_pair_p (cursor_))
-    iter_ = get_iterator (unsmob_music (ly_car (cursor_)));
+    iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
   else
     iter_ = 0;
 }
@@ -212,6 +221,17 @@ Sequential_iterator::next_element (bool side_effect)
 void
 Sequential_iterator::descend_to_child ()
 {
+  Translator_group  * child_report = child_report = iter_->report_to ();
+  Translator_group * me_report = report_to ();
+
+  Translator_group * c = child_report;
+  while (c && c != me_report)
+    {
+      c= c->daddy_trans_;
+    }
+  
+  if (c == me_report)
+    set_translator (child_report);
 }
 
 
@@ -232,7 +252,7 @@ Sequential_iterator::descend_to_child ()
 */
 
 SCM
-Sequential_iterator::get_pending_events (Moment until)const
+Sequential_iterator::get_pending_events (Moment until) const
 {
   SCM s = SCM_EOL;
   if (until <  pending_moment ())
@@ -249,15 +269,15 @@ Sequential_iterator::get_pending_events (Moment until)const
       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 ());
+         m = m >? (mus->get_length () - mus->start_mom ());
        }
       if (m > Moment (0))
        break ;
       else
        me->next_element (false);
     }
-  delete me;
-  
+
+  scm_gc_unprotect_object (me->self_scm());
   return s;
 }
 
@@ -266,8 +286,6 @@ Sequential_iterator::get_pending_events (Moment until)const
   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)
@@ -282,9 +300,9 @@ Sequential_iterator::skip (Moment until)
          /*
            do the stuff/note/rest preceding a grace.
           */
-         iter_->skip (iter_->music_length_mom ());
+         iter_->skip (iter_->music_get_length ());
        }
-      else if (iter_->music_length_mom () >= until - here_mom_)
+      else if (iter_->music_get_length () >= until - here_mom_)
        iter_->skip (until - here_mom_ + iter_->music_start_mom ());
 
       if (iter_->ok ())
@@ -307,7 +325,7 @@ Sequential_iterator::process (Moment until)
          /*
            do the stuff/note/rest preceding a grace.
           */
-         iter_->process (iter_->music_length_mom ());
+         iter_->process (iter_->music_get_length ());
        }
       else
        iter_->process (until - here_mom_ + iter_->music_start_mom ());