#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <Python.h>
#include <numpy/arrayobject.h>
#include <stdio.h>

void inc_array(PyArrayObject*, double);
void not_inc_array(PyArrayObject*, double);
double *getptr_to_pyarray_double(PyArrayObject*);
double *getCarray_from_pymatrix_double(PyArrayObject*);


void inc_array(PyArrayObject *arrayin, double inc){
    double *c;
    int m, n;

    printf("from inc_array\n");
    printf("dimensions: %d, type: %d\n", PyArray_NDIM(arrayin), PyArray_TYPE(arrayin));
    m = PyArray_DIM(arrayin,0);
    n = PyArray_DIM(arrayin,1);

    c = getptr_to_pyarray_double(arrayin);
    for (int i=0; i<m*n; i++)
        c[i] += inc;
}


void not_inc_array(PyArrayObject *arrayin, double inc){
    double *c;
    int m, n;

    printf("from not_inc_array\n");
    printf("dimensions: %d, type: %d\n", PyArray_NDIM(arrayin), PyArray_TYPE(arrayin));
    m = PyArray_DIM(arrayin,0);
    n = PyArray_DIM(arrayin,1);

    c = getCarray_from_pymatrix_double(arrayin);
    for (int i=0; i<m*n; i++)
        c[i] += inc;

    free(c);
}


double *getptr_to_pyarray_double(PyArrayObject *arrayin){
    double *c;

    if (PyArray_TYPE(arrayin) != NPY_DOUBLE) {
        PyErr_SetString(PyExc_TypeError, "Array must be of type float64 (double)");
        return NULL;
    }

    c = (double *)PyArray_DATA(arrayin);
    return c;
}


double *getCarray_from_pymatrix_double(PyArrayObject *arrayin){
    int n, m;
    double *cin, *c;

    if (PyArray_TYPE(arrayin) != NPY_DOUBLE) {
        PyErr_SetString(PyExc_TypeError, "Array must be of type float64 (double)");
        return NULL;
    }

    m = PyArray_DIM(arrayin,0);
    n = PyArray_DIM(arrayin,1);

    cin = getptr_to_pyarray_double(arrayin);
    c = (double *)malloc(sizeof(double)*n*m);
    for (int i=0; i<m*n; i++){
        c[i] = cin[i];
    }
    return c;
}