2 parray.hh -- declare Pointer_array
4 source file of the Flower Library
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
22 class Link_array : private Array<void *>
24 static default_compare (T *const& p1, T *const&p2) {
25 /* can't do p1 -p2, since T might be an incomplete type */
32 Link_array (Array<void*> v)
39 Link_array (Link_array<T> const &src)
48 T *&elem_ref (int i) const
50 return (T*&) Array<void*>::elem_ref (i);
54 T* &operator[] (int i)
56 return (T*&) Array<void*>::elem_ref (i);
59 T *const operator[] (int i) const
61 return (T *const) Array<void*>::elem (i);
65 return (T*) Array<void*>::pop ();
67 void insert (T *t, int i)
69 Array<void*>::insert (t, i);
73 Array<void*>::push (t);
76 T* top (int j=0) const
78 return (T*) Array<void*>::top (j);
82 return (T*&) Array<void*>::top (i);
84 void substitute (T *old, T*new_l)
87 while ((i = find_i (old)) >=0)
93 void unordered_substitute (T* old, T * new_l)
96 while ((i = find_i (old)) >=0)
104 void default_sort() {
105 sort (default_compare);
108 void sort (int (*compare)(T *const&,T *const&),
109 int lower = -1, int upper = -1);
113 for (int i=0; i < size(); i++)
114 if (!i || elem (i-1) != elem (i))
115 l_arr.push (elem (i));
119 Array<void*>::unordered_del;
122 Array<void*>::set_size;
124 Array<void*>::reverse;
125 Array<void*>::tighten_maxsize;
128 return (T*) Array<void*>::get (i);
133 return Array<void*>::slice (l,u);
135 void concat (Link_array<T> const &a2)
137 Array<void*>::concat (a2);
139 int find_i (T const * t) const {
140 for (int i=0; i < size(); i++)
145 T *find_l (T const *t) const
156 template<class T, class V>
158 typecast_array (Link_array<V> const &a, T * /* dummy */ )
161 for (int i=a.size (); i-- ; )
162 ret.push (dynamic_cast<T*> (a[i])); // ugh?
168 template<class T> inline void
169 Link_array<T>::sort (int (*compare)(T *const&,T *const&),
170 int lower = -1, int upper = -1)
179 swap (lower, (lower+upper)/2);
181 for (int i= lower +1; i <= upper; i++)
182 if (compare (elem (i), elem(lower)) < 0)
185 sort (compare, lower, last-1);
186 sort (compare, last+1, upper);