#ifndef __AMSCURARRAY_HPP__
#define __AMSCURARRAY_HPP__

namespace amscuda
{

//Cuda ragged array class
template<typename T> class curarray
{
public:
    int device;
    curarray* devptr; //pointer to mirror class on the device

    int Narrays; //number of arrays
    
    int *N; //dimension of each array
    T** hostarrayptrs; //pointers to each array on the host - null on the device
    T** devarrayptrs; //pointers to each array on the device
        //the double pointer is a host pointer to device pointers on the host class
        //for the device class, only the second set of arrays is in use
    
    //the constructor and destructor set all pointers to NULL, they
    // do *not* manage memory. This is done with curarray_new and curarray_delete
    __device__ __host__ curarray();
    __device__ __host__ ~curarray();
    
    __host__ int push();
    __host__ int pull();
    //__device__ int dev_resizearray(int arraynum, int arraysize);
    __host__ int resizearray(int arraynum, int arraysize);
    // I may want a way to resize arrays on the device without pushing/pulling all the array contents
    

};

template<typename T> int curarray_new(curarray<T>** ptr, int Narrays);

template<typename T> int curarray_delete(curarray<T>** ptr);

template<typename T> int curarray_device_new(curarray<T> *hostptr);

template<typename T> int curarray_device_delete(curarray<T> *hostptr);

template<typename T> int curarray_push(curarray<T> *hostptr);

template<typename T> int curarray_pull(curarray<T> *hostptr);


//template<typename T> int curarray_host_fillall(curarray<T> *hostptr, const T &val);
//template<typename T> int curarray_device_fillall(curarray<T> *hostptr, const T &val);


//template<typename T> __host__ int curarray_deletearray(curarray<T> *hostptr, int arrayindex);
//template<typename T> __device__ int curarray_dev_deletearray(curarray<T> *devptr, int arrayindex);

//template<typename T> __host__ int curarray_allocarray(curarray<T> *hostptr, int arrayindex, int size);
//template<typename T> __device__ int curarray_dev_allocarray(curarray<T> *devptr, int arrayindex, int size);


void test_amscurarray1();

};

#include <amsculib2/amscurarray_impl.cuh>

#endif