2 parray.hh -- declare Pointer_array
4 source file of the Flower Library
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
12 #include "std-vector.hh"
21 class Link_array : private Array<void *>
24 Link_array (Array<void *> v)
34 T *const &back() const
36 return (T * const &) Array<void *>::back();
41 return (T *&) Array<void *>::back ();
46 Array<void *>::unordered_del;
49 Array<void *>::resize;
51 Array<void *>::reverse;
52 Array<void *>::pop_back;
53 Array<void *>::tighten_maxsize;
55 static int default_compare (T *const &p1, T *const &p2)
57 /* can't do p1 -p2, since T might be an incomplete type */
64 Link_array (T *const *tp, int n)
65 : Array<void *> ((void **)tp, n)
69 Link_array (Link_array<T> const &src)
78 T *&elem_ref (int i) const
80 return (T *&) Array<void *>::elem_ref (i);
84 T *&operator [] (int i)
86 return (T *&) Array<void *>::elem_ref (i);
89 T *const operator [] (int i) const
91 return (T *const) Array<void *>::elem (i);
95 T* t = (T *) Array<void *>::back ();
99 void insert (T *t, vsize i)
101 Array<void *>::insert (t, i);
103 void push_back (T *t)
105 Array<void *>::push_back (t);
108 /// return last entry
111 return (T *) Array<void *>::top (j);
115 return (T *&) Array<void *>::top (i);
118 void substitute (T *old, T *new_p)
121 while ((i = find_index (old)) >= 0)
123 elem_ref (i) = new_p;
127 void unordered_substitute (T *old, T *new_p)
130 while ((i = find_index (old)) >= 0)
132 elem_ref (i) = new_p;
138 sort (default_compare);
141 void sort (int (*compare) (T *const &, T *const &),
142 int lower = -1, int upper = -1);
147 for (vsize i = 0; i < size (); i++)
148 if (!i || elem (i - 1) != elem (i))
149 ls.push_back (elem (i));
153 T *& boundary (int d, int i)
161 T *boundary (int d, int i)const
170 T ** accesses () const
172 return (T **) Array<void *>::accesses ();
176 return (T *) Array<void *>::get (i);
179 slice (int l, int u) const
181 return Array<void *>::slice (l, u);
183 void concat (Link_array<T> const &a2)
185 Array<void *>::concat (a2);
187 int find_index (T const *t) const
189 for (vsize i = 0; i < size (); i++)
194 T *find (T const *t) const
196 int i = find_index (t);
204 template<class T, class V>
206 typecasts (Link_array<V> const &a, T * /* dummy */)
209 for (vsize i = a.size (); i--;)
210 ret.push_back (dynamic_cast<T *> (a[i])); // ugh?
214 template<class T> inline void
215 Link_array<T>::sort (int (*compare) (T *const &, T *const &), int lower, int upper)
224 swap (lower, (lower + upper) / 2);
226 for (int i = lower +1; i <= upper; i++)
227 if (compare (elem (i), elem (lower)) < 0)
230 sort (compare, lower, last - 1);
231 sort (compare, last + 1, upper);
236 junk_pointers (Link_array<T> &a)
238 for (vsize i = 0; i < a.size (); i++)
244 lookup with binsearch, return tokencode.
248 binsearch (Array<T> const &arr, T t, int (*compare) (T const &, T const &))
253 int hi = arr.size ();
260 result = compare (t, arr[cmp]);
269 if (!compare (t, arr[lo]))
272 return -1; /* not found */
277 binsearch_links (Link_array<T> const &arr, T *t,
278 int (*compare) (T *const &, T *const &))
283 int hi = arr.size ();
293 result = (*compare) (t, arr[cmp]);
302 if (!compare (t, arr[lo]))
305 return -1; /* not found */
310 binary_search_bounds (Link_array<T> const &table,
311 T const *key, int (*compare) (T *const &, T *const &),
321 cmp = (*lo + *hi) / 2;
323 result = (*compare) ((T *) key, table[cmp]);
330 while (*hi - *lo > 1);