Back to index

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