home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume19 / wacco / part01 / darray.h < prev    next >
C/C++ Source or Header  |  1991-05-19  |  2KB  |  70 lines

  1. // Copyright (c) 1991 by Parag Patel.  All Rights Reserved.
  2. // $Header: darray.h,v 1.3 91/02/22 16:05:04 hmgr Exp $
  3.  
  4. // Handle simple dynamic arrays of arbitrary type and range.
  5. // They are automatically grown to fit any array-like reference.
  6. // by Parag Patel
  7.  
  8.  
  9. // this is used to create an ARRAY of a TYPE
  10. #define declare_array(ARRAY, TYPE) \
  11. class ARRAY \
  12. { \
  13.     long len; \
  14.     long max; \
  15.     TYPE *arr; \
  16.     TYPE &bumpsize(long); \
  17. public: \
  18.     ARRAY() { arr = 0; max = len = 0; } \
  19.     ARRAY(long siz) \
  20.         { arr = 0; max = len = 0; if (siz > 0) bumpsize(siz-1); } \
  21.     ARRAY(const ARRAY &); \
  22.     ~ARRAY() { delete[max] arr; } \
  23.     ARRAY &operator=(const ARRAY &); \
  24.     long size() const { return len; } \
  25.     void reset(long l = 0) { bumpsize(l); len = l; } \
  26.     TYPE &operator[](long e) \
  27.         { if (e < len) return arr[e]; else return bumpsize(e); } \
  28.     TYPE *getarr() { return arr; } \
  29. };
  30.  
  31.  
  32. // this implements an ARRAY of a TYPE
  33. #define implement_array(ARRAY, TYPE) \
  34. TYPE &ARRAY::bumpsize(long elt) \
  35. { \
  36.     if (elt < 0) \
  37.         elt = 0; \
  38.     if (elt >= max) \
  39.     { \
  40.         long omax = max; \
  41.         if (max <= 0) \
  42.             max = 1; \
  43.         TYPE *narr = new TYPE[max = elt + (max > 1024 ? 1024 : max)]; \
  44.         for (long i = 0; i < len; i++) \
  45.             narr[i] = arr[i]; \
  46.         delete[omax] arr; \
  47.         arr = narr; \
  48.     } \
  49.     if (elt >= len) \
  50.         len = elt + 1; \
  51.     return arr[elt]; \
  52. } \
  53. ARRAY &ARRAY::operator=(const ARRAY &a) \
  54. { \
  55.     if (&a == this) \
  56.         return *this; \
  57.     if (a.len > len) \
  58.         bumpsize(a.len); \
  59.     len = a.len; \
  60.     for (long i = 0; i < len; i++) \
  61.         arr[i] = a.arr[i]; \
  62.     return *this; \
  63. } \
  64. ARRAY::ARRAY(const ARRAY &t) \
  65. { \
  66.     arr = 0; \
  67.     max = len = 0; \
  68.     *this = t; \
  69. }
  70.