00001 //======================================================================== 00002 // 00003 // GList.cc 00004 // 00005 // Copyright 2001 Derek B. Noonburg 00006 // 00007 //======================================================================== 00008 00009 #ifdef __GNUC__ 00010 #pragma implementation 00011 #endif 00012 00013 #include <aconf.h> 00014 #include <string.h> 00015 #include "gmem.h" 00016 #include "GList.h" 00017 00018 //------------------------------------------------------------------------ 00019 // GList 00020 //------------------------------------------------------------------------ 00021 00022 GList::GList() { 00023 size = 8; 00024 data = (void **)gmalloc(size * sizeof(void*)); 00025 length = 0; 00026 inc = 0; 00027 } 00028 00029 GList::GList(int sizeA) { 00030 size = sizeA; 00031 data = (void **)gmalloc(size * sizeof(void*)); 00032 length = 0; 00033 inc = 0; 00034 } 00035 00036 GList::~GList() { 00037 gfree(data); 00038 } 00039 00040 void GList::append(void *p) { 00041 if (length >= size) { 00042 expand(); 00043 } 00044 data[length++] = p; 00045 } 00046 00047 void GList::append(GList *list) { 00048 int i; 00049 00050 while (length + list->length > size) { 00051 expand(); 00052 } 00053 for (i = 0; i < list->length; ++i) { 00054 data[length++] = list->data[i]; 00055 } 00056 } 00057 00058 void GList::insert(int i, void *p) { 00059 if (length >= size) { 00060 expand(); 00061 } 00062 if (i < length) { 00063 memmove(data+i+1, data+i, (length - i) * sizeof(void *)); 00064 } 00065 data[i] = p; 00066 ++length; 00067 } 00068 00069 void *GList::del(int i) { 00070 void *p; 00071 00072 p = data[i]; 00073 if (i < length - 1) { 00074 memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *)); 00075 } 00076 --length; 00077 if (size - length >= ((inc > 0) ? inc : size/2)) { 00078 shrink(); 00079 } 00080 return p; 00081 } 00082 00083 void GList::expand() { 00084 size += (inc > 0) ? inc : size; 00085 data = (void **)grealloc(data, size * sizeof(void*)); 00086 } 00087 00088 void GList::shrink() { 00089 size -= (inc > 0) ? inc : size/2; 00090 data = (void **)grealloc(data, size * sizeof(void*)); 00091 }
1.4.2