]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/include/interval.hh
* scm/lily.scm (postscript->png): use ~a iso. ~s
[lilypond.git] / flower / include / interval.hh
index 25b05ec01e49947b291ffda1ec75da8fabc5b40c..c2d012c4f165b7d00e299650c157604d1a5194d6 100644 (file)
@@ -19,25 +19,31 @@ template<class T>
 struct Interval_t : public Drul_array<T>
 {
   Drul_array<T>::elem;
+  Drul_array<T>::elem_ref;
 
   static T infinity ();
   static String T_to_string (T arg);
-  T center () const
-  {
-    assert (!is_empty ());
-    return (elem (LEFT) + elem (RIGHT)) / T (2);
-  }
+  T center () const;
   void translate (T t)
     {
-      elem (LEFT) += t;
-      elem (RIGHT) += t;
+      elem_ref (LEFT) += t;
+      elem_ref (RIGHT) += t;
     }
   void widen (T t)
   {
-    elem (LEFT) -= t;
-    elem (RIGHT) += t;    
+    elem_ref (LEFT) -= t;
+    elem_ref (RIGHT) += t;    
   }
   
+  T distance (T t) const
+  {
+    if (t > elem (RIGHT))
+      return T (t - elem (RIGHT));
+    else if (t < elem (LEFT))
+      return T (elem (LEFT) - t);
+    else
+      return T (0);
+  }
   /**
     PRE
     *this and h are comparable
@@ -46,8 +52,8 @@ struct Interval_t : public Drul_array<T>
   void intersect (Interval_t<T> h);
   void add_point (T p)
   {
-    elem(LEFT) = elem (LEFT) <? p;
-    elem(RIGHT) = elem (RIGHT) >? p;
+    elem_ref(LEFT) = elem (LEFT) <? p;
+    elem_ref(RIGHT) = elem (RIGHT) >? p;
   }
   T length () const;
   T delta () const;
@@ -75,15 +81,15 @@ struct Interval_t : public Drul_array<T>
   }
 
   Interval_t<T> &operator += (T r) {
-    elem (LEFT) += r;
-    elem (RIGHT) +=r;
+    elem_ref (LEFT) += r;
+    elem_ref (RIGHT) +=r;
     return *this;
   }
   Interval_t<T> &operator *= (T r) {
     if (!is_empty ())
       {
-       elem (LEFT) *= r;
-       elem (RIGHT) *= r;
+       elem_ref (LEFT) *= r;
+       elem_ref (RIGHT) *= r;
        if (r < T (0))
          swap();
 
@@ -103,15 +109,15 @@ struct Interval_t : public Drul_array<T>
   {
     T r = -elem (LEFT);
     T l = -elem (RIGHT);
-    elem (LEFT) = l;
-    elem (RIGHT) =r;
+    elem_ref (LEFT) = l;
+    elem_ref (RIGHT) =r;
   }
 
   void swap ()
   {
     T t = elem (LEFT);
-    elem (LEFT) = elem (RIGHT);
-    elem (RIGHT) = t;
+    elem_ref (LEFT) = elem (RIGHT);
+    elem_ref (RIGHT) = t;
   }
 };
 
@@ -193,6 +199,15 @@ Interval_t<T> operator * (Interval_t<T> i,T a){
   return a*i;
 }
 
+
+template<class T>
+inline T
+Interval_t<T>::center () const
+{
+  assert (!is_empty ());
+  return (elem (LEFT) + elem (RIGHT)) / T (2);
+}
+
 // again? see flower-proto.hh
 typedef Interval_t<Real> Interval;
 typedef Interval_t<int> Slice; // weird name