]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/unfolded-repeat-iterator.cc
release: 1.1.50
[lilypond.git] / lily / unfolded-repeat-iterator.cc
index 0550a46f06ccd3636d27e278e9919677e26965e0..4b6d40d16e499198f13efc820829c1f614b413a3 100644 (file)
@@ -24,6 +24,7 @@ Unfolded_repeat_iterator::Unfolded_repeat_iterator ()
   done_count_ =0;
   current_iter_p_ =0;
   do_main_b_ = false;
+  alternative_count_i_ =0;
 }
 
 /**
@@ -47,21 +48,42 @@ Unfolded_repeat_iterator::next_element ()
   if (do_main_b_)
     {
       done_mom_ += mus->repeat_body_p_->length_mom ();
+
+      if (!mus->semi_fold_b_)
+       done_count_ ++;
+     
       if (alternative_cons_l_)
        {
          current_iter_p_ = get_iterator_p (alternative_cons_l_->car_);
          do_main_b_ = false;
        }
+      else if (done_count_ <  mus->repeats_i_ && !mus->semi_fold_b_) 
+       {
+         current_iter_p_ = get_iterator_p (mus->repeat_body_p_);
+         do_main_b_ = true;
+       }
     }
   else
     {
+      /*
+       we're not in the main part. So we're either in an alternative, or
+       we just finished.
+      */
       if (alternative_cons_l_)
        {
          done_mom_ += alternative_cons_l_->car_->length_mom ();
-         alternative_cons_l_ = alternative_cons_l_->next_;
-         done_count_ ++;         
-       }
 
+         if (mus->semi_fold_b_ || 
+             mus->repeats_i_ - done_count_  < alternative_count_i_)
+           alternative_cons_l_ = alternative_cons_l_->next_;
+         
+         /*
+           we've done the main body as well, but didn't go over the other
+           increment.  */
+         if (mus->semi_fold_b_)
+           done_count_ ++;
+       }
+      
       if (done_count_ < mus->repeats_i_ && alternative_cons_l_)
        {
          if (mus->semi_fold_b_)
@@ -75,6 +97,7 @@ Unfolded_repeat_iterator::next_element ()
     }
 }
 
+
 bool
 Unfolded_repeat_iterator::ok () const
 {
@@ -95,6 +118,9 @@ Unfolded_repeat_iterator::construct_children ()
     ? mus->alternatives_p_->music_p_list_p_->head_
     : 0;
 
+  for (Cons<Music> *p = alternative_cons_l_; p; p = p->next_)
+    alternative_count_i_ ++;
+
   if (mus->repeat_body_p_)
     {
       current_iter_p_  = get_iterator_p (mus->repeat_body_p_);