]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/parray.hh
release: 0.1.1
[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 unordered_substitute(T* old, T * new_l)
43     {
44         int i;
45         while ((i = find_i(old)) >=0) 
46             if (new_l)
47                 elem(i) =new_l;
48             else {
49                 unordered_del( i );
50             }
51     
52     }
53     void default_sort() {
54         sort(default_compare);
55     }
56     void uniq() {
57         Link_array<T> l_arr;
58         for (int i=0; i < size(); i++) 
59             if (!i || elem(i-1) != elem(i))
60                 l_arr.push(elem(i)); 
61         *this = l_arr;
62     }
63
64     int find_i (T const * t) const {
65         for (int i=0; i < size(); i++)
66             if (elem(i) == t)
67                 return i;
68         return -1;
69     }
70     T *find_l(T const *t)const
71     {
72         int i = find_i(t);
73         if (i >= 0)
74             return elem(i);
75         else
76             return 0;
77     }
78 };
79
80 #endif // PARRAY_HH