r665: Merged the official release 2.0.
[cinelerra_cv.git] / guicast / arraylist.h
blobac7f4d0f0fa0ecc53a8f17216f29b12fa8b04415
1 #ifndef ARRAYLIST_H
2 #define ARRAYLIST_H
4 #include <stdio.h>
6 // designed for lists of track numbers
8 #include <stdio.h>
11 template<class TYPE>
12 class ArrayList
14 public:
15 ArrayList();
16 virtual ~ArrayList();
18 TYPE append(TYPE value);
19 TYPE append();
20 TYPE insert(TYPE value, int number);
22 // allocate
23 void allocate(int total);
24 // remove last pointer from end
25 void remove();
26 // remove last pointer and object from end
27 void remove_object();
28 // remove pointer to object from list
29 void remove(TYPE value);
30 // remove object and pointer to it from list
31 void remove_object(TYPE value);
32 // remove object and pointer to it from list
33 void remove_object_number(int number);
34 // remove pointer to item numbered
35 void remove_number(int number);
36 // Return number of first object matching argument
37 int number_of(TYPE object);
38 void remove_all();
39 // Remove pointer and objects for each array entry
40 void remove_all_objects();
41 TYPE last();
42 void set_array_delete();
44 void sort();
46 TYPE* values;
47 int total;
49 private:
50 int available;
51 int array_delete;
54 template<class TYPE>
55 ArrayList<TYPE>::ArrayList()
57 total = 0;
58 available = 16;
59 array_delete = 0;
60 values = new TYPE[available];
64 template<class TYPE>
65 ArrayList<TYPE>::~ArrayList()
67 // Just remove the pointer
68 delete [] values;
69 values = 0;
72 template<class TYPE>
73 void ArrayList<TYPE>::set_array_delete()
75 array_delete = 1;
79 template<class TYPE>
80 void ArrayList<TYPE>::allocate(int total)
82 if(total > available)
84 available = total;
85 TYPE* newvalues = new TYPE[available];
86 for(int i = 0; i < total; i++) newvalues[i] = values[i];
87 delete [] values;
88 values = newvalues;
92 template<class TYPE>
93 TYPE ArrayList<TYPE>::append(TYPE value) // add to end of list
95 if(total + 1 > available)
97 available *= 2;
98 TYPE* newvalues = new TYPE[available];
99 for(int i = 0; i < total; i++) newvalues[i] = values[i];
100 delete [] values;
101 values = newvalues;
104 values[total++] = value;
105 return value;
108 template<class TYPE>
109 TYPE ArrayList<TYPE>::append() // add to end of list
111 if(total + 1 > available)
113 available *= 2;
114 TYPE* newvalues = new TYPE[available];
115 for(int i = 0; i < total; i++) newvalues[i] = values[i];
116 delete [] values;
117 values = newvalues;
119 total++;
121 return values[total - 1];
124 template<class TYPE>
125 TYPE ArrayList<TYPE>::insert(TYPE value, int number)
127 append(0);
128 for(int i = total - 1; i > number; i--)
130 values[i] = values[i - 1];
132 values[number] = value;
135 template<class TYPE>
136 void ArrayList<TYPE>::remove(TYPE value) // remove value from anywhere in list
138 int in, out;
140 for(in = 0, out = 0; in < total;)
142 if(values[in] != value) values[out++] = values[in++];
143 else
145 in++;
148 total = out;
151 template<class TYPE>
152 TYPE ArrayList<TYPE>::last() // last element in list
154 return values[total - 1];
159 template<class TYPE>
160 void ArrayList<TYPE>::remove_object(TYPE value) // remove value from anywhere in list
162 remove(value);
163 if (array_delete)
164 delete [] value;
165 else
166 delete value;
169 template<class TYPE>
170 void ArrayList<TYPE>::remove_object_number(int number)
172 if(number < total)
174 if (array_delete)
175 delete [] values[number];
176 else
177 delete values[number];
178 remove_number(number);
180 else
181 fprintf(stderr, "ArrayList<TYPE>::remove_object_number: number %d out of range %s.\n", number, total);
185 template<class TYPE>
186 void ArrayList<TYPE>::remove_object() // remove value from anywhere in list
188 if(total)
190 if (array_delete)
191 delete [] values[total - 1];
192 else
193 delete values[total - 1];
194 remove();
196 else
197 fprintf(stderr, "ArrayList<TYPE>::remove_object: array is 0 length.\n");
202 template<class TYPE>
203 void ArrayList<TYPE>::remove()
205 total--;
208 // remove pointer from anywhere in list
209 template<class TYPE>
210 void ArrayList<TYPE>::remove_number(int number)
212 int in, out;
213 for(in = 0, out = 0; in < total;)
215 if(in != number)
216 values[out++] = values[in++];
217 else
218 // need to delete it here
219 in++;
221 total = out;
224 template<class TYPE>
225 void ArrayList<TYPE>::remove_all_objects()
227 //printf("ArrayList<TYPE>::remove_all_objects 1 %d\n", total);
228 for(int i = 0; i < total; i++)
230 if(array_delete)
231 delete [] values[i];
232 else
233 delete values[i];
235 total = 0;
238 template<class TYPE>
239 void ArrayList<TYPE>::remove_all()
241 total = 0;
244 // sort from least to greatest value
245 template<class TYPE>
246 void ArrayList<TYPE>::sort()
248 int result = 1;
249 TYPE temp;
251 while(result)
253 result = 0;
254 for(int i = 0, j = 1; j < total; i++, j++)
256 if(values[j] < values[i])
258 temp = values[i];
259 values[i] = values[j];
260 values[j] = temp;
261 result = 1;
267 template<class TYPE>
268 int ArrayList<TYPE>::number_of(TYPE object)
270 for(int i = 0; i < total; i++)
272 if(values[i] == object) return i;
274 return 0;
278 #endif