2 (c) 1995--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
4 Distributed under GNU GPL
8 #include "std-vector.hh"
17 functions with loops don't inline
20 template<class T> INLINE void
21 arrcpy (T *dest, T const *src, vsize count)
23 for (vsize i_shadows_local = 0; i_shadows_local < count; i_shadows_local++)
27 urg: wierd egcs-1.1.2-12c (stock LinuxPPC R5) bug on ppc
29 fixed in egcs-1.1.2-12f
30 ftp://dev.linuxppc.org/users/fsirl/R5/RPMS/ppc/
40 template<class T> INLINE void
41 Array<T>::insert (T k, vsize j)
44 assert (j >= 0 && j <= size_);
49 for (vsize i = size_ - 1; i > j; i--)
50 array_[i] = array_[i - 1];
54 template<class T> INLINE void
55 Array<T>::sort (int (*compare) (T const &, T const &), vsize lower, vsize upper)
64 swap (lower, (lower + upper) / 2);
66 for (vsize i = lower +1; i <= upper; i++)
67 if (compare (array_[i], array_[lower]) < 0)
70 sort (compare, lower, last - 1);
71 sort (compare, last + 1, upper);
74 template<class T> INLINE void
78 for (vsize i = 0, j = size_ - 1; i < h; i++, j--)
82 template<class T> INLINE
87 assert (max_ >= size_ && size_ >= 0);
89 assert (max_ >= size_);
95 template<class T> INLINE
97 Array<T>::remove_array ()
106 template<class T> INLINE
108 Array<T>::slice (vsize lower, vsize upper) const
111 assert (lower >= 0 && lower <= upper && upper <= size_);
113 assert (lower <= upper && upper <= size_);
116 vsize s = upper - lower;
118 arrcpy (r.array_, array_ + lower, s);
124 binary_search_bounds (Array<T> const &table,
125 T const &key, int (*compare) (T const &, T const &),
135 cmp = (*lo + *hi) / 2;
137 result = (*compare) (key, table[cmp]);
144 while (*hi - *lo > 1);
148 lookup with binsearch, return array index.
152 binary_search (Array<T> const &table,
153 T const &key, int (*compare) (T const &, T const &),
160 binary_search_bounds (table, key, compare, &lo, &hi);
162 if (! (*compare) (key, table[lo]))