python/src/pygeos/c_api.h (41 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/************************************************************************
* PyGEOS C API
*
* This file wraps internal PyGEOS C extension functions for use in other
* extensions. These are specifically wrapped to enable dynamic loading
* after Python initialization.
*
* Each function must provide 3 defines for use in the dynamic loading process:
* NUM: the index in function pointer array
* RETURN: the return type
* PROTO: function prototype
*
* IMPORTANT: each function must provide 2 sets of defines below and
* provide an entry into PyGEOS_API in lib.c module declaration block.
*
***********************************************************************/
#ifndef _PYGEOS_API_H
#define _PYGEOS_API_H
#include <Python.h>
#include "../geos_c_dyn.h"
/* PyObject* PyGEOS_CreateGeometry(GEOSGeometry *ptr, GEOSContextHandle_t ctx)
*/
#define PyGEOS_CreateGeometry_NUM 0
#define PyGEOS_CreateGeometry_RETURN PyObject *
#define PyGEOS_CreateGeometry_PROTO \
(GEOSGeometry * ptr, GEOSContextHandle_t ctx)
/* char PyGEOS_GetGEOSGeometry(GeometryObject *obj, GEOSGeometry **out) */
#define PyGEOS_GetGEOSGeometry_NUM 1
#define PyGEOS_GetGEOSGeometry_RETURN char
#define PyGEOS_GetGEOSGeometry_PROTO (PyObject * obj, GEOSGeometry * *out)
/* GEOSCoordSequence* PyGEOS_CoordSeq_FromBuffer(GEOSContextHandle_t ctx, const
double* buf, unsigned int size, unsigned int dims, char ring_closure)*/
#define PyGEOS_CoordSeq_FromBuffer_NUM 2
#define PyGEOS_CoordSeq_FromBuffer_RETURN GEOSCoordSequence *
#define PyGEOS_CoordSeq_FromBuffer_PROTO \
(GEOSContextHandle_t ctx, const double *buf, unsigned int size, \
unsigned int dims, char ring_closure)
/* Total number of C API pointers */
#define PyGEOS_API_num_pointers 3
#ifdef PyGEOS_API_Module
/* This section is used when compiling shapely.lib C extension.
* Each API function needs to provide a corresponding *_PROTO here.
*/
extern PyGEOS_CreateGeometry_RETURN PyGEOS_CreateGeometry
PyGEOS_CreateGeometry_PROTO;
extern PyGEOS_GetGEOSGeometry_RETURN PyGEOS_GetGEOSGeometry
PyGEOS_GetGEOSGeometry_PROTO;
extern PyGEOS_CoordSeq_FromBuffer_RETURN PyGEOS_CoordSeq_FromBuffer
PyGEOS_CoordSeq_FromBuffer_PROTO;
#else
/* This section is used in modules that use the PyGEOS C API
* Each API function needs to provide the lookup into PyGEOS_API as a
* define statement.
*/
static void **PyGEOS_API;
#define PyGEOS_CreateGeometry \
(*(PyGEOS_CreateGeometry_RETURN(*) \
PyGEOS_CreateGeometry_PROTO)PyGEOS_API[PyGEOS_CreateGeometry_NUM])
#define PyGEOS_GetGEOSGeometry \
(*(PyGEOS_GetGEOSGeometry_RETURN(*) \
PyGEOS_GetGEOSGeometry_PROTO)PyGEOS_API[PyGEOS_GetGEOSGeometry_NUM])
#define PyGEOS_CoordSeq_FromBuffer \
(*(PyGEOS_CoordSeq_FromBuffer_RETURN(*) PyGEOS_CoordSeq_FromBuffer_PROTO) \
PyGEOS_API[PyGEOS_CoordSeq_FromBuffer_NUM])
/* Dynamically load C API from PyCapsule.
* This MUST be called prior to using C API functions in other modules;
* otherwise segfaults will occur when the PyGEOS C API functions are called.
*
* Returns 0 on success, -1 if error.
* PyCapsule_Import will set an exception on error.
*/
static int import_shapely_c_api(void) {
PyGEOS_API = (void **)PyCapsule_Import("shapely.lib._C_API", 0);
return (PyGEOS_API == NULL) ? -1 : 0;
}
#endif
#endif /* !defined(_PYGEOS_API_H) */