]> git.donarmstrong.com Git - lilypond.git/blobdiff - flower/include/array.icc
* Another grand 2003 update.
[lilypond.git] / flower / include / array.icc
index 0077a01d08f6b52d3323fe6970ac973d9bbd0174..40e409d73bad580436025dd50a3d3b765adc45c1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  (c) Han-Wen Nienhuys 1995,96,97,98
+  (c) 1995--2003  Han-Wen Nienhuys 
 
   Distributed under GNU GPL
 */
  */
 
 template<class T> INLINE void 
-arrcpy (T*dest, T*src, int count)
+arrcpy (T*dest, T const* src, int count)
 {
   for (int i_shadows_local=0; i_shadows_local < count ; i_shadows_local++)
+#ifdef __powerpc__
+    {
+      /*
+       urg: wierd egcs-1.1.2-12c (stock LinuxPPC R5) bug on ppc
+       bug report filed
+       fixed in egcs-1.1.2-12f
+       ftp://dev.linuxppc.org/users/fsirl/R5/RPMS/ppc/ 
+      */
+      *dest = *src;
+      dest++, src++;
+    }
+#else
     *dest++ = *src++;
+#endif
 }
 
 template<class T> INLINE void
@@ -31,13 +44,12 @@ Array<T>::insert (T k, int j)
   assert (j >=0 && j<= size_);
   set_size (size_+1);
   for (int i=size_-1; i > j; i--)
-    array_p_[i] = array_p_[i-1];
-  array_p_[j] = k;
+    array_[i] = array_[i-1];
+  array_[j] = k;
 }
 
 template<class T> INLINE void
-Array<T>::sort (int (*compare)(T const&,T const&),
-          int lower = -1, int upper = -1) 
+Array<T>::sort (int (*compare) (T const&,T const&), int lower, int upper)
 {
   if (lower < 0) 
     {
@@ -49,7 +61,7 @@ Array<T>::sort (int (*compare)(T const&,T const&),
   swap (lower, (lower+upper)/2);
   int last = lower;
   for (int i= lower +1; i <= upper; i++)
-    if (compare (array_p_[i], array_p_[lower]) < 0)
+    if (compare (array_[i], array_[lower]) < 0)
       swap (++last,i);
   swap (lower, last);
   sort (compare, lower, last-1);
@@ -64,3 +76,84 @@ Array<T>::reverse ()
     swap (i,j);
 }
 
+template<class T> INLINE
+void
+Array<T>::OK () const
+{
+  assert (max_ >= size_ && size_ >=0);
+  if (max_) assert (array_);
+}
+
+template<class T> INLINE
+T *
+Array<T>::remove_array ()
+{
+  T * p = array_;
+  size_ = 0;
+  max_ = 0;
+  array_ =0;
+  return p;
+}
+
+template<class T> INLINE
+Array<T>
+Array<T>::slice (int lower, int upper) const
+{
+  assert (lower >= 0 && lower <=upper&& upper <= size_);
+  Array<T> r;
+  int s =upper-lower;
+  r.set_size (s);
+  arrcpy (r.array_, array_  + lower, s);
+  return r;
+}
+
+
+template<class T>
+void
+binary_search_bounds (Array<T> const &table,
+                     T const &key, int (*compare) (T const&, T const &),
+                     int *lo,
+                     int *hi)
+{
+  int cmp;
+  int result;
+
+  /* binary search */
+  do
+  {
+      cmp = (*lo + *hi) / 2;
+
+      result = (*compare)  (key, table[cmp]);
+
+      if (result < 0)
+          *hi = cmp;
+      else
+          *lo = cmp;
+    }
+  while (*hi - *lo > 1);
+}
+
+
+/*
+  lookup with binsearch, return array index.
+*/
+template<class T>
+int
+binary_search (Array<T> const &table,
+              T const &key, int (*compare) (T const&, T const &),
+              int lo = 0,
+              int hi = -1
+              ) 
+{
+  if (hi < 0)
+    hi = table.size ();
+
+  binary_search_bounds (table, key, compare, &lo, &hi);
+
+  if (! (*compare) (key, table[lo]))
+    {
+      return lo;
+    }
+  else
+    return -1;              /* not found */
+}