r370: Heroine Virutal's official release 1.2.1
[cinelerra_cv/mob.git] / hvirtual / guicast / arraylist.h
blobee50dd0394a42b4e0a4b25d68ac16bc3d82b2c49
1 #ifndef ARRAYLIST_H
2 #define ARRAYLIST_H
4 // designed for lists of track numbers
6 template<class TYPE>
7 class ArrayList
9 public:
10 ArrayList();
11 virtual ~ArrayList();
13 TYPE append(TYPE value);
14 TYPE append();
15 TYPE insert(TYPE value, int number);
17 // allocate
18 void allocate(int total);
19 // remove last pointer from end
20 void remove();
21 // remove last pointer and object from end
22 void remove_object();
23 // remove pointer to object from list
24 void remove(TYPE value);
25 // remove object and pointer to it from list
26 void remove_object(TYPE value);
27 // remove object and pointer to it from list
28 void remove_object_number(int number);
29 // remove pointer to item numbered
30 void remove_number(int number);
31 // Return number of first object matching argument
32 int number_of(TYPE object);
33 void remove_all();
34 // Remove pointer and objects for each array entry
35 void remove_all_objects();
36 TYPE last();
37 void set_array_delete();
39 void sort();
41 TYPE* values;
42 int total;
44 private:
45 int available;
46 int array_delete;
49 template<class TYPE>
50 ArrayList<TYPE>::ArrayList()
52 total = 0;
53 available = 16;
54 array_delete = 0;
55 values = new TYPE[available];
59 template<class TYPE>
60 ArrayList<TYPE>::~ArrayList()
62 // Just remove the pointer
63 delete [] values;
64 values = 0;
67 template<class TYPE>
68 void ArrayList<TYPE>::set_array_delete()
70 array_delete = 1;
74 template<class TYPE>
75 void ArrayList<TYPE>::allocate(int total)
77 if(total > available)
79 available = total;
80 TYPE* newvalues = new TYPE[available];
81 for(int i = 0; i < total; i++) newvalues[i] = values[i];
82 delete [] values;
83 values = newvalues;
87 template<class TYPE>
88 TYPE ArrayList<TYPE>::append(TYPE value) // add to end of list
90 if(total + 1 > available)
92 available *= 2;
93 TYPE* newvalues = new TYPE[available];
94 for(int i = 0; i < total; i++) newvalues[i] = values[i];
95 delete [] values;
96 values = newvalues;
99 values[total++] = value;
100 return value;
103 template<class TYPE>
104 TYPE ArrayList<TYPE>::append() // add to end of list
106 if(total + 1 > available)
108 available *= 2;
109 TYPE* newvalues = new TYPE[available];
110 for(int i = 0; i < total; i++) newvalues[i] = values[i];
111 delete [] values;
112 values = newvalues;
114 total++;
116 return values[total - 1];
119 template<class TYPE>
120 TYPE ArrayList<TYPE>::insert(TYPE value, int number)
122 append(0);
123 for(int i = total - 1; i > number; i--)
125 values[i] = values[i - 1];
127 values[number] = value;
130 template<class TYPE>
131 void ArrayList<TYPE>::remove(TYPE value) // remove value from anywhere in list
133 int in, out;
135 for(in = 0, out = 0; in < total;)
137 if(values[in] != value) values[out++] = values[in++];
138 else
140 in++;
143 total = out;
146 template<class TYPE>
147 TYPE ArrayList<TYPE>::last() // last element in list
149 return values[total - 1];
154 template<class TYPE>
155 void ArrayList<TYPE>::remove_object(TYPE value) // remove value from anywhere in list
157 remove(value);
158 if (array_delete)
159 delete [] value;
160 else
161 delete value;
164 template<class TYPE>
165 void ArrayList<TYPE>::remove_object_number(int number)
167 if(number < total)
169 if (array_delete)
170 delete [] values[number];
171 else
172 delete values[number];
173 remove_number(number);
175 else
176 fprintf(stderr, "ArrayList<TYPE>::remove_object_number: number %d out of range %s.\n", number, total);
180 template<class TYPE>
181 void ArrayList<TYPE>::remove_object() // remove value from anywhere in list
183 if(total)
185 if (array_delete)
186 delete [] values[total - 1];
187 else
188 delete values[total - 1];
189 remove();
191 else
192 fprintf(stderr, "ArrayList<TYPE>::remove_object: array is 0 length.\n");
197 template<class TYPE>
198 void ArrayList<TYPE>::remove()
200 total--;
203 // remove pointer from anywhere in list
204 template<class TYPE>
205 void ArrayList<TYPE>::remove_number(int number)
207 int in, out;
208 for(in = 0, out = 0; in < total;)
210 if(in != number)
211 values[out++] = values[in++];
212 else
213 // need to delete it here
214 in++;
216 total = out;
219 template<class TYPE>
220 void ArrayList<TYPE>::remove_all_objects()
222 //printf("ArrayList<TYPE>::remove_all_objects 1 %d\n", total);
223 for(int i = 0; i < total; i++)
225 if(array_delete)
226 delete [] values[i];
227 else
228 delete values[i];
230 total = 0;
233 template<class TYPE>
234 void ArrayList<TYPE>::remove_all()
236 total = 0;
239 // sort from least to greatest value
240 template<class TYPE>
241 void ArrayList<TYPE>::sort()
243 int result = 1;
244 TYPE temp;
246 while(result)
248 result = 0;
249 for(int i = 0, j = 1; j < total; i++, j++)
251 if(values[j] < values[i])
253 temp = values[i];
254 values[i] = values[j];
255 values[j] = temp;
256 result = 1;
262 template<class TYPE>
263 int ArrayList<TYPE>::number_of(TYPE object)
265 for(int i = 0; i < total; i++)
267 if(values[i] == object) return i;
269 return 0;
273 #endif