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

#ifndef _DYNARRAY_H
#define	_DYNARRAY_H

#include "../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;
 }
PrivDynArrayInfo;

PrivDynArrayInfo *
makePrivDynArrayInfoFrom( void ***addrOfPtrToArray, int32 sizeOfArray );

PrivDynArrayInfo *
makePrivDynArrayOfSize( void ***addrOfPtrToArray, int32 sizeOfArray );

PrivDynArrayInfo *
makePrivDynArrayOfSize_Ext( void ***addrOfPtrToArray, int32 sizeOfArray );

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

void
makeHighestDynArrayIndexBe( PrivDynArrayInfo *info, int32 highestIndex );

void
makeHighestDynArrayIndexBeAtLeast(PrivDynArrayInfo *info,int32 highestIndex);

void
increaseSizeOfDynArrayTo( PrivDynArrayInfo *info, int32 newSize );

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

void
freeDynArrayDeep( PrivDynArrayInfo *info, FreeFnPtr freeFnPtr );

void
freeDynArrayFlat( PrivDynArrayInfo *info );


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

void
forAllInDynArrayDo( PrivDynArrayInfo *info, DynArrayFnPtr fnPtr );

#endif	/* _DYNARRAY_H */

