Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

GList.cc

Go to the documentation of this file.
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 }

Generated on Sat Nov 5 16:18:11 2005 for OPIE by  doxygen 1.4.2