home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / FlexArray.cxx < prev    next >
C/C++ Source or Header  |  1996-05-31  |  3KB  |  107 lines

  1. /*---------------------------------------------------------------------------
  2.  *
  3.  * Copyright (c) 1990 by Westmount Technology B.V., Delft, The Netherlands.
  4.  *
  5.  * This software is furnished under a license and may be used only in
  6.  * accordance with the terms of such license and with the inclusion of
  7.  * the above copyright notice. This software or any other copies thereof
  8.  * may not be provided or otherwise made available to any other person.
  9.  * No title to and ownership of the software is hereby transferred.
  10.  *
  11.  * The information in this software is subject to change without notice
  12.  * and should not be construed as a commitment by Westmount Technology B.V.
  13.  *
  14.  *---------------------------------------------------------------------------
  15.  *
  16.  *    File        : @(#)FlexArray.cxx    1.1
  17.  *    Author        : erel
  18.  *    Original date    : Jun 14 1990
  19.  *    History        :
  20.  *    See also    : ArrayOb (nihcl)
  21.  *    Description    : Implementation of flexible arrays
  22.  *
  23.  *---------------------------------------------------------------------------
  24.  */
  25.  
  26. static const char SccsId[]=
  27. "@(#)FlexArray.cxx    1.1 05 Nov 1993 Copyright 1993 Westmount Technology";
  28.  
  29. #include <stdlib.h>
  30. /*
  31.  *    Note: we use malloc()/free() here instead of new/delete because
  32.  *    we use realloc() to implement reSize().
  33.  */
  34.  
  35.  
  36. #define NEW(type,size)    ((type*)malloc(sizeof(type)*(size)))
  37.  
  38. inline void DELETE(void** ptr) { free((char*)ptr); }
  39.  
  40. inline void** REALLOC(void** ptr, unsigned size)
  41. {
  42.     return (void**)realloc((char*)ptr,sizeof(void*)*size);
  43. }
  44.  
  45.  
  46. #include "FlexArray.hxx"
  47.  
  48. extern const int DEFAULT_ARRAY_SIZE = 16;
  49.  
  50. void
  51. GenFlexArray::clear(void * e)
  52. {
  53.     register i = sz;
  54.     register void** vp = v;
  55.     while (i--) *vp++ = e;
  56. }
  57.  
  58.  
  59. GenFlexArray::GenFlexArray (unsigned size):
  60.         sz ( (size) ? size: DEFAULT_ARRAY_SIZE )
  61. {
  62.     v = NEW(void*,sz);
  63. }
  64.  
  65.  
  66. GenFlexArray::GenFlexArray(const GenFlexArray& a): sz(a.sz)
  67. {
  68.     register i = sz;
  69.     v = NEW(void*,i);
  70.     register void** vp = v;
  71.     register void** av = a.v;
  72.     while (i--) *vp++ = *av++;
  73. }
  74.  
  75.  
  76. GenFlexArray::~GenFlexArray()        { DELETE(v); }
  77.  
  78.  
  79. GenFlexArray&
  80. GenFlexArray::operator=(const GenFlexArray& a)
  81. {
  82.     if ( &a == this ) return *this;    // assigning to self?
  83.  
  84.     DELETE(v);
  85.     v = NEW(void*,sz=a.sz);
  86.     register i = a.sz;
  87.     register void** vp = v;
  88.     register void** av = a.v;
  89.     while (i--) *vp++ = *av++;
  90.  
  91.     return *this;
  92. }
  93.  
  94. void
  95. GenFlexArray::reSize(unsigned newsize)
  96. {
  97.     v = REALLOC(v,newsize);
  98.     // clear newly allocated memmory
  99.     if ( newsize > sz ) {
  100.     register i = newsize - sz;
  101.     register void** vp = &v[sz];
  102.     while (i--) *vp++ = 0;
  103.     }
  104.     sz = newsize;
  105. }
  106.  
  107.