#ifndef PROARRAY_H
#define PROARRAY_H

/* 
   Creo Parametric TOOLKIT declarations for ProArray related actions.
*/



#include <ProToolkit.h>

typedef void* ProArray;

PRO_BEGIN_C_DECLS

LIB_COREUTILS_API  ProError ProArrayAlloc (int n_objs,
                               int obj_size,
                               int reallocation_size,
                               ProArray* p_array);
/*
    Purpose: Allocates an array of objects. The maximum memory allocated is 
             approximately 2 Mb, except for alpha_unix (or other 64-bit 
             platforms), where the maximum is twice that. Refer to 
             ProArrayMaxCountGet for data on getting the maximum number of 
             objects of obj_size that can be stored in a specified ProArray.

    Input Arguments:
        n_objs - The initial number of objects allocated in the array.
        obj_size - The size of each object in the array
        reallocation_size - The minimum number of objects added or deleted if 
                            Creo Parametric TOOLKIT resizes the array, e.g. on 
                            a call to <b>ProArrayObjectAdd</b>.

    Output Arguments:
        p_array - The allocated array

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated the array.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_OUT_OF_MEMORY - The array would be too big to allocate.

*/

LIB_COREUTILS_API  ProError ProArrayFree (ProArray* p_array);
/*
    Purpose: Frees a preallocated array.

    Input Arguments:
        p_array - The address of the array to be freed

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the array.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

LIB_COREUTILS_API  ProError ProArraySizeSet (ProArray* p_array,
                                 int       size);
/*
    Purpose: Enables you to increase or decrease the size of an array.
             <p> NOTE: 
             <p> Because this call may cause the array to be reallocated, you 
             must pass the address of the array.

    Input Arguments:
        p_array - The address of the array whose size should be changed
        size - The new size of the array

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the array size.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

*/

LIB_COREUTILS_API  ProError ProArraySizeGet (ProArray array,
                                 int*     p_size);
/*
    Purpose: Returns the size of the specified array.

    Input Arguments:
        array - The array whose size is required

    Output Arguments:
        p_size - The size of the array

    Return Values:
        PRO_TK_NO_ERROR - The function successfully returned the array size.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

LIB_COREUTILS_API  ProError ProArrayObjectAdd (ProArray* p_array,
                                   int       index,
                                   int       n_objects,
                                   void*     p_object);
/*
    Purpose: Adds an object at a specified location to the array, or appends an 
             object to the end of an array.
             <p> For example, if you want to insert one integer in an integer 
             array, call the function as follows: <pre> ProArrayObjectAdd 
             (&int_array, 0, 1, (void *)&int_val);</pre>
             <p> If you want to insert 3 doubles at the second position in an 
             array of doubles, call the function as follows: <pre> 
             ProArrayObjectAdd (&dbl_array, 2, 3, (void *)dbl3_arr);</pre>
             <p> NOTE:
             <p> Because this call may cause the array to be reallocated, you 
             must pass the address of the array.

    Input Arguments:
        p_array - The address of the array.
        index - The position at which to insert the objects in the array. If 
                you specify a value less than 0 (PRO_VALUE_UNUSED), the 
                function appends the objects to the end of the array.
        n_objects - The number of objects to add to the array.
        p_object - The address from which a contiguous set of object data is to 
                   be copied into the array.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully added the objects to the 
                          array.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.
        PRO_TK_OUT_OF_MEMORY - The array would be too big to allocate.

*/

LIB_COREUTILS_API  ProError ProArrayObjectRemove (ProArray *p_array,
                                      int       index,
                                      int       n_objects);
/*
    Purpose: Removes an object from a specified location in the array.
             <p> NOTE: 
             <p> Because this call may cause the array to be reallocated, you 
             must pass the address of the array.

    Input Arguments:
        p_array - The address of the array.
        index - The position at which to remove the objects from the array. The 
                index value can range from 0 to (<i>size of array</i>-1). If 
                the index is less than 0 (PRO_VALUE_UNUSED), the array shrinks 
                by <i>n_objects</i>.
        n_objects - The number of objects to remove.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the objects.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.

*/

LIB_COREUTILS_API  ProError ProArrayMaxCountGet(int obj_size,
                                    int *max_num_objs);
/*
    Purpose: Calculates the maximum number of objects that can be stored in a 
             ProArray with objects of size obj_size. Refer to ProArrayAlloc for 
             data on specifying the ProArray.

    Input Arguments:
        obj_size - The size of the object.

    Output Arguments:
        max_num_objs - The maximum number of objects of size obj_size that can 
                       be stored in a ProArray.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully calculated the maximum 
                          number of objects.

*/

PRO_END_C_DECLS

#endif /* PROARRAY_H */