Chris@87: #ifndef Py_FORTRANOBJECT_H Chris@87: #define Py_FORTRANOBJECT_H Chris@87: #ifdef __cplusplus Chris@87: extern "C" { Chris@87: #endif Chris@87: Chris@87: #include "Python.h" Chris@87: Chris@87: #ifdef FORTRANOBJECT_C Chris@87: #define NO_IMPORT_ARRAY Chris@87: #endif Chris@87: #define PY_ARRAY_UNIQUE_SYMBOL _npy_f2py_ARRAY_API Chris@87: #include "numpy/arrayobject.h" Chris@87: Chris@87: /* Chris@87: * Python 3 support macros Chris@87: */ Chris@87: #if PY_VERSION_HEX >= 0x03000000 Chris@87: #define PyString_Check PyBytes_Check Chris@87: #define PyString_GET_SIZE PyBytes_GET_SIZE Chris@87: #define PyString_AS_STRING PyBytes_AS_STRING Chris@87: #define PyString_FromString PyBytes_FromString Chris@87: #define PyUString_FromStringAndSize PyUnicode_FromStringAndSize Chris@87: #define PyString_ConcatAndDel PyBytes_ConcatAndDel Chris@87: #define PyString_AsString PyBytes_AsString Chris@87: Chris@87: #define PyInt_Check PyLong_Check Chris@87: #define PyInt_FromLong PyLong_FromLong Chris@87: #define PyInt_AS_LONG PyLong_AsLong Chris@87: #define PyInt_AsLong PyLong_AsLong Chris@87: Chris@87: #define PyNumber_Int PyNumber_Long Chris@87: Chris@87: #else Chris@87: Chris@87: #define PyUString_FromStringAndSize PyString_FromStringAndSize Chris@87: #endif Chris@87: Chris@87: Chris@87: #ifdef F2PY_REPORT_ATEXIT Chris@87: #include Chris@87: extern void f2py_start_clock(void); Chris@87: extern void f2py_stop_clock(void); Chris@87: extern void f2py_start_call_clock(void); Chris@87: extern void f2py_stop_call_clock(void); Chris@87: extern void f2py_cb_start_clock(void); Chris@87: extern void f2py_cb_stop_clock(void); Chris@87: extern void f2py_cb_start_call_clock(void); Chris@87: extern void f2py_cb_stop_call_clock(void); Chris@87: extern void f2py_report_on_exit(int,void*); Chris@87: #endif Chris@87: Chris@87: #ifdef DMALLOC Chris@87: #include "dmalloc.h" Chris@87: #endif Chris@87: Chris@87: /* Fortran object interface */ Chris@87: Chris@87: /* Chris@87: 123456789-123456789-123456789-123456789-123456789-123456789-123456789-12 Chris@87: Chris@87: PyFortranObject represents various Fortran objects: Chris@87: Fortran (module) routines, COMMON blocks, module data. Chris@87: Chris@87: Author: Pearu Peterson Chris@87: */ Chris@87: Chris@87: #define F2PY_MAX_DIMS 40 Chris@87: Chris@87: typedef void (*f2py_set_data_func)(char*,npy_intp*); Chris@87: typedef void (*f2py_void_func)(void); Chris@87: typedef void (*f2py_init_func)(int*,npy_intp*,f2py_set_data_func,int*); Chris@87: Chris@87: /*typedef void* (*f2py_c_func)(void*,...);*/ Chris@87: Chris@87: typedef void *(*f2pycfunc)(void); Chris@87: Chris@87: typedef struct { Chris@87: char *name; /* attribute (array||routine) name */ Chris@87: int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS, Chris@87: || rank=-1 for Fortran routine */ Chris@87: struct {npy_intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */ Chris@87: int type; /* PyArray_ || not used */ Chris@87: char *data; /* pointer to array || Fortran routine */ Chris@87: f2py_init_func func; /* initialization function for Chris@87: allocatable arrays: Chris@87: func(&rank,dims,set_ptr_func,name,len(name)) Chris@87: || C/API wrapper for Fortran routine */ Chris@87: char *doc; /* documentation string; only recommended Chris@87: for routines. */ Chris@87: } FortranDataDef; Chris@87: Chris@87: typedef struct { Chris@87: PyObject_HEAD Chris@87: int len; /* Number of attributes */ Chris@87: FortranDataDef *defs; /* An array of FortranDataDef's */ Chris@87: PyObject *dict; /* Fortran object attribute dictionary */ Chris@87: } PyFortranObject; Chris@87: Chris@87: #define PyFortran_Check(op) (Py_TYPE(op) == &PyFortran_Type) Chris@87: #define PyFortran_Check1(op) (0==strcmp(Py_TYPE(op)->tp_name,"fortran")) Chris@87: Chris@87: extern PyTypeObject PyFortran_Type; Chris@87: extern int F2PyDict_SetItemString(PyObject* dict, char *name, PyObject *obj); Chris@87: extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init); Chris@87: extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs); Chris@87: Chris@87: #if PY_VERSION_HEX >= 0x03000000 Chris@87: Chris@87: PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)); Chris@87: void * F2PyCapsule_AsVoidPtr(PyObject *obj); Chris@87: int F2PyCapsule_Check(PyObject *ptr); Chris@87: Chris@87: #else Chris@87: Chris@87: PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(void *)); Chris@87: void * F2PyCapsule_AsVoidPtr(PyObject *ptr); Chris@87: int F2PyCapsule_Check(PyObject *ptr); Chris@87: Chris@87: #endif Chris@87: Chris@87: #define ISCONTIGUOUS(m) ((m)->flags & NPY_CONTIGUOUS) Chris@87: #define F2PY_INTENT_IN 1 Chris@87: #define F2PY_INTENT_INOUT 2 Chris@87: #define F2PY_INTENT_OUT 4 Chris@87: #define F2PY_INTENT_HIDE 8 Chris@87: #define F2PY_INTENT_CACHE 16 Chris@87: #define F2PY_INTENT_COPY 32 Chris@87: #define F2PY_INTENT_C 64 Chris@87: #define F2PY_OPTIONAL 128 Chris@87: #define F2PY_INTENT_INPLACE 256 Chris@87: #define F2PY_INTENT_ALIGNED4 512 Chris@87: #define F2PY_INTENT_ALIGNED8 1024 Chris@87: #define F2PY_INTENT_ALIGNED16 2048 Chris@87: Chris@87: #define ARRAY_ISALIGNED(ARR, SIZE) ((size_t)(PyArray_DATA(ARR)) % (SIZE) == 0) Chris@87: #define F2PY_ALIGN4(intent) (intent & F2PY_INTENT_ALIGNED4) Chris@87: #define F2PY_ALIGN8(intent) (intent & F2PY_INTENT_ALIGNED8) Chris@87: #define F2PY_ALIGN16(intent) (intent & F2PY_INTENT_ALIGNED16) Chris@87: Chris@87: #define F2PY_GET_ALIGNMENT(intent) \ Chris@87: (F2PY_ALIGN4(intent) ? 4 : \ Chris@87: (F2PY_ALIGN8(intent) ? 8 : \ Chris@87: (F2PY_ALIGN16(intent) ? 16 : 1) )) Chris@87: #define F2PY_CHECK_ALIGNMENT(arr, intent) ARRAY_ISALIGNED(arr, F2PY_GET_ALIGNMENT(intent)) Chris@87: Chris@87: extern PyArrayObject* array_from_pyobj(const int type_num, Chris@87: npy_intp *dims, Chris@87: const int rank, Chris@87: const int intent, Chris@87: PyObject *obj); Chris@87: extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out); Chris@87: Chris@87: #ifdef DEBUG_COPY_ND_ARRAY Chris@87: extern void dump_attrs(const PyArrayObject* arr); Chris@87: #endif Chris@87: Chris@87: Chris@87: #ifdef __cplusplus Chris@87: } Chris@87: #endif Chris@87: #endif /* !Py_FORTRANOBJECT_H */