]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/sequential-iterator.cc
*** empty log message ***
[lilypond.git] / lily / sequential-iterator.cc
index de12d9362e33bf805e6799abfd96ae95de258106..0658853a122a0d14c86879bed50a3d89db8cffff 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,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,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_;
-  if (src.iter_p_)
-    iter_p_ = src.iter_p_->clone ();
-  else
-    iter_p_ = 0;
+  iter_ = 0;
+
+  if (src.iter_)
+    {
+      iter_ = src.iter_->clone ();
+      scm_gc_unprotect_object (iter_->self_scm());
+    }
 }
 
-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_);
 }
 
 
@@ -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,19 +146,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 +174,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 +205,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;
 }
 
 /*
@@ -232,7 +241,7 @@ Sequential_iterator::descend_to_child ()
 */
 
 SCM
-Sequential_iterator::get_music (Moment until)const
+Sequential_iterator::get_pending_events (Moment until)const
 {
   SCM s = SCM_EOL;
   if (until <  pending_moment ())
@@ -242,22 +251,22 @@ Sequential_iterator::get_music (Moment until)const
     dynamic_cast<Sequential_iterator*> (clone ());
   while (me->ok ())
     {
-      SCM nm = me->iter_p_->get_music (until - me->here_mom_);
+      SCM nm = me->iter_->get_pending_events (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 ());
+         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 +275,6 @@ Sequential_iterator::get_music (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,12 +289,12 @@ Sequential_iterator::skip (Moment until)
          /*
            do the stuff/note/rest preceding a grace.
           */
-         iter_p_->skip (iter_p_->music_length_mom ());
+         iter_->skip (iter_->music_get_length ());
        }
-      else if (iter_p_->music_length_mom () >= until - here_mom_)
-       iter_p_->skip (until - here_mom_ + iter_p_->music_start_mom ());
+      else if (iter_->music_get_length () >= until - here_mom_)
+       iter_->skip (until - here_mom_ + iter_->music_start_mom ());
 
-      if (iter_p_->ok ())
+      if (iter_->ok ())
        return ; 
 
       next_element (false);
@@ -297,7 +304,7 @@ Sequential_iterator::skip (Moment until)
 void
 Sequential_iterator::process (Moment until)
 {
-  while (iter_p_)
+  while (iter_)
     {
       if (grace_fixups_ &&
          grace_fixups_->start_ == here_mom_
@@ -307,10 +314,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 +325,7 @@ Sequential_iterator::process (Moment until)
          TIME > LEFT
          
       */
-      if (iter_p_->ok ())
+      if (iter_->ok ())
        return ;
 
       descend_to_child ();
@@ -329,13 +336,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 +350,20 @@ 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);