/* 
 * File:   Vector.h
 * Author: Me
 *
 * Created on May 14, 2010, 3:08 PM
 */

#ifndef _DYNARRAY_H
#define	_DYNARRAY_H

#include "../../VMS_Implementations/VMS_impl/VMS_primitive_data_types.h"


   //A dynamic array is same as any other array, but add a DynArrayInfo next
   // to it.  Accesses and updates of array indexes are done normally, it's
   // only when add a new element into array that use the extra info.
   // An add can cause the pointer to the normal array to change..  so must
   // be protected to single VP at a time.
typedef struct
 {
   void ***addrOfPtrToArray; //addr of array of ptrs == triple *
   int32   numInArray;
   int32   sizeOfArray;
 }
DynArrayInfo;

DynArrayInfo *
makeDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray );

DynArrayInfo *
makeDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray );

int32
addToDynArray( void *value, DynArrayInfo *info );

void
makeHighestDynArrayIndexBe( DynArrayInfo *info, int32 highestIndex );

void
increaseSizeOfDynArrayTo( DynArrayInfo *info, int32 newSize );

typedef void  (*FreeFnPtr)  ( void * ); //fn has to cast void * to whatever

void
freeDynArrayDeep( DynArrayInfo *info, FreeFnPtr freeFnPtr );

void
freeDynArrayFlat( DynArrayInfo *info );


typedef void  (*DynArrayFnPtr)  ( void * );  //fn has to cast void *

void
forAllInDynArrayDo( DynArrayInfo *info, DynArrayFnPtr fnPtr );

#endif	/* _DYNARRAY_H */

