]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/parray.hh
release: 0.0.65
[lilypond.git] / flower / include / parray.hh
1 /*
2   parray.hh -- declare Pointer_array
3
4   source file of the Flower Library
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
10 #ifndef PARRAY_HH
11 #define PARRAY_HH
12
13 #include "varray.hh"
14
15 /**
16   an array of pointers.
17
18   TODO
19   should init to 0. Derive from Array<void*>? 
20  */
21 template<class T>
22 class Link_array : public Array<T*>
23 {
24     static default_compare(T *const& p1, T  *const&p2) {
25         /* can't do p1 -p2, since T might be an incomplete type */
26         if (p1 < p2)
27             return -1 ;
28         if (p2 < p1)
29             return 1;
30         return 0;
31     }
32 public:
33     void substitute(T *old, T*new_l)
34     {
35         int i;
36         while ((i = find_i(old)) >=0) 
37             if (new_l)
38                 elem(i) =new_l;
39             else
40                 del(i);
41     }
42     void default_sort() {
43         sort(default_compare);
44     }
45     void uniq() {
46         Link_array<T> l_arr;
47         for (int i=0; i < size(); i++) 
48             if (!i || elem(i-1) != elem(i))
49                 l_arr.push(elem(i)); 
50         *this = l_arr;
51     }
52
53     int find_i (T const * t) const {
54         for (int i=0; i < size(); i++)
55             if (elem(i) == t)
56                 return i;
57         return -1;
58     }
59     T *find_l(T const *t)const
60     {
61         int i = find_i(t);
62         if (i >= 0)
63             return elem(i);
64         else
65             return 0;
66     }
67 };
68
69 #endif // PARRAY_HH