// File:       vecnew.c
// Version:    1.00
// Author:     (c) Miles Sabin, 1996
// Purpose:    dynamic storage allocation

#include <stdlib.h>          // for malloc(), free()


typedef struct
{
  int num_elem;
} VectorHeader;

typedef void* (*ctor_t)(void* p);
typedef void (*dtor_t)(void* p, int delete);

void* __vec_new(char* p, int num_elem, size_t elem_size, ctor_t ctor)
{
  int i;
  char* elem;

  if(p == 0)
  {
    p = (char*)malloc(sizeof(VectorHeader)+(num_elem*elem_size));
    ((VectorHeader*)p)->num_elem = num_elem;
    p += sizeof(VectorHeader);
  }

  for(i = 0, elem = p; i < num_elem; ++i, elem += elem_size)
    ctor(elem);

  return p;
}

void __vec_delete(char* p, int num_elem, size_t elem_size, dtor_t dtor)
{
  int i;
  char* elem;

  if(p == 0)
    return;

  if(num_elem == -1)
    num_elem = ((VectorHeader*)(p-sizeof(VectorHeader)))->num_elem;

  for(i = 0, elem = p; i < num_elem; ++i, elem += elem_size)
    dtor(elem, 0);

  if(num_elem == -1)
    free(p-sizeof(VectorHeader));
}
