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 *> const &v)
34 T *const &back() const
36 return (T * const &) Array<void *>::back();
41 return (T *&) Array<void *>::back ();
48 Array<void *>::resize;
51 Array<void *>::pop_back;
55 Array<void *>::unordered_del;
56 Array<void *>::tighten_maxsize;
58 static int default_compare (T *const &p1, T *const &p2)
60 /* can't do p1 -p2, since T might be an incomplete type */
67 Link_array (T *const *tp, int n)
68 : Array<void *> ((void **)tp, n)
72 Link_array (Link_array<T> const &src)
79 return (T *) Array<void *>::at (i);
81 T const *at (int i) const
83 return (T const *) Array<void *>::at (i);
87 T *&operator [] (int i)
89 return (T *&) Array<void *>::at (i);
92 T *const operator [] (int i) const
94 return (T *const) Array<void *>::at (i);
98 T* t = (T *) Array<void *>::back ();
102 void insert (iterator b, T *t)
104 Array<void *>::insert (b, t);
106 void insert (iterator pos, const_iterator b, const_iterator e)
108 Array<void *>::insert (pos, b, e);
110 void push_back (T *t)
112 Array<void *>::push_back (t);
117 return (*this)[size_ - j - 1];
119 T *& top (vsize j) const
121 return (*this)[size_ - j - 1];
124 void substitute (T *old, T *new_p)
127 while ((i = find_index (old)) >= 0)
131 erase (begin () + i);
133 void unordered_substitute (T *old, T *new_p)
136 while ((i = find_index (old)) >= 0)
144 sort (default_compare);
148 void sort (int (*compare) (T *const &, T *const &),
149 int lower = -1, int upper = -1);
154 for (vsize i = 0; i < size (); i++)
155 if (!i || at (i - 1) != at (i))
156 ls.push_back (at (i));
160 T *& boundary (int d, int i)
168 T *boundary (int d, int i)const
177 T ** accesses () const
179 return (T **) Array<void *>::accesses ();
182 remove i-th element, and return it.
187 Array<void*>::erase (Array<void*>::begin () + i);
191 slice (int l, int u) const
193 return Array<void *>::Array (begin () + l, begin () + u);
195 void concat (Link_array<T> const &a2)
197 Array<void *>::insert (end (), a2.begin (), a2.end ());
199 int find_index (T const *t) const
201 for (vsize i = 0; i < size (); i++)
206 T const *find (T const *t) const
208 int i = find_index (t);
215 void swap (vsize i, vsize j)
218 (*this)[i] = (*this)[j];
224 vsize h = size () / 2;
225 for (vsize i = 0, j = size () - 1; i < h; i++, j--)
230 template<class T, class V>
232 typecasts (Link_array<V> const &a, T * /* dummy */)
235 for (vsize i = a.size (); i--;)
236 ret.push_back (dynamic_cast<T *> (a[i])); // ugh?
240 template<class T> inline void
241 Link_array<T>::sort (int (*compare) (T *const &, T *const &), int lower, int upper)
250 swap (lower, (lower + upper) / 2);
252 for (int i = lower +1; i <= upper; i++)
253 if (compare (at (i), at (lower)) < 0)
256 sort (compare, lower, last - 1);
257 sort (compare, last + 1, upper);
262 junk_pointers (Link_array<T> &a)
264 for (vsize i = 0; i < a.size (); i++)
270 lookup with binsearch, return tokencode.
274 binsearch (Array<T> const &arr, T t, int (*compare) (T const &, T const &))
279 int hi = arr.size ();
286 result = compare (t, arr[cmp]);
295 if (!compare (t, arr[lo]))
303 binsearch_links (Link_array<T> const &arr, T *t,
304 int (*compare) (T *const &, T *const &))
309 int hi = arr.size ();
319 result = (*compare) (t, arr[cmp]);
328 if (!compare (t, arr[lo]))
336 binary_search_bounds (Link_array<T> const &table,
337 T const *key, int (*compare) (T *const &, T *const &),
347 cmp = (*lo + *hi) / 2;
349 result = (*compare) ((T *) key, table[cmp]);
356 while (*hi - *lo > 1);