Listing 4: Thefunctions _vec_new and _vec_delete


typedef unsigned char BYTE;          // useful typedef
typedef void* (* ctorp)(BYTE *);     // pointer to a constructor fn
typedef void (* dtorp)(BYTE *, int); // pointer to a destructor fn

void* _vec_new(void* p,       // if not NULL, memory has already been
                              // allocated at this address for the
                              // vector and will not be _new-ed
               int   numelem, // number of elements to be created
               int   size,    // size of an element
               ctorp pctor    // pointer to contstructor function
              )
// Creates a vector of objects, calling the constructor for each.
{
  int i;
  BYTE* pobj;
  if (!p)
    p = _new(numelem*size);
  for(i = 1, pobj = (BYTE *)p; i <= numelem; i++, pobj += size)
    (*pctor)(pobj); // call the constructor
  return (void*)p;
}

void _vec_delete(void* p,       // pointer to vector to be deleted
                 int   numelem, // number of elements to be deleted
                 int   size,    // size of each element
                 dtorp pdtor,   // pointer to destructor function
                 int   free     // !=0 true if the memory at p is to be
                                // _deleted, 0 otherwise
                )
// Deletes a vector of objects, calling the destructor for each.
{
  int i;
  BYTE* pobj;
  pobj = (BYTE *)p;
  for(i = 1, pobj = (BYTE *)p; i <= numelem; i++, pobj+=size)
    (*pdtor)(pobj, 0); // call the destructor
                       // 0 => don't call _delete for the element
                       // (see typical destructor function)
  if (free)
    _delete(p);
}