00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 # include "incls/_precompiled.incl"
00025 # include "incls/_growableArray.cpp.incl"
00026 
00027 GenericGrowableArray::GenericGrowableArray(int initial_size, bool c_heap) {
00028   len = 0;
00029   max = initial_size;
00030   assert(len <= max, "initial_size too small");
00031   on_C_heap = c_heap;
00032   if (c_heap) {
00033     data = (void**)AllocateHeap(max * sizeof(void*), "bounded list");
00034   } else {
00035     data = NEW_RESOURCE_ARRAY( void*, max);
00036   }
00037 }
00038 
00039 GenericGrowableArray::GenericGrowableArray(int initial_size, int initial_len, void* filler, bool c_heap) {
00040   len = initial_len;
00041   max = initial_size;
00042   assert(len <= max, "initial_len too big");
00043   on_C_heap = c_heap;
00044   if (c_heap) {
00045     data = (void**)AllocateHeap(max * sizeof(void*), "bounded list");
00046   } else {
00047     data = NEW_RESOURCE_ARRAY( void*, max);
00048   }
00049   for (int i = 0; i < len; i++) data[i] = filler;
00050 }
00051 
00052 void GenericGrowableArray::grow(int j) {
00053   void** newData;
00054   if (max == 0) fatal("cannot grow array with max = 0"); 
00055   while (j >= max) max = max*2;
00056   
00057   if (on_C_heap) {
00058     newData = (void**)AllocateHeap(max * sizeof(void*), "bounded list");
00059   } else {
00060     newData = NEW_RESOURCE_ARRAY( void*, max);
00061   }
00062   for (int i = 0; i < len; i++) newData[i] = data[i];
00063   data = newData;
00064 }
00065 
00066 bool GenericGrowableArray::raw_contains(const void* elem) const {
00067   for (int i = 0; i < len; i++) {
00068     if (data[i] == elem) return true;
00069   }
00070   return false;
00071 }
00072 
00073 GenericGrowableArray* GenericGrowableArray::raw_copy() const {
00074   GenericGrowableArray* copy = new GenericGrowableArray(max, len, NULL);
00075   for (int i = 0; i < len; i++) {
00076     copy->data[i] = data[i];
00077   }
00078   return copy;
00079 }
00080 
00081 void GenericGrowableArray::raw_appendAll(GenericGrowableArray* l) {
00082   for (int i = 0; i < l->len; i++) {
00083     raw_at_put_grow(len, l->data[i], NULL);
00084   }
00085 }
00086 
00087 int GenericGrowableArray::raw_find(const void* elem) const {
00088   for (int i = 0; i < len; i++) {
00089     if (data[i] == elem) return i;
00090   }
00091   return -1;
00092 }
00093 
00094 int GenericGrowableArray::raw_find(void* token, growableArrayFindFn f) const  {
00095   for (int i = 0; i < len; i++) {
00096     if (f(token, data[i])) return i;
00097   }
00098   return -1;
00099 }
00100 
00101 void GenericGrowableArray::raw_remove(const void* elem) {
00102   for (int i = 0; i < len; i++) {
00103     if (data[i] == elem) {
00104       for (int j = i + 1; j < len; j++) data[j-1] = data[j];
00105       len--;
00106       return;
00107     }
00108   }
00109   ShouldNotReachHere();
00110 }
00111 
00112 void GenericGrowableArray::raw_apply(voidDoFn f) const {
00113   for (int i = 0; i < len; i++) f(data[i]);
00114 }
00115 
00116 void* GenericGrowableArray::raw_at_grow(int i, const void* fill) {
00117   if (i >= len) {
00118     if (i >= max) grow(i);
00119     for (int j = len; j <= i; j++) data[j] = (void*)fill;
00120     len = i+1;
00121   }
00122   return data[i];
00123 }
00124 
00125 void GenericGrowableArray::raw_at_put_grow(int i, const void* p, const void* fill) {
00126   if (i >= len) {
00127     if (i >= max) grow(i);
00128     for (int j = len; j < i; j++) data[j] = (void*)fill;
00129     len = i+1;
00130   }
00131   data[i] = (void*)p;
00132 }
00133 
00134 void GenericGrowableArray::print() {
00135   print_short();
00136   lprintf(": length %ld (max %ld) { ", len, max);
00137   for (int i = 0; i < len; i++) lprintf("%#lx ", (long)data[i]);
00138   lprintf("}\n");
00139 }
00140 
00141 
00142 void GenericGrowableArray::raw_sort(int f(const void *, const void *)) {
00143   qsort(data, length(), sizeof(void*), f);
00144 }
00145 
00146 void GenericGrowableArray::print_short() { std->print("Growable Array %#lx", this); }