Files
StarPilot/starpilot/third_party/timezonefinder/utils_clang.py
T
firestar5683 3d8af2361e Rename
2026-03-27 18:05:44 -05:00

45 lines
1.4 KiB
Python

from typing import Final, Optional
import cffi
import numpy as np
ffi: Optional[cffi.FFI] = None
try:
# Note: IDE might complain as this import comes from a cffi C extension
from timezonefinder import inside_polygon_ext # type: ignore
clang_extension_loaded = True
ffi = cffi.FFI()
except ImportError:
clang_extension_loaded = False
inside_polygon_ext = None
INT_LIST_REP: Final[str] = "int []"
def pt_in_poly_clang(x: int, y: int, coords: np.ndarray) -> bool:
"""wrapper of the point in polygon test algorithm C extension
ATTENTION: the input numpy arrays must have a C_CONTIGUOUS memory layout
https://numpy.org/doc/stable/reference/generated/numpy.ascontiguousarray.html?highlight=ascontiguousarray#numpy.ascontiguousarray
"""
if ffi is None:
raise ValueError(
"Trying to use the clang implementation of the point in polygon algorithm "
"while the C extension in not loaded."
)
x_coords = coords[0]
y_coords = coords[1]
nr_coords = len(x_coords)
y_coords = np.ascontiguousarray(y_coords)
x_coords = np.ascontiguousarray(x_coords)
x_coords_ffi = ffi.from_buffer(INT_LIST_REP, x_coords)
y_coords_ffi = ffi.from_buffer(INT_LIST_REP, y_coords)
contained = inside_polygon_ext.lib.inside_polygon_int(
x, y, nr_coords, x_coords_ffi, y_coords_ffi
)
return contained