home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / DataStructures / GenArray / GenArray.c
Encoding:
C/C++ Source or Header  |  1995-02-12  |  1.4 KB  |  82 lines

  1.  
  2. #include <classes/DataStructures/GenArray.h>
  3.  
  4. #include <string.h>
  5.  
  6. #define DEFAULTSIZE 16
  7. #define FACTOR 2
  8.  
  9. gen_array::gen_array(ULONG es, ULONG s)
  10. {
  11.     if (!s)
  12.         s = DEFAULTSIZE;
  13.     v = new UBYTE[s*es];
  14.     if (!v)
  15.         throw MemoryX(s*es);
  16.     element_size = es;
  17.     size = s;
  18. }
  19.  
  20. gen_array::gen_array(const gen_array &c)
  21. {
  22.     element_size = c.element_size;
  23.     size = c.size;
  24.     v = new UBYTE[size*element_size];
  25.     if (!v)
  26.         throw MemoryX(size*element_size);
  27.     memcpy(v,c.v,size*element_size);
  28. }
  29.  
  30. gen_array &gen_array::operator= (const gen_array &c)
  31. {
  32.     if (this != &c)
  33.     {
  34.         delete [] v;
  35.         element_size = c.element_size;
  36.         size = c.size;
  37.         v = new UBYTE[size*element_size];
  38.         if (!v)
  39.             throw MemoryX(size*element_size);
  40.         memcpy(v,c.v,size*element_size);
  41.     };
  42.     return *this;
  43. }
  44.  
  45. gen_array::~gen_array()
  46. {
  47.     delete [] v;
  48. }
  49.  
  50. void & gen_array::operator [] (ULONG i)
  51. {
  52.     if (i>=size)
  53.         extend(i);
  54.     return (VOID &) *(v+(i*element_size));
  55. }
  56.  
  57. VOID gen_array::extend(ULONG i)
  58. {
  59.     if (i >= FACTOR*size)
  60.     {
  61.         UBYTE *w = new UBYTE[(i+1)*element_size];
  62.         if (!w)
  63.             throw MemoryX((i+1)*element_size);
  64.         memcpy(w,v,size*element_size);
  65.         delete [] v;
  66.         v = w;
  67.         size = i+1;
  68.     }
  69.     else {
  70.         UBYTE *w = new UBYTE[size*FACTOR*element_size];
  71.         if (!w)
  72.             throw MemoryX(size*FACTOR*element_size);
  73.         memcpy(w,v,size*element_size);
  74.         delete [] v;
  75.         v = w;
  76.         size = size*FACTOR;
  77.     };
  78. }
  79.  
  80. // *************************************************************
  81.  
  82.