]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grouping.cc
release: 0.1.37
[lilypond.git] / lily / grouping.cc
index ffda40e14fd707bbac65b696e2b38d47695f4743..dfc59748e8ce5f4af4790eb5a7b7a649cb94d89c 100644 (file)
 void
 Rhythmic_grouping::init()
 {
-    interval_ = 0;
-    children.clear();     
+  interval_ = 0;
+  children.clear();     
 }
 
 void
-Rhythmic_grouping::OK()const
+Rhythmic_grouping::OK() const
 {
 #ifndef NDEBUG
-    assert (bool (children.size()) != bool (interval_));
-
-    for (int i= 0; i < children.size(); i++) {
-       children[i]->OK();
-       if (i>0)
-           assert (children[i-1]->interval().right ==
-                  children[i]->interval().left);
+  assert (bool (children.size()) != bool (interval_));
+
+  for (int i= 0; i < children.size(); i++) 
+    {
+      children[i]->OK();
+      if (i>0)
+       assert (children[i-1]->interval().right ==
+               children[i]->interval().left);
     }
 #endif
 }
@@ -35,33 +36,35 @@ Rhythmic_grouping::OK()const
 Moment
 Rhythmic_grouping::length() const
 {
-    return interval().length ();
+  return interval().length ();
 }
 
 MInterval
-Rhythmic_grouping::interval()const
+Rhythmic_grouping::interval() const
 {
-    if (interval_)
-       return *interval_;
-    else
-       return
-           MInterval (children[0]->interval().left,
-                    children.top()->interval ().right);
+  if (interval_)
+    return *interval_;
+  else
+    return
+      MInterval (children[0]->interval().left,
+                children.top()->interval ().right);
 }
 
 void
 Rhythmic_grouping::split (Rhythmic_grouping r)
 {
-    if (interval_)
-       return ;
-    
-    r.intersect (interval());
-    split (r.intervals());
-    
-    for (int i= 0; i < children.size(); i++) {
-       if (!children[i]->interval_) {
-           Rhythmic_grouping here (r); 
-           children[i]->split (here);
+  if (interval_)
+    return ;
+  
+  r.intersect (interval());
+  split (r.intervals());
+  
+  for (int i= 0; i < children.size(); i++) 
+    {
+      if (!children[i]->interval_) 
+       {
+         Rhythmic_grouping here (r);   
+         children[i]->split (here);
        }
     }
 }
@@ -70,41 +73,50 @@ Rhythmic_grouping::split (Rhythmic_grouping r)
 Array<MInterval>
 Rhythmic_grouping::intervals()
 {
-    Array<MInterval> r;
-    if (interval_ || children.size() == 1) {
-       MInterval i (interval());
-       MInterval r1(i), r2(i);
-       r1.right = r2.left = i.center();
-       r.push (r1); r.push (r2);
-    } else {
-       for (int i=0; i < children.size(); i++)
-           r.push (children[i]->interval());
+  Array<MInterval> r;
+  if (interval_ || children.size() == 1) 
+    {
+      MInterval i (interval());
+      MInterval r1(i), r2(i);
+      r1.right = r2.left = i.center();
+      r.push (r1); r.push (r2);
+    }
+  else 
+    {
+      for (int i=0; i < children.size(); i++)
+       r.push (children[i]->interval());
     }
-    return r;
+  return r;
 }
 
 void
 Rhythmic_grouping::intersect (MInterval t)
 {
-    if (interval_) {
-       interval_->intersect (t);
-       return;
+  if (interval_) 
+    {
+      interval_->intersect (t);
+      return;
     }
-    
-    for (int i=0; i < children.size(); i++) {
-       MInterval inter = intersection (t, children[i]->interval());
-       if (inter.empty_b() || inter.length () <= Rational (0)) {
-           delete children[i];
-           children[i] =0;
-       } else {
-           children[i]->intersect (t);
+  
+  for (int i=0; i < children.size(); i++) 
+    {
+      MInterval inter = intersection (t, children[i]->interval());
+      if (inter.empty_b() || inter.length () <= Rational (0)) 
+       {
+         delete children[i];
+         children[i] =0;
+       }
+      else 
+       {
+         children[i]->intersect (t);
        }
     }
-    for (int i=0; i < children.size();) {
-       if (!children[i])
-           children.del (i);
-       else
-           i++;
+  for (int i=0; i < children.size();) 
+    {
+      if (!children[i])
+       children.del (i);
+      else
+       i++;
     }
 
 }
@@ -120,231 +132,252 @@ Rhythmic_grouping::intersect (MInterval t)
 void
 Rhythmic_grouping::split (Array<MInterval> splitpoints)
 {
-    //check on splitpoints..
-    int j = 0, i = 0, starti = 0, startj = 0;
-    
-    Array<Rhythmic_grouping*> ch;
-    while (1) {
-       if  ( i >= children.size() || j >= splitpoints.size ())
-           break;
+  //check on splitpoints..
+  int j = 0, i = 0, starti = 0, startj = 0;
+  
+  Array<Rhythmic_grouping*> ch;
+  while (1) 
+    {
+      if  (i >= children.size() || j >= splitpoints.size ())
+       break;
        
-       assert (
-           children[starti]->interval().left== splitpoints[startj].left);
-               if (children[i]->interval().right < splitpoints[j].right) {
-           i ++;
-       } else if (children[i]->interval().right > splitpoints[j].right) {
-           j ++;
-       } else {
-
-           if (i == starti) {
-               ch.push (children[i]);
-           } else {
-               Rhythmic_grouping *newchild=new Rhythmic_grouping (
-                   children.slice (starti, i+1));
-
-               ch.push (newchild);
+      assert (
+             children[starti]->interval().left== splitpoints[startj].left);
+      if (children[i]->interval().right < splitpoints[j].right) 
+       {
+         i ++;
+       }
+      else if (children[i]->interval().right > splitpoints[j].right) 
+       {
+         j ++;
+       }
+      else 
+       {
+
+         if (i == starti) 
+           {
+             ch.push (children[i]);
+           }
+         else 
+           {
+             Rhythmic_grouping *newchild=new Rhythmic_grouping (
+                                                                children.slice (starti, i+1));
+
+             ch.push (newchild);
            }
-           i ++;
-           j++;
-           starti = i;
-           startj = j;
+         i ++;
+         j++;
+         starti = i;
+         startj = j;
 
 
        }
     }
-    if (ch.size() != 1)
-       children = ch;
-    }
+  if (ch.size() != 1)
+    children = ch;
+}
 
 
 Rhythmic_grouping::Rhythmic_grouping (MInterval t, int n)
 {
-    init();
-    if (n == 1 || !n) {
-       interval_ = new MInterval (t);
-       return;
+  init();
+  if (n == 1 || !n) 
+    {
+      interval_ = new MInterval (t);
+      return;
     }
-    Moment dt = t.length()/Rational (n);
-    MInterval basic = MInterval (t.left, t.left+dt);
-    for (int i= 0; i < n; i++)
-       children.push (new Rhythmic_grouping (dt*Rational (i) + basic));
+  Moment dt = t.length()/Rational (n);
+  MInterval basic = MInterval (t.left, t.left+dt);
+  for (int i= 0; i < n; i++)
+    children.push (new Rhythmic_grouping (dt*Rational (i) + basic));
 }
 
 
 Rhythmic_grouping::Rhythmic_grouping (Array<Rhythmic_grouping*> r)
-    :children (r)
+  :children (r)
 {
-    interval_ =0;
+  interval_ =0;
 }
 
 Rhythmic_grouping::~Rhythmic_grouping()
 {
-    junk();    
+  junk();    
 }
 
 void
 Rhythmic_grouping::copy (Rhythmic_grouping const&s)
 {
-    interval_ =  (s.interval_)? new MInterval (*s.interval_) : 0;
-    for (int i=0; i < s.children.size(); i++)
-       children.push (new Rhythmic_grouping (*s.children[i]));
+  interval_ =  (s.interval_)? new MInterval (*s.interval_) : 0;
+  for (int i=0; i < s.children.size(); i++)
+    children.push (new Rhythmic_grouping (*s.children[i]));
 }
 
 void
 Rhythmic_grouping::operator=(Rhythmic_grouping const &s)
 {
-    junk();
-    copy (s);
+  junk();
+  copy (s);
 }
 
 Rhythmic_grouping::Rhythmic_grouping (Rhythmic_grouping const&s)
 {
-    init();
-    copy (s);
+  init();
+  copy (s);
 }
 
 void
 Rhythmic_grouping::junk()
 {
-    delete interval_;
-    for (int i=0; i < children.size(); i++)
-       delete children[i];
-    init();
+  delete interval_;
+  for (int i=0; i < children.size(); i++)
+    delete children[i];
+  init();
 }
 
 void
-Rhythmic_grouping::print()const    
+Rhythmic_grouping::print() const    
 {
 #ifndef NPRINT
-    DOUT << "{ \n";
-    if (interval_)
-       DOUT <<" Interval "<< interval_->str();
-    for (int i=0; i < children.size(); i++) {
-       children[i]->print();
+  DOUT << "{ \n";
+  if (interval_)
+    DOUT <<" Interval "<< interval_->str();
+  for (int i=0; i < children.size(); i++) 
+    {
+      children[i]->print();
     }
-    DOUT << "}\n";
+  DOUT << "}\n";
 #endif
 }
 
 bool
 Rhythmic_grouping::child_fit_b (Moment start)
 {
-    if (children.size())
-       return ( children.top()->interval ().right== start);
+  if (children.size())
+    return (children.top()->interval ().right== start);
 
-    return true;
+  return true;
 }  
 
 void
 Rhythmic_grouping::add_child (Moment start, Moment len)
 {
-    Moment stop = start+len;
-
-    assert (child_fit_b (start));
-    children.push (new Rhythmic_grouping (MInterval (start, stop)));
+  Moment stop = start+len;
+  assert (child_fit_b (start));
+  children.push (new Rhythmic_grouping (MInterval (start, stop)));
 }
 
 Rhythmic_grouping::Rhythmic_grouping()
 {
-    interval_ =0;
+  interval_ =0;
 }
 
 int
 min_elt (Array<int> v)
 {
-    int i = 1000;              // ugh
-    for (int j = 0 ; j <  v.size(); j++)
-       i = i <? v[j];
-    return i;
+  int i = 1000;                // ugh
+  for (int j = 0 ; j <  v.size(); j++)
+    i = i <? v[j];
+  return i;
 }
 
 Array<int>
 Rhythmic_grouping::generate_beams (Array<int> flags, int &flagidx)
 {
-    assert (!interval_) ;
-    
-    Array< Array<int> > children_beams;
-    for (int i=0; i < children.size(); i++) {
-       Array<int> child_beams;
-       if (children[i]->interval_) {
-           int f = flags[flagidx++];
-           child_beams.push (f);
-       } else {
-           child_beams = children[i]->
-               generate_beams (flags, flagidx);
+  assert (!interval_) ;
+  
+  Array< Array<int> > children_beams;
+  for (int i=0; i < children.size(); i++) 
+    {
+      Array<int> child_beams;
+      if (children[i]->interval_) 
+       {
+         int f = flags[flagidx++];
+         child_beams.push (f);
        }
-       children_beams.push (child_beams);
+      else 
+       {
+         child_beams = children[i]->
+           generate_beams (flags, flagidx);
+       }
+      children_beams.push (child_beams);
     }
-    Array<int> beams;
-    int lastm, m, nextm;
-    for (int i=0; i  < children_beams.size(); i++) {
-       bool add_left =  (i >0);
-       bool add_right = (i  < children_beams.size() -1);
-
-       if (!i)
-           m =  min_elt (children_beams[i]);
-       if (add_right)
-           nextm = min_elt (children_beams[i+1]);
+  Array<int> beams;
+  int lastm, m, nextm;
+  for (int i=0; i  < children_beams.size(); i++) 
+    {
+      bool add_left =  (i >0);
+      bool add_right = (i  < children_beams.size() -1);
+
+      if (!i)
+       m =  min_elt (children_beams[i]);
+      if (add_right)
+       nextm = min_elt (children_beams[i+1]);
        
-       if (children_beams[i].size() == 1) {
-           if (add_right)
-               beams.push (m);
-           if (add_left)
-               beams.push (m);
-       } else {
-           if (add_left) 
-               beams.push (lastm <? m);
-           beams.concat (children_beams[i]);
-           if (add_right)
-               beams.push (m <? nextm);
+      if (children_beams[i].size() == 1) 
+       {
+         if (add_right)
+           beams.push (m);
+         if (add_left)
+           beams.push (m);
+       }
+      else 
+       {
+         if (add_left) 
+           beams.push (lastm <? m);
+         beams.concat (children_beams[i]);
+         if (add_right)
+           beams.push (m <? nextm);
        }
-       lastm = m;
-       m = nextm;      
+      lastm = m;
+      m = nextm;       
     }
-    assert (!(beams.size()%2));
-    return beams;
+  assert (!(beams.size()%2));
+  return beams;
 }
 
 void
 Rhythmic_grouping::translate (Moment m)
 {
-    if (interval_)
-       *interval_ += m;
-    else
-       for (int i=0; i < children.size(); i++)
-           children[i]->translate (m);
+  if (interval_)
+    *interval_ += m;
+  else
+    for (int i=0; i < children.size(); i++)
+      children[i]->translate (m);
 }
 
 void
-Rhythmic_grouping::extend (MInterval m)const
+Rhythmic_grouping::extend (MInterval m) const
 {    
-    assert (m.left >= interval().left);
-    while (m.right  >interval().right) {
-       Array<Rhythmic_grouping*> a (children);
-       for (int i=0; i < a.size(); i++) {
-           a[i] =new Rhythmic_grouping (*children[i]);
-           a[i]->translate (children.top()->interval ().right);            
+  assert (m.left >= interval().left);
+  while (m.right  >interval().right) 
+    {
+      Array<Rhythmic_grouping*> a (children);
+      for (int i=0; i < a.size(); i++) 
+       {
+         a[i] =new Rhythmic_grouping (*children[i]);
+         a[i]->translate (children.top()->interval ().right);      
        }
-       ((Rhythmic_grouping*)this)->children.concat (a);
+      ((Rhythmic_grouping*)this)->children.concat (a);
     }
-    assert (m.right <= interval().right);
-    OK();
+  assert (m.right <= interval().right);
+  OK();
 }
 
 Rhythmic_grouping
 parse_grouping (Array<int> beat_i_arr, Array<Moment> elt_length_arr)
 {
-    Moment here =0;
-    assert (beat_i_arr.size() == elt_length_arr.size ());
-    
-    Array<Rhythmic_grouping*> children;
-    for (int i=0; i < beat_i_arr.size(); i++) {
-       Moment last = here;
-       here += elt_length_arr[i] * Moment (beat_i_arr[i]);
-       children.push (
-           new Rhythmic_grouping (MInterval (last, here),
-                                 beat_i_arr[i]));
+  Moment here =0;
+  assert (beat_i_arr.size() == elt_length_arr.size ());
+  
+  Array<Rhythmic_grouping*> children;
+  for (int i=0; i < beat_i_arr.size(); i++) 
+    {
+      Moment last = here;
+      here += elt_length_arr[i] * Moment (beat_i_arr[i]);
+      children.push (
+                    new Rhythmic_grouping (MInterval (last, here),
+                                           beat_i_arr[i]));
     }
-    return Rhythmic_grouping (children);
+  return Rhythmic_grouping (children);
 }