added ImmortalThread
[org.ibex.util.git] / src / org / ibex / util / Vec.java
1 // Copyright 2000-2005 the Contributors, as shown in the revision logs.
2 // Licensed under the Apache Public Source License 2.0 ("the License").
3 // You may not use this file except in compliance with the License.
4
5 package org.ibex.util;
6 import java.io.*;
7
8 /** 
9  *  An unsynchronized Vector implementation; same semantics as
10  *  java.util.Vector. Useful for JDK1.1 platforms that don't have
11  *  java.util.ArrayList.
12  *
13  *  May contain nulls.
14  *
15  *  @see java.util.Vector
16  */
17 public final class Vec implements Serializable, Cloneable {
18     
19     private Object[] store;
20     private int size = 0;
21     
22     public Vec() { this(10); }
23     public Vec(int i) { store = new Object[i]; }
24     public Vec(int i, Object[] store) { size = i; this.store = store; }
25     public Vec(Vec old) {
26         store = new Object[old.store.length];
27         System.arraycopy(old.store, 0, store, 0, old.store.length);
28         this.size = old.size;
29     }
30
31     public Object clone() { return new Vec(this); }
32     private void grow() { grow(store.length * 2); }
33     private void grow(int newsize) {
34         Object[] newstore = new Object[newsize];
35         System.arraycopy(store, 0, newstore, 0, size);
36         store = newstore;
37     }
38
39     public void removeAllElements() {
40         for(int i=0; i<size; i++) store[i] = null;
41         size = 0;
42     }
43
44     public void toArray(Object[] o) {
45         for(int i=0; i<size; i++)
46             o[i] = store[i];
47     }
48     
49     public int indexOf(Object o) {
50         for(int i=0; i<size; i++)
51             if (o == null ? store[i] == null : store[i].equals(o)) return i;
52         
53         return -1;
54     }
55     
56     public void add(Object o) { addElement(o); }
57     public void addElement(Object o) {
58         if (size >= store.length - 1) grow();
59         store[size++] = o;
60     }
61
62     public Object peek() {
63         return lastElement();
64     }
65
66     public Object get(int i) { return elementAt(i); }
67     public Object elementAt(int i) {
68         return store[i];
69     }
70     
71     public Object lastElement() {
72         if (size == 0) return null;
73         return store[size - 1];
74     }
75
76     public void push(Object o) { addElement(o); }
77     public Object pop() {
78         Object ret = lastElement();
79         if (size > 0) store[--size] = null;
80         return ret;
81     }
82
83     public int size() { return size; }
84
85     public void setSize(int newSize) {
86         if (newSize < 0) throw new RuntimeException("tried to set size to negative value");
87         if (newSize > store.length) grow(newSize * 2);
88         if (newSize < size)
89             for(int i=newSize; i<size; i++)
90                 store[i] = null;
91         size = newSize;
92     }
93
94     public Object[] copyInto(Object[] out) {
95         for(int i=0; i<size; i++)
96             out[i] = store[i];
97         return out;
98     }
99
100     public void fromArray(Object[] in) {
101         setSize(in.length);
102         for(int i=0; i<size; i++)
103             store[i] = in[i];
104     }
105
106     public void remove(int i) { removeElementAt(i); }
107     public void removeElementAt(int i) {
108         if (i >= size || i < 0) throw new RuntimeException("tried to remove an element outside the vector's limits");
109         for(int j=i; j<size - 1; j++)
110             store[j] = store[j + 1];
111         setSize(size - 1);
112     }
113
114     public void setElementAt(Object o, int i) {
115         if (i >= size) setSize(i);
116         store[i] = o;
117     }
118
119     public void removeElement(Object o) {
120         int idx = indexOf(o);
121         if (idx != -1) removeElementAt(idx);
122     }
123
124     public void insertElementAt(Object o, int at) {
125         if (size == store.length) grow();
126         for(int i=size; i>at; i--)
127             store[i] = store[i-1];
128         store[at] = o;
129         size++;
130     }
131
132     public interface CompareFunc {
133         public int compare(Object a, Object b);
134     }
135
136     public void sort(CompareFunc c) {
137         sort(this, null, c, 0, size-1);
138     }
139
140     public static void sort(Vec a, Vec b, CompareFunc c) {
141         if (b != null && a.size != b.size) throw new IllegalArgumentException("Vec a and b must be of equal size");
142         sort(a, b, c, 0, a.size-1);
143     }
144
145     private static final void sort(Vec a, Vec b, CompareFunc c, int start, int end) {
146         Object tmpa, tmpb = null;
147         if(start >= end) return;
148         if(end-start <= 6) {
149             for(int i=start+1;i<=end;i++) {
150                 tmpa = a.store[i];
151                 if (b != null) tmpb = b.store[i];
152                 int j;
153                 for(j=i-1;j>=start;j--) {
154                     if(c.compare(a.store[j],tmpa) <= 0) break;
155                     a.store[j+1] = a.store[j];
156                     if (b != null) b.store[j+1] = b.store[j];
157                 }
158                 a.store[j+1] = tmpa;
159                 if (b != null) b.store[j+1] = tmpb;
160             }
161             return;
162         }
163
164         Object pivot = a.store[end];
165         int lo = start - 1;
166         int hi = end;
167
168         do {
169             while(c.compare(a.store[++lo],pivot) < 0) { }
170             while((hi > lo) && c.compare(a.store[--hi],pivot) > 0) { }
171             swap(a, lo,hi);
172             if (b != null) swap(b, lo,hi);
173         } while(lo < hi);
174
175         swap(a, lo,end);
176         if (b != null) swap(b, lo,end);
177
178         sort(a, b, c, start, lo-1);
179         sort(a, b, c, lo+1, end);
180     }
181
182     private static final void swap(Vec vec, int a, int b) {
183         if(a != b) {
184             Object tmp = vec.store[a];
185             vec.store[a] = vec.store[b];
186             vec.store[b] = tmp;
187         }
188     }
189
190     public static final void sortInts(int[] a, int start, int end) {
191         int tmpa;
192         if(start >= end) return;
193         if(end-start <= 6) {
194             for(int i=start+1;i<=end;i++) {
195                 tmpa = a[i];
196                 int j;
197                 for(j=i-1;j>=start;j--) {
198                     if(a[j] <= tmpa) break;
199                     a[j+1] = a[j];
200                 }
201                 a[j+1] = tmpa;
202             }
203             return;
204         }
205         int pivot = a[end];
206         int lo = start - 1;
207         int hi = end;
208         do {
209             while(a[++lo] < pivot) { }
210             while((hi > lo) && a[--hi] > pivot) { }
211             swapInts(a, lo, hi);
212         } while(lo < hi);
213         swapInts(a, lo, end);
214         sortInts(a, start, lo-1);
215         sortInts(a, lo+1, end);
216     }
217     private static final void swapInts(int[] vec, int a, int b) {
218         if(a != b) {
219             int tmp = vec[a];
220             vec[a] = vec[b];
221             vec[b] = tmp;
222         }
223     }
224
225
226
227     // just a cut-and-paste copy of Vec with int storage
228     public static class Int {
229         private int[] store;
230         private int size = 0;
231     
232         public Int() { this(10); }
233         public Int(int i) { store = new int[i]; }
234         public Int(int i, int[] store) { size = i; this.store = store; }
235     
236         private void grow() { grow(store.length * 2); }
237         private void grow(int newsize) {
238             int[] newstore = new int[newsize];
239             System.arraycopy(store, 0, newstore, 0, size);
240             store = newstore;
241         }
242
243         public void removeAllElements() {
244             for(int i=0; i<size; i++) store[i] = 0;
245             size = 0;
246         }
247
248         public void toArray(int[] o) {
249             for(int i=0; i<size; i++)
250                 o[i] = store[i];
251         }
252     
253         public int[] dump() { int[] o = new int[size]; toArray(o); return o; }
254     
255         public int indexOf(int o) {
256             for(int i=0; i<size; i++)
257                 if (o == store[i]) return i;
258         
259             return -1;
260         }
261     
262         public void addElement(int o) {
263             if (size >= store.length - 1) grow();
264             store[size++] = o;
265         }
266
267         public int peek() {
268             return lastElement();
269         }
270
271         public int elementAt(int i) {
272             return store[i];
273         }
274     
275         public int lastElement() {
276             if (size == 0) return 0;
277             return store[size - 1];
278         }
279
280         public void push(int o) { addElement(o); }
281         public int pop() {
282             int ret = lastElement();
283             if (size > 0) store[size--] = 0;
284             return ret;
285         }
286
287         public int size() { return size; }
288
289         public void setSize(int newSize) {
290             if (newSize < 0) throw new RuntimeException("tried to set size to negative value");
291             if (newSize > store.length) grow(newSize * 2);
292             if (newSize < size)
293                 for(int i=newSize; i<size; i++)
294                     store[i] = 0;
295             size = newSize;
296         }
297
298         public int[] copyInto(int[] out) {
299             for(int i=0; i<size; i++)
300                 out[i] = store[i];
301             return out;
302         }
303
304         public void fromArray(int[] in) {
305             setSize(in.length);
306             for(int i=0; i<size; i++)
307                 store[i] = in[i];
308         }
309
310         public void removeElementAt(int i) {
311             if (i >= size || i < 0) throw new RuntimeException("tried to remove an element outside the vector's limits");
312             for(int j=i; j<size - 1; j++)
313                 store[j] = store[j + 1];
314             setSize(size - 1);
315         }
316
317         public void setElementAt(int o, int i) {
318             if (i >= size) setSize(i);
319             store[i] = o;
320         }
321
322         public void removeElement(int o) {
323             int idx = indexOf(o);
324             if (idx != -1) removeElementAt(idx);
325         }
326
327         public void insertElementAt(int o, int at) {
328             if (size == store.length) grow();
329             for(int i=size; i>at; i--)
330                 store[i] = store[i-1];
331             store[at] = o;
332             size++;
333         }
334
335         public void sort() { sort(this, null, 0, size-1); }
336
337         public static void sort(Vec.Int a, Vec.Int b) {
338             if (b != null && a.size != b.size) throw new IllegalArgumentException("Vec.Int a and b must be of equal size");
339             sort(a, b, 0, a.size-1);
340         }
341
342         private static final void sort(Vec.Int a, Vec.Int b, int start, int end) {
343             int tmpa, tmpb = 0;
344             if(start >= end) return;
345             if(end-start <= 6) {
346                 for(int i=start+1;i<=end;i++) {
347                     tmpa = a.store[i];
348                     if (b != null) tmpb = b.store[i];
349                     int j;
350                     for(j=i-1;j>=start;j--) {
351                         if((a.store[j]-tmpa) <= 0) break;
352                         a.store[j+1] = a.store[j];
353                         if (b != null) b.store[j+1] = b.store[j];
354                     }
355                     a.store[j+1] = tmpa;
356                     if (b != null) b.store[j+1] = tmpb;
357                 }
358                 return;
359             }
360
361             int pivot = a.store[end];
362             int lo = start - 1;
363             int hi = end;
364
365             do {
366                 while((a.store[++lo]-pivot) < 0) { }
367                 while((hi > lo) && (a.store[--hi]-pivot) > 0) { }
368                 swap(a, lo,hi);
369                 if (b != null) swap(b, lo,hi);
370             } while(lo < hi);
371
372             swap(a, lo,end);
373             if (b != null) swap(b, lo,end);
374
375             sort(a, b, start, lo-1);
376             sort(a, b, lo+1, end);
377         }
378
379         private static final void swap(Vec.Int vec, int a, int b) {
380             if(a != b) {
381                 int tmp = vec.store[a];
382                 vec.store[a] = vec.store[b];
383                 vec.store[b] = tmp;
384             }
385         }
386
387         public static final void sortInts(int[] a, int start, int end) {
388             int tmpa;
389             if(start >= end) return;
390             if(end-start <= 6) {
391                 for(int i=start+1;i<=end;i++) {
392                     tmpa = a[i];
393                     int j;
394                     for(j=i-1;j>=start;j--) {
395                         if(a[j] <= tmpa) break;
396                         a[j+1] = a[j];
397                     }
398                     a[j+1] = tmpa;
399                 }
400                 return;
401             }
402
403             int pivot = a[end];
404             int lo = start - 1;
405             int hi = end;
406
407             do {
408                 while(a[++lo] < pivot) { }
409                 while((hi > lo) && a[--hi] > pivot) { }
410                 swapInts(a, lo, hi);
411             } while(lo < hi);
412             swapInts(a, lo, end);
413             sortInts(a, start, lo-1);
414             sortInts(a, lo+1, end);
415         }
416
417         private static final void swapInts(int[] vec, int a, int b) {
418             if(a != b) {
419                 int tmp = vec[a];
420                 vec[a] = vec[b];
421                 vec[b] = tmp;
422             }
423         }
424     }
425
426
427
428     public static final void sortFloats(float[] a, int start, int end) {
429         float tmpa;
430         if(start >= end) return;
431         if(end-start <= 6) {
432             for(int i=start+1;i<=end;i++) {
433                 tmpa = a[i];
434                 int j;
435                 for(j=i-1;j>=start;j--) {
436                     if(a[j] <= tmpa) break;
437                     a[j+1] = a[j];
438                 }
439                 a[j+1] = tmpa;
440             }
441             return;
442         }
443         float pivot = a[end];
444         int lo = start - 1;
445         int hi = end;
446         do {
447             while(a[++lo] < pivot) { }
448             while((hi > lo) && a[--hi] > pivot) { }
449             swapFloats(a, lo, hi);
450         } while(lo < hi);
451         swapFloats(a, lo, end);
452         sortFloats(a, start, lo-1);
453         sortFloats(a, lo+1, end);
454     }
455     private static final void swapFloats(float[] vec, int a, int b) {
456         if(a != b) {
457             float tmp = vec[a];
458             vec[a] = vec[b];
459             vec[b] = tmp;
460         }
461     }
462 }