This is an automated email from the ASF dual-hosted git repository.
jiayu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git
The following commit(s) were added to refs/heads/main by this push:
new 5cc2050 feat(r/sedonadb): Add tweaks on sedona-proj and sedona-tg for
Windows build with Rtools (#114)
5cc2050 is described below
commit 5cc205057008bb00fbe87d72c603ce324022a57a
Author: Hiroaki Yutani <[email protected]>
AuthorDate: Sun Sep 21 12:06:03 2025 +0900
feat(r/sedonadb): Add tweaks on sedona-proj and sedona-tg for Windows build
with Rtools (#114)
---
c/sedona-proj/README.md | 48 +
c/sedona-proj/build.rs | 49 +-
.../src/bindings/x86_64-pc-windows-gnu.rs | 382 ++++++++
c/sedona-proj/src/proj_dyn_bindgen.rs | 2 +-
c/sedona-tg/README.md | 48 +
c/sedona-tg/build.rs | 48 +-
c/sedona-tg/src/bindings/x86_64-pc-windows-gnu.rs | 1018 ++++++++++++++++++++
c/sedona-tg/src/tg_bindgen.rs | 2 +-
8 files changed, 1590 insertions(+), 7 deletions(-)
diff --git a/c/sedona-proj/README.md b/c/sedona-proj/README.md
new file mode 100644
index 0000000..76c896c
--- /dev/null
+++ b/c/sedona-proj/README.md
@@ -0,0 +1,48 @@
+<!---
+ 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.
+-->
+
+# sedona-proj
+
+## How to update the prebuilt bindings
+
+If `SEDONA_PROJ_BINDINGS_OUTPUT_PATH` envvar is set, the new bindings will be
+written to the specified path. The path is relative to the manifest dir of
+this crate.
+
+```sh
+SEDONA_PROJ_BINDINGS_OUTPUT_PATH=src/bindings/x86_64-unknown-linux-gnu.rs
cargo build -p sedona-proj
+```
+
+Note that, the generated file doesn't contain the license header, so you need
+to add it manually (hopefully, this will be automated).
+
+### Windows
+
+On Windows, you might need to set `PATH` and `PKG_CONFIG_SYSROOT_DIR` for
+`pkg-config`. For example, when using Rtools45, you progbably need these
+envvars:
+
+```ps1
+$env:PATH = "C:\rtools45\x86_64-w64-mingw32.static.posix\bin;$env:PATH"
+$env:PKG_CONFIG_SYSROOT_DIR = "C:\rtools45\x86_64-w64-mingw32.static.posix\"
+
+$env:SEDONA_PROJ_BINDINGS_OUTPUT_PATH = "src/bindings/x86_64-pc-windows-gnu.rs"
+
+cargo build -p sedona-proj
+```
diff --git a/c/sedona-proj/build.rs b/c/sedona-proj/build.rs
index 654b394..85ac44e 100644
--- a/c/sedona-proj/build.rs
+++ b/c/sedona-proj/build.rs
@@ -16,19 +16,64 @@
// under the License.
use std::{env, path::PathBuf};
+// Since relative path differs between build.rs and a file under `src/`, use
the
+// absolute path.
+fn get_absolute_path(path: String) -> PathBuf {
+ std::path::absolute(PathBuf::from(path)).expect("Failed to get absolute
path")
+}
+
+fn configure_bindings_path(prebuilt_bindings_path: String) -> (PathBuf, bool) {
+ // If SEDONA_PROJ_BINDINGS_OUTPUT_PATH is set, honor the explicit output
+ // path to regenerate bindings.
+ if let Ok(output_path) = env::var("SEDONA_PROJ_BINDINGS_OUTPUT_PATH") {
+ let output_path = get_absolute_path(output_path);
+ if let Some(output_dir) = output_path.parent() {
+ std::fs::create_dir_all(output_dir).expect("Failed to create
parent dirs");
+ }
+ return (output_path, true);
+ }
+
+ // If a prebuilt bindings exists, use it and skip bindgen.
+ let prebuilt_bindings_path = get_absolute_path(prebuilt_bindings_path);
+ if prebuilt_bindings_path.exists() {
+ return (prebuilt_bindings_path, false);
+ }
+
+ let output_dir = env::var("OUT_DIR").unwrap();
+ let output_path = PathBuf::from(output_dir).join("bindings.rs");
+
+ (output_path, true)
+}
+
fn main() {
println!("cargo:rerun-if-changed=src/proj_dyn.c");
+ println!("cargo:rerun-if-env-changed=SEDONA_PROJ_BINDINGS_OUTPUT_PATH");
+
cc::Build::new().file("src/proj_dyn.c").compile("proj_dyn");
+ let target_triple = std::env::var("TARGET").unwrap();
+ let prebuilt_bindings_path = format!("src/bindings/{target_triple}.rs");
+
+ let (bindings_path, generate_bindings) =
configure_bindings_path(prebuilt_bindings_path);
+
+ println!(
+ "cargo::rustc-env=BINDINGS_PATH={}",
+ bindings_path.to_string_lossy()
+ );
+
+ if !generate_bindings {
+ return;
+ }
+
let bindings = bindgen::Builder::default()
.header("src/proj_dyn.h")
+ .generate_comments(false)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate bindings");
// Write the bindings to the $OUT_DIR/bindings.rs file.
- let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
- .write_to_file(out_path.join("bindings.rs"))
+ .write_to_file(&bindings_path)
.expect("Couldn't write bindings!");
}
diff --git a/c/sedona-proj/src/bindings/x86_64-pc-windows-gnu.rs
b/c/sedona-proj/src/bindings/x86_64-pc-windows-gnu.rs
new file mode 100644
index 0000000..0b23b07
--- /dev/null
+++ b/c/sedona-proj/src/bindings/x86_64-pc-windows-gnu.rs
@@ -0,0 +1,382 @@
+// 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.
+
+/* automatically generated by rust-bindgen 0.71.1 */
+
+pub const _VCRT_COMPILER_PREPROCESSOR: u32 = 1;
+pub const _SAL_VERSION: u32 = 20;
+pub const __SAL_H_VERSION: u32 = 180000000;
+pub const _USE_DECLSPECS_FOR_SAL: u32 = 0;
+pub const _USE_ATTRIBUTES_FOR_SAL: u32 = 0;
+pub const _CRT_PACKING: u32 = 8;
+pub const _HAS_EXCEPTIONS: u32 = 1;
+pub const _STL_LANG: u32 = 0;
+pub const _HAS_CXX17: u32 = 0;
+pub const _HAS_CXX20: u32 = 0;
+pub const _HAS_CXX23: u32 = 0;
+pub const _HAS_NODISCARD: u32 = 0;
+pub const _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE: u32 = 1;
+pub const _CRT_BUILD_DESKTOP_APP: u32 = 1;
+pub const _ARGMAX: u32 = 100;
+pub const _CRT_INT_MAX: u32 = 2147483647;
+pub const _CRT_FUNCTIONS_REQUIRED: u32 = 1;
+pub const _CRT_HAS_CXX17: u32 = 0;
+pub const _CRT_HAS_C11: u32 = 1;
+pub const _CRT_INTERNAL_NONSTDC_NAMES: u32 = 1;
+pub const __STDC_SECURE_LIB__: u32 = 200411;
+pub const __GOT_SECURE_LIB__: u32 = 200411;
+pub const __STDC_WANT_SECURE_LIB__: u32 = 1;
+pub const _SECURECRT_FILL_BUFFER_PATTERN: u32 = 254;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES: u32 = 1;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY: u32 = 0;
+pub type va_list = *mut ::std::os::raw::c_char;
+unsafe extern "C" {
+ pub fn __va_start(arg1: *mut *mut ::std::os::raw::c_char, ...);
+}
+pub type __vcrt_bool = bool;
+pub type wchar_t = ::std::os::raw::c_ushort;
+unsafe extern "C" {
+ pub fn __security_init_cookie();
+}
+unsafe extern "C" {
+ pub fn __security_check_cookie(_StackCookie: usize);
+}
+unsafe extern "C" {
+ pub fn __report_gsfailure(_StackCookie: usize) -> !;
+}
+unsafe extern "C" {
+ pub static mut __security_cookie: usize;
+}
+pub type __crt_bool = bool;
+unsafe extern "C" {
+ pub fn _invalid_parameter_noinfo();
+}
+unsafe extern "C" {
+ pub fn _invalid_parameter_noinfo_noreturn() -> !;
+}
+unsafe extern "C" {
+ pub fn _invoke_watson(
+ _Expression: *const wchar_t,
+ _FunctionName: *const wchar_t,
+ _FileName: *const wchar_t,
+ _LineNo: ::std::os::raw::c_uint,
+ _Reserved: usize,
+ ) -> !;
+}
+pub type errno_t = ::std::os::raw::c_int;
+pub type wint_t = ::std::os::raw::c_ushort;
+pub type wctype_t = ::std::os::raw::c_ushort;
+pub type __time32_t = ::std::os::raw::c_long;
+pub type __time64_t = ::std::os::raw::c_longlong;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_data_public {
+ pub _locale_pctype: *const ::std::os::raw::c_ushort,
+ pub _locale_mb_cur_max: ::std::os::raw::c_int,
+ pub _locale_lc_codepage: ::std::os::raw::c_uint,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of __crt_locale_data_public"]
+ [::std::mem::size_of::<__crt_locale_data_public>() - 16usize];
+ ["Alignment of __crt_locale_data_public"]
+ [::std::mem::align_of::<__crt_locale_data_public>() - 8usize];
+ ["Offset of field: __crt_locale_data_public::_locale_pctype"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_pctype) -
0usize];
+ ["Offset of field: __crt_locale_data_public::_locale_mb_cur_max"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_mb_cur_max)
- 8usize];
+ ["Offset of field: __crt_locale_data_public::_locale_lc_codepage"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_lc_codepage)
- 12usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_pointers {
+ pub locinfo: *mut __crt_locale_data,
+ pub mbcinfo: *mut __crt_multibyte_data,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of
__crt_locale_pointers"][::std::mem::size_of::<__crt_locale_pointers>() -
16usize];
+ ["Alignment of __crt_locale_pointers"]
+ [::std::mem::align_of::<__crt_locale_pointers>() - 8usize];
+ ["Offset of field: __crt_locale_pointers::locinfo"]
+ [::std::mem::offset_of!(__crt_locale_pointers, locinfo) - 0usize];
+ ["Offset of field: __crt_locale_pointers::mbcinfo"]
+ [::std::mem::offset_of!(__crt_locale_pointers, mbcinfo) - 8usize];
+};
+pub type _locale_t = *mut __crt_locale_pointers;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _Mbstatet {
+ pub _Wchar: ::std::os::raw::c_ulong,
+ pub _Byte: ::std::os::raw::c_ushort,
+ pub _State: ::std::os::raw::c_ushort,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of _Mbstatet"][::std::mem::size_of::<_Mbstatet>() - 8usize];
+ ["Alignment of _Mbstatet"][::std::mem::align_of::<_Mbstatet>() - 4usize];
+ ["Offset of field: _Mbstatet::_Wchar"][::std::mem::offset_of!(_Mbstatet,
_Wchar) - 0usize];
+ ["Offset of field: _Mbstatet::_Byte"][::std::mem::offset_of!(_Mbstatet,
_Byte) - 4usize];
+ ["Offset of field: _Mbstatet::_State"][::std::mem::offset_of!(_Mbstatet,
_State) - 6usize];
+};
+pub type mbstate_t = _Mbstatet;
+pub type time_t = __time64_t;
+pub type rsize_t = usize;
+unsafe extern "C" {
+ pub fn _errno() -> *mut ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn _set_errno(_Value: ::std::os::raw::c_int) -> errno_t;
+}
+unsafe extern "C" {
+ pub fn _get_errno(_Value: *mut ::std::os::raw::c_int) -> errno_t;
+}
+unsafe extern "C" {
+ pub fn __threadid() -> ::std::os::raw::c_ulong;
+}
+unsafe extern "C" {
+ pub fn __threadhandle() -> usize;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct pj_ctx {
+ _unused: [u8; 0],
+}
+pub type PJ_CONTEXT = pj_ctx;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct PJ_AREA {
+ _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct PJconsts {
+ _unused: [u8; 0],
+}
+pub type PJ = PJconsts;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct PJ_XYZT {
+ pub x: f64,
+ pub y: f64,
+ pub z: f64,
+ pub t: f64,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of PJ_XYZT"][::std::mem::size_of::<PJ_XYZT>() - 32usize];
+ ["Alignment of PJ_XYZT"][::std::mem::align_of::<PJ_XYZT>() - 8usize];
+ ["Offset of field: PJ_XYZT::x"][::std::mem::offset_of!(PJ_XYZT, x) -
0usize];
+ ["Offset of field: PJ_XYZT::y"][::std::mem::offset_of!(PJ_XYZT, y) -
8usize];
+ ["Offset of field: PJ_XYZT::z"][::std::mem::offset_of!(PJ_XYZT, z) -
16usize];
+ ["Offset of field: PJ_XYZT::t"][::std::mem::offset_of!(PJ_XYZT, t) -
24usize];
+};
+#[repr(C)]
+#[derive(Copy, Clone)]
+pub union PJ_COORD {
+ pub v: [f64; 4usize],
+ pub xyzt: PJ_XYZT,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of PJ_COORD"][::std::mem::size_of::<PJ_COORD>() - 32usize];
+ ["Alignment of PJ_COORD"][::std::mem::align_of::<PJ_COORD>() - 8usize];
+ ["Offset of field: PJ_COORD::v"][::std::mem::offset_of!(PJ_COORD, v) -
0usize];
+ ["Offset of field: PJ_COORD::xyzt"][::std::mem::offset_of!(PJ_COORD, xyzt)
- 0usize];
+};
+pub const PJ_DIRECTION_PJ_FWD: PJ_DIRECTION = 1;
+pub const PJ_DIRECTION_PJ_IDENT: PJ_DIRECTION = 0;
+pub const PJ_DIRECTION_PJ_INV: PJ_DIRECTION = -1;
+pub type PJ_DIRECTION = ::std::os::raw::c_int;
+pub const PJ_LOG_LEVEL_PJ_LOG_NONE: PJ_LOG_LEVEL = 0;
+pub const PJ_LOG_LEVEL_PJ_LOG_ERROR: PJ_LOG_LEVEL = 1;
+pub const PJ_LOG_LEVEL_PJ_LOG_DEBUG: PJ_LOG_LEVEL = 2;
+pub const PJ_LOG_LEVEL_PJ_LOG_TRACE: PJ_LOG_LEVEL = 3;
+pub const PJ_LOG_LEVEL_PJ_LOG_TELL: PJ_LOG_LEVEL = 4;
+pub type PJ_LOG_LEVEL = ::std::os::raw::c_int;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct PJ_INFO {
+ pub major: ::std::os::raw::c_int,
+ pub minor: ::std::os::raw::c_int,
+ pub patch: ::std::os::raw::c_int,
+ pub release: *const ::std::os::raw::c_char,
+ pub version: *const ::std::os::raw::c_char,
+ pub searchpath: *const ::std::os::raw::c_char,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of PJ_INFO"][::std::mem::size_of::<PJ_INFO>() - 40usize];
+ ["Alignment of PJ_INFO"][::std::mem::align_of::<PJ_INFO>() - 8usize];
+ ["Offset of field: PJ_INFO::major"][::std::mem::offset_of!(PJ_INFO, major)
- 0usize];
+ ["Offset of field: PJ_INFO::minor"][::std::mem::offset_of!(PJ_INFO, minor)
- 4usize];
+ ["Offset of field: PJ_INFO::patch"][::std::mem::offset_of!(PJ_INFO, patch)
- 8usize];
+ ["Offset of field: PJ_INFO::release"][::std::mem::offset_of!(PJ_INFO,
release) - 16usize];
+ ["Offset of field: PJ_INFO::version"][::std::mem::offset_of!(PJ_INFO,
version) - 24usize];
+ ["Offset of field: PJ_INFO::searchpath"][::std::mem::offset_of!(PJ_INFO,
searchpath) - 32usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct ProjApi {
+ pub proj_area_create: ::std::option::Option<unsafe extern "C" fn() -> *mut
PJ_AREA>,
+ pub proj_area_destroy: ::std::option::Option<unsafe extern "C" fn(area:
*mut PJ_AREA)>,
+ pub proj_area_set_bbox: ::std::option::Option<
+ unsafe extern "C" fn(
+ area: *mut PJ_AREA,
+ west_lon_degree: f64,
+ south_lat_degree: f64,
+ east_lon_degree: f64,
+ north_lat_degree: f64,
+ ) -> ::std::os::raw::c_int,
+ >,
+ pub proj_context_create: ::std::option::Option<unsafe extern "C" fn() ->
*mut PJ_CONTEXT>,
+ pub proj_context_destroy: ::std::option::Option<unsafe extern "C" fn(ctx:
*mut PJ_CONTEXT)>,
+ pub proj_context_errno:
+ ::std::option::Option<unsafe extern "C" fn(ctx: *mut PJ_CONTEXT) ->
::std::os::raw::c_int>,
+ pub proj_context_errno_string: ::std::option::Option<
+ unsafe extern "C" fn(
+ ctx: *mut PJ_CONTEXT,
+ err: ::std::os::raw::c_int,
+ ) -> *const ::std::os::raw::c_char,
+ >,
+ pub proj_context_set_database_path: ::std::option::Option<
+ unsafe extern "C" fn(
+ ctx: *mut PJ_CONTEXT,
+ dbPath: *const ::std::os::raw::c_char,
+ auxDbPaths: *const *const ::std::os::raw::c_char,
+ options: *const *const ::std::os::raw::c_char,
+ ) -> ::std::os::raw::c_int,
+ >,
+ pub proj_context_set_search_paths: ::std::option::Option<
+ unsafe extern "C" fn(
+ ctx: *mut PJ_CONTEXT,
+ count_paths: ::std::os::raw::c_int,
+ paths: *const *const ::std::os::raw::c_char,
+ ),
+ >,
+ pub proj_create: ::std::option::Option<
+ unsafe extern "C" fn(
+ ctx: *mut PJ_CONTEXT,
+ definition: *const ::std::os::raw::c_char,
+ ) -> *mut PJ,
+ >,
+ pub proj_create_crs_to_crs_from_pj: ::std::option::Option<
+ unsafe extern "C" fn(
+ ctx: *mut PJ_CONTEXT,
+ source_crs: *mut PJ,
+ target_crs: *mut PJ,
+ area: *mut PJ_AREA,
+ options: *const *const ::std::os::raw::c_char,
+ ) -> *mut PJ,
+ >,
+ pub proj_cs_get_axis_count: ::std::option::Option<
+ unsafe extern "C" fn(ctx: *mut PJ_CONTEXT, cs: *const PJ) ->
::std::os::raw::c_int,
+ >,
+ pub proj_destroy: ::std::option::Option<unsafe extern "C" fn(P: *mut PJ)>,
+ pub proj_errno:
+ ::std::option::Option<unsafe extern "C" fn(P: *const PJ) ->
::std::os::raw::c_int>,
+ pub proj_errno_reset: ::std::option::Option<unsafe extern "C" fn(P: *mut
PJ)>,
+ pub proj_info: ::std::option::Option<unsafe extern "C" fn() -> PJ_INFO>,
+ pub proj_log_level: ::std::option::Option<
+ unsafe extern "C" fn(ctx: *mut PJ_CONTEXT, level: PJ_LOG_LEVEL) ->
PJ_LOG_LEVEL,
+ >,
+ pub proj_normalize_for_visualization: ::std::option::Option<
+ unsafe extern "C" fn(ctx: *mut PJ_CONTEXT, obj: *const PJ) -> *mut PJ,
+ >,
+ pub proj_trans: ::std::option::Option<
+ unsafe extern "C" fn(P: *mut PJ, direction: PJ_DIRECTION, coord:
PJ_COORD) -> PJ_COORD,
+ >,
+ pub proj_trans_array: ::std::option::Option<
+ unsafe extern "C" fn(
+ P: *mut PJ,
+ direction: PJ_DIRECTION,
+ n: usize,
+ coord: *mut PJ_COORD,
+ ) -> PJ_COORD,
+ >,
+ pub release: ::std::option::Option<unsafe extern "C" fn(arg1: *mut
ProjApi)>,
+ pub private_data: *mut ::std::os::raw::c_void,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of ProjApi"][::std::mem::size_of::<ProjApi>() - 176usize];
+ ["Alignment of ProjApi"][::std::mem::align_of::<ProjApi>() - 8usize];
+ ["Offset of field: ProjApi::proj_area_create"]
+ [::std::mem::offset_of!(ProjApi, proj_area_create) - 0usize];
+ ["Offset of field: ProjApi::proj_area_destroy"]
+ [::std::mem::offset_of!(ProjApi, proj_area_destroy) - 8usize];
+ ["Offset of field: ProjApi::proj_area_set_bbox"]
+ [::std::mem::offset_of!(ProjApi, proj_area_set_bbox) - 16usize];
+ ["Offset of field: ProjApi::proj_context_create"]
+ [::std::mem::offset_of!(ProjApi, proj_context_create) - 24usize];
+ ["Offset of field: ProjApi::proj_context_destroy"]
+ [::std::mem::offset_of!(ProjApi, proj_context_destroy) - 32usize];
+ ["Offset of field: ProjApi::proj_context_errno"]
+ [::std::mem::offset_of!(ProjApi, proj_context_errno) - 40usize];
+ ["Offset of field: ProjApi::proj_context_errno_string"]
+ [::std::mem::offset_of!(ProjApi, proj_context_errno_string) - 48usize];
+ ["Offset of field: ProjApi::proj_context_set_database_path"]
+ [::std::mem::offset_of!(ProjApi, proj_context_set_database_path) -
56usize];
+ ["Offset of field: ProjApi::proj_context_set_search_paths"]
+ [::std::mem::offset_of!(ProjApi, proj_context_set_search_paths) -
64usize];
+ ["Offset of field: ProjApi::proj_create"]
+ [::std::mem::offset_of!(ProjApi, proj_create) - 72usize];
+ ["Offset of field: ProjApi::proj_create_crs_to_crs_from_pj"]
+ [::std::mem::offset_of!(ProjApi, proj_create_crs_to_crs_from_pj) -
80usize];
+ ["Offset of field: ProjApi::proj_cs_get_axis_count"]
+ [::std::mem::offset_of!(ProjApi, proj_cs_get_axis_count) - 88usize];
+ ["Offset of field: ProjApi::proj_destroy"]
+ [::std::mem::offset_of!(ProjApi, proj_destroy) - 96usize];
+ ["Offset of field: ProjApi::proj_errno"]
+ [::std::mem::offset_of!(ProjApi, proj_errno) - 104usize];
+ ["Offset of field: ProjApi::proj_errno_reset"]
+ [::std::mem::offset_of!(ProjApi, proj_errno_reset) - 112usize];
+ ["Offset of field: ProjApi::proj_info"][::std::mem::offset_of!(ProjApi,
proj_info) - 120usize];
+ ["Offset of field: ProjApi::proj_log_level"]
+ [::std::mem::offset_of!(ProjApi, proj_log_level) - 128usize];
+ ["Offset of field: ProjApi::proj_normalize_for_visualization"]
+ [::std::mem::offset_of!(ProjApi, proj_normalize_for_visualization) -
136usize];
+ ["Offset of field: ProjApi::proj_trans"]
+ [::std::mem::offset_of!(ProjApi, proj_trans) - 144usize];
+ ["Offset of field: ProjApi::proj_trans_array"]
+ [::std::mem::offset_of!(ProjApi, proj_trans_array) - 152usize];
+ ["Offset of field: ProjApi::release"][::std::mem::offset_of!(ProjApi,
release) - 160usize];
+ ["Offset of field: ProjApi::private_data"]
+ [::std::mem::offset_of!(ProjApi, private_data) - 168usize];
+};
+unsafe extern "C" {
+ pub fn proj_dyn_api_init(
+ api: *mut ProjApi,
+ shared_object_path: *const ::std::os::raw::c_char,
+ err_msg: *mut ::std::os::raw::c_char,
+ len: ::std::os::raw::c_int,
+ ) -> ::std::os::raw::c_int;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_data {
+ pub _address: u8,
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_multibyte_data {
+ pub _address: u8,
+}
diff --git a/c/sedona-proj/src/proj_dyn_bindgen.rs
b/c/sedona-proj/src/proj_dyn_bindgen.rs
index 19bcdbe..fbae218 100644
--- a/c/sedona-proj/src/proj_dyn_bindgen.rs
+++ b/c/sedona-proj/src/proj_dyn_bindgen.rs
@@ -18,4 +18,4 @@
#![allow(non_snake_case)]
#![allow(dead_code)]
-include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
+include!(env!("BINDINGS_PATH"));
diff --git a/c/sedona-tg/README.md b/c/sedona-tg/README.md
new file mode 100644
index 0000000..2e0e5b1
--- /dev/null
+++ b/c/sedona-tg/README.md
@@ -0,0 +1,48 @@
+<!---
+ 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.
+-->
+
+# sedona-tg
+
+## How to update the prebuilt bindings
+
+If `SEDONA_TG_BINDINGS_OUTPUT_PATH` envvar is set, the new bindings will be
+written to the specified path. The path is relative to the manifest dir of
+this crate.
+
+```sh
+SEDONA_TG_BINDINGS_OUTPUT_PATH=src/bindings/x86_64-unknown-linux-gnu.rs cargo
build -p sedona-tg
+```
+
+Note that, the generated file doesn't contain the license header, so you need
+to add it manually (hopefully, this will be automated).
+
+### Windows
+
+On Windows, you might need to set `PATH` and `PKG_CONFIG_SYSROOT_DIR` for
+`pkg-config`. For example, when using Rtools45, you progbably need these
+envvars:
+
+```ps1
+$env:PATH = "C:\rtools45\x86_64-w64-mingw32.static.posix\bin;$env:PATH"
+$env:PKG_CONFIG_SYSROOT_DIR = "C:\rtools45\x86_64-w64-mingw32.static.posix\"
+
+$env:SEDONA_TG_BINDINGS_OUTPUT_PATH = "src/bindings/x86_64-pc-windows-gnu.rs"
+
+cargo build -p sedona-tg
+```
diff --git a/c/sedona-tg/build.rs b/c/sedona-tg/build.rs
index 49fc680..a64a482 100644
--- a/c/sedona-tg/build.rs
+++ b/c/sedona-tg/build.rs
@@ -16,8 +16,38 @@
// under the License.
use std::{env, path::PathBuf};
+// Since relative path differs between build.rs and a file under `src/`, use
the
+// absolute path.
+fn get_absolute_path(path: String) -> PathBuf {
+ std::path::absolute(PathBuf::from(path)).expect("Failed to get absolute
path")
+}
+
+fn configure_bindings_path(prebuilt_bindings_path: String) -> (PathBuf, bool) {
+ // If SEDONA_TG_BINDINGS_OUTPUT_PATH is set, honor the explicit output
+ // path to regenerate bindings.
+ if let Ok(output_path) = env::var("SEDONA_TG_BINDINGS_OUTPUT_PATH") {
+ let output_path = get_absolute_path(output_path);
+ if let Some(output_dir) = output_path.parent() {
+ std::fs::create_dir_all(output_dir).expect("Failed to create
parent dirs");
+ }
+ return (output_path, true);
+ }
+
+ // If a prebuilt bindings exists, use it and skip bindgen.
+ let prebuilt_bindings_path = get_absolute_path(prebuilt_bindings_path);
+ if prebuilt_bindings_path.exists() {
+ return (prebuilt_bindings_path.to_path_buf(), false);
+ }
+
+ let output_dir = env::var("OUT_DIR").unwrap();
+ let output_path = PathBuf::from(output_dir).join("bindings.rs");
+
+ (output_path, true)
+}
+
fn main() {
println!("cargo:rerun-if-changed=src/tg/tg.c");
+ println!("cargo:rerun-if-env-changed=SEDONA_TG_BINDINGS_OUTPUT_PATH");
cc::Build::new()
.file("src/tg/tg.c")
@@ -26,6 +56,20 @@ fn main() {
.flag_if_supported("/experimental:c11atomics")
.compile("tg");
+ let target_triple = std::env::var("TARGET").unwrap();
+ let prebuilt_bindings_path = format!("src/bindings/{target_triple}.rs");
+
+ let (bindings_path, generate_bindings) =
configure_bindings_path(prebuilt_bindings_path);
+
+ println!(
+ "cargo::rustc-env=BINDINGS_PATH={}",
+ bindings_path.to_string_lossy()
+ );
+
+ if !generate_bindings {
+ return;
+ }
+
let bindings = bindgen::Builder::default()
.header("src/tg/tg.h")
.generate_comments(false)
@@ -33,9 +77,7 @@ fn main() {
.generate()
.expect("Unable to generate bindings");
- // Write the bindings to the $OUT_DIR/bindings.rs file.
- let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
- .write_to_file(out_path.join("bindings.rs"))
+ .write_to_file(&bindings_path)
.expect("Couldn't write bindings!");
}
diff --git a/c/sedona-tg/src/bindings/x86_64-pc-windows-gnu.rs
b/c/sedona-tg/src/bindings/x86_64-pc-windows-gnu.rs
new file mode 100644
index 0000000..2a9e339
--- /dev/null
+++ b/c/sedona-tg/src/bindings/x86_64-pc-windows-gnu.rs
@@ -0,0 +1,1018 @@
+// 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.
+
+/* automatically generated by rust-bindgen 0.71.1 */
+
+pub const __bool_true_false_are_defined: u32 = 1;
+pub const false_: u32 = 0;
+pub const true_: u32 = 1;
+pub const _VCRT_COMPILER_PREPROCESSOR: u32 = 1;
+pub const _SAL_VERSION: u32 = 20;
+pub const __SAL_H_VERSION: u32 = 180000000;
+pub const _USE_DECLSPECS_FOR_SAL: u32 = 0;
+pub const _USE_ATTRIBUTES_FOR_SAL: u32 = 0;
+pub const _CRT_PACKING: u32 = 8;
+pub const _HAS_EXCEPTIONS: u32 = 1;
+pub const _STL_LANG: u32 = 0;
+pub const _HAS_CXX17: u32 = 0;
+pub const _HAS_CXX20: u32 = 0;
+pub const _HAS_CXX23: u32 = 0;
+pub const _HAS_NODISCARD: u32 = 0;
+pub const WCHAR_MIN: u32 = 0;
+pub const WCHAR_MAX: u32 = 65535;
+pub const WINT_MIN: u32 = 0;
+pub const WINT_MAX: u32 = 65535;
+pub const _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE: u32 = 1;
+pub const _CRT_BUILD_DESKTOP_APP: u32 = 1;
+pub const _ARGMAX: u32 = 100;
+pub const _CRT_INT_MAX: u32 = 2147483647;
+pub const _CRT_FUNCTIONS_REQUIRED: u32 = 1;
+pub const _CRT_HAS_CXX17: u32 = 0;
+pub const _CRT_HAS_C11: u32 = 1;
+pub const _CRT_INTERNAL_NONSTDC_NAMES: u32 = 1;
+pub const __STDC_SECURE_LIB__: u32 = 200411;
+pub const __GOT_SECURE_LIB__: u32 = 200411;
+pub const __STDC_WANT_SECURE_LIB__: u32 = 1;
+pub const _SECURECRT_FILL_BUFFER_PATTERN: u32 = 254;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES: u32 = 1;
+pub const _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_MEMORY: u32 = 0;
+pub const _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES_MEMORY: u32 = 0;
+pub type va_list = *mut ::std::os::raw::c_char;
+unsafe extern "C" {
+ pub fn __va_start(arg1: *mut *mut ::std::os::raw::c_char, ...);
+}
+pub type __vcrt_bool = bool;
+pub type wchar_t = ::std::os::raw::c_ushort;
+unsafe extern "C" {
+ pub fn __security_init_cookie();
+}
+unsafe extern "C" {
+ pub fn __security_check_cookie(_StackCookie: usize);
+}
+unsafe extern "C" {
+ pub fn __report_gsfailure(_StackCookie: usize) -> !;
+}
+unsafe extern "C" {
+ pub static mut __security_cookie: usize;
+}
+pub type int_least8_t = ::std::os::raw::c_schar;
+pub type int_least16_t = ::std::os::raw::c_short;
+pub type int_least32_t = ::std::os::raw::c_int;
+pub type int_least64_t = ::std::os::raw::c_longlong;
+pub type uint_least8_t = ::std::os::raw::c_uchar;
+pub type uint_least16_t = ::std::os::raw::c_ushort;
+pub type uint_least32_t = ::std::os::raw::c_uint;
+pub type uint_least64_t = ::std::os::raw::c_ulonglong;
+pub type int_fast8_t = ::std::os::raw::c_schar;
+pub type int_fast16_t = ::std::os::raw::c_int;
+pub type int_fast32_t = ::std::os::raw::c_int;
+pub type int_fast64_t = ::std::os::raw::c_longlong;
+pub type uint_fast8_t = ::std::os::raw::c_uchar;
+pub type uint_fast16_t = ::std::os::raw::c_uint;
+pub type uint_fast32_t = ::std::os::raw::c_uint;
+pub type uint_fast64_t = ::std::os::raw::c_ulonglong;
+pub type intmax_t = ::std::os::raw::c_longlong;
+pub type uintmax_t = ::std::os::raw::c_ulonglong;
+pub type __crt_bool = bool;
+unsafe extern "C" {
+ pub fn _invalid_parameter_noinfo();
+}
+unsafe extern "C" {
+ pub fn _invalid_parameter_noinfo_noreturn() -> !;
+}
+unsafe extern "C" {
+ pub fn _invoke_watson(
+ _Expression: *const wchar_t,
+ _FunctionName: *const wchar_t,
+ _FileName: *const wchar_t,
+ _LineNo: ::std::os::raw::c_uint,
+ _Reserved: usize,
+ ) -> !;
+}
+pub type errno_t = ::std::os::raw::c_int;
+pub type wint_t = ::std::os::raw::c_ushort;
+pub type wctype_t = ::std::os::raw::c_ushort;
+pub type __time32_t = ::std::os::raw::c_long;
+pub type __time64_t = ::std::os::raw::c_longlong;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_data_public {
+ pub _locale_pctype: *const ::std::os::raw::c_ushort,
+ pub _locale_mb_cur_max: ::std::os::raw::c_int,
+ pub _locale_lc_codepage: ::std::os::raw::c_uint,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of __crt_locale_data_public"]
+ [::std::mem::size_of::<__crt_locale_data_public>() - 16usize];
+ ["Alignment of __crt_locale_data_public"]
+ [::std::mem::align_of::<__crt_locale_data_public>() - 8usize];
+ ["Offset of field: __crt_locale_data_public::_locale_pctype"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_pctype) -
0usize];
+ ["Offset of field: __crt_locale_data_public::_locale_mb_cur_max"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_mb_cur_max)
- 8usize];
+ ["Offset of field: __crt_locale_data_public::_locale_lc_codepage"]
+ [::std::mem::offset_of!(__crt_locale_data_public, _locale_lc_codepage)
- 12usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_pointers {
+ pub locinfo: *mut __crt_locale_data,
+ pub mbcinfo: *mut __crt_multibyte_data,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of
__crt_locale_pointers"][::std::mem::size_of::<__crt_locale_pointers>() -
16usize];
+ ["Alignment of __crt_locale_pointers"]
+ [::std::mem::align_of::<__crt_locale_pointers>() - 8usize];
+ ["Offset of field: __crt_locale_pointers::locinfo"]
+ [::std::mem::offset_of!(__crt_locale_pointers, locinfo) - 0usize];
+ ["Offset of field: __crt_locale_pointers::mbcinfo"]
+ [::std::mem::offset_of!(__crt_locale_pointers, mbcinfo) - 8usize];
+};
+pub type _locale_t = *mut __crt_locale_pointers;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct _Mbstatet {
+ pub _Wchar: ::std::os::raw::c_ulong,
+ pub _Byte: ::std::os::raw::c_ushort,
+ pub _State: ::std::os::raw::c_ushort,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of _Mbstatet"][::std::mem::size_of::<_Mbstatet>() - 8usize];
+ ["Alignment of _Mbstatet"][::std::mem::align_of::<_Mbstatet>() - 4usize];
+ ["Offset of field: _Mbstatet::_Wchar"][::std::mem::offset_of!(_Mbstatet,
_Wchar) - 0usize];
+ ["Offset of field: _Mbstatet::_Byte"][::std::mem::offset_of!(_Mbstatet,
_Byte) - 4usize];
+ ["Offset of field: _Mbstatet::_State"][::std::mem::offset_of!(_Mbstatet,
_State) - 6usize];
+};
+pub type mbstate_t = _Mbstatet;
+pub type time_t = __time64_t;
+pub type rsize_t = usize;
+unsafe extern "C" {
+ pub fn _errno() -> *mut ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn _set_errno(_Value: ::std::os::raw::c_int) -> errno_t;
+}
+unsafe extern "C" {
+ pub fn _get_errno(_Value: *mut ::std::os::raw::c_int) -> errno_t;
+}
+unsafe extern "C" {
+ pub fn __threadid() -> ::std::os::raw::c_ulong;
+}
+unsafe extern "C" {
+ pub fn __threadhandle() -> usize;
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_point {
+ pub x: f64,
+ pub y: f64,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of tg_point"][::std::mem::size_of::<tg_point>() - 16usize];
+ ["Alignment of tg_point"][::std::mem::align_of::<tg_point>() - 8usize];
+ ["Offset of field: tg_point::x"][::std::mem::offset_of!(tg_point, x) -
0usize];
+ ["Offset of field: tg_point::y"][::std::mem::offset_of!(tg_point, y) -
8usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_segment {
+ pub a: tg_point,
+ pub b: tg_point,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of tg_segment"][::std::mem::size_of::<tg_segment>() - 32usize];
+ ["Alignment of tg_segment"][::std::mem::align_of::<tg_segment>() - 8usize];
+ ["Offset of field: tg_segment::a"][::std::mem::offset_of!(tg_segment, a) -
0usize];
+ ["Offset of field: tg_segment::b"][::std::mem::offset_of!(tg_segment, b) -
16usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_rect {
+ pub min: tg_point,
+ pub max: tg_point,
+}
+#[allow(clippy::unnecessary_operation, clippy::identity_op)]
+const _: () = {
+ ["Size of tg_rect"][::std::mem::size_of::<tg_rect>() - 32usize];
+ ["Alignment of tg_rect"][::std::mem::align_of::<tg_rect>() - 8usize];
+ ["Offset of field: tg_rect::min"][::std::mem::offset_of!(tg_rect, min) -
0usize];
+ ["Offset of field: tg_rect::max"][::std::mem::offset_of!(tg_rect, max) -
16usize];
+};
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_line {
+ _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_ring {
+ _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_poly {
+ _unused: [u8; 0],
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct tg_geom {
+ _unused: [u8; 0],
+}
+pub const tg_geom_type_TG_POINT: tg_geom_type = 1;
+pub const tg_geom_type_TG_LINESTRING: tg_geom_type = 2;
+pub const tg_geom_type_TG_POLYGON: tg_geom_type = 3;
+pub const tg_geom_type_TG_MULTIPOINT: tg_geom_type = 4;
+pub const tg_geom_type_TG_MULTILINESTRING: tg_geom_type = 5;
+pub const tg_geom_type_TG_MULTIPOLYGON: tg_geom_type = 6;
+pub const tg_geom_type_TG_GEOMETRYCOLLECTION: tg_geom_type = 7;
+pub type tg_geom_type = ::std::os::raw::c_int;
+pub const tg_index_TG_DEFAULT: tg_index = 0;
+pub const tg_index_TG_NONE: tg_index = 1;
+pub const tg_index_TG_NATURAL: tg_index = 2;
+pub const tg_index_TG_YSTRIPES: tg_index = 3;
+pub type tg_index = ::std::os::raw::c_int;
+unsafe extern "C" {
+ pub fn tg_geom_new_point(point: tg_point) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_linestring(line: *const tg_line) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_polygon(poly: *const tg_poly) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipoint(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multilinestring(
+ lines: *const *const tg_line,
+ nlines: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipolygon(
+ polys: *const *const tg_poly,
+ npolys: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_geometrycollection(
+ geoms: *const *const tg_geom,
+ ngeoms: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_error(errmsg: *const ::std::os::raw::c_char) -> *mut
tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_clone(geom: *const tg_geom) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_copy(geom: *const tg_geom) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_free(geom: *mut tg_geom);
+}
+unsafe extern "C" {
+ pub fn tg_geom_typeof(geom: *const tg_geom) -> tg_geom_type;
+}
+unsafe extern "C" {
+ pub fn tg_geom_type_string(type_: tg_geom_type) -> *const
::std::os::raw::c_char;
+}
+unsafe extern "C" {
+ pub fn tg_geom_rect(geom: *const tg_geom) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_geom_is_feature(geom: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_is_featurecollection(geom: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_point(geom: *const tg_geom) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_geom_line(geom: *const tg_geom) -> *const tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_geom_poly(geom: *const tg_geom) -> *const tg_poly;
+}
+unsafe extern "C" {
+ pub fn tg_geom_num_points(geom: *const tg_geom) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_point_at(geom: *const tg_geom, index:
::std::os::raw::c_int) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_geom_num_lines(geom: *const tg_geom) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_line_at(geom: *const tg_geom, index: ::std::os::raw::c_int)
-> *const tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_geom_num_polys(geom: *const tg_geom) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_poly_at(geom: *const tg_geom, index: ::std::os::raw::c_int)
-> *const tg_poly;
+}
+unsafe extern "C" {
+ pub fn tg_geom_num_geometries(geom: *const tg_geom) ->
::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_geometry_at(
+ geom: *const tg_geom,
+ index: ::std::os::raw::c_int,
+ ) -> *const tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_extra_json(geom: *const tg_geom) -> *const
::std::os::raw::c_char;
+}
+unsafe extern "C" {
+ pub fn tg_geom_is_empty(geom: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_dims(geom: *const tg_geom) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_has_z(geom: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_has_m(geom: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_z(geom: *const tg_geom) -> f64;
+}
+unsafe extern "C" {
+ pub fn tg_geom_m(geom: *const tg_geom) -> f64;
+}
+unsafe extern "C" {
+ pub fn tg_geom_extra_coords(geom: *const tg_geom) -> *const f64;
+}
+unsafe extern "C" {
+ pub fn tg_geom_num_extra_coords(geom: *const tg_geom) ->
::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_memsize(geom: *const tg_geom) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_search(
+ geom: *const tg_geom,
+ rect: tg_rect,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ geom: *const tg_geom,
+ index: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ );
+}
+unsafe extern "C" {
+ pub fn tg_geom_fullrect(
+ geom: *const tg_geom,
+ min: *mut f64,
+ max: *mut f64,
+ ) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geom_equals(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_intersects(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_disjoint(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_contains(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_within(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_covers(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_coveredby(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_touches(a: *const tg_geom, b: *const tg_geom) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_intersects_rect(a: *const tg_geom, b: tg_rect) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_geom_intersects_xy(a: *const tg_geom, x: f64, y: f64) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geojson(geojson: *const ::std::os::raw::c_char) -> *mut
tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geojsonn(geojson: *const ::std::os::raw::c_char, len:
usize) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geojson_ix(
+ geojson: *const ::std::os::raw::c_char,
+ ix: tg_index,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geojsonn_ix(
+ geojson: *const ::std::os::raw::c_char,
+ len: usize,
+ ix: tg_index,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wkt(wkt: *const ::std::os::raw::c_char) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wktn(wkt: *const ::std::os::raw::c_char, len: usize) ->
*mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wkt_ix(wkt: *const ::std::os::raw::c_char, ix: tg_index)
-> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wktn_ix(
+ wkt: *const ::std::os::raw::c_char,
+ len: usize,
+ ix: tg_index,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wkb(wkb: *const u8, len: usize) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_wkb_ix(wkb: *const u8, len: usize, ix: tg_index) -> *mut
tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_hex(hex: *const ::std::os::raw::c_char) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_hexn(hex: *const ::std::os::raw::c_char, len: usize) ->
*mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_hex_ix(hex: *const ::std::os::raw::c_char, ix: tg_index)
-> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_hexn_ix(
+ hex: *const ::std::os::raw::c_char,
+ len: usize,
+ ix: tg_index,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geobin(geobin: *const u8, len: usize) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_geobin_ix(geobin: *const u8, len: usize, ix: tg_index) ->
*mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse(data: *const ::std::os::raw::c_void, len: usize) -> *mut
tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_parse_ix(
+ data: *const ::std::os::raw::c_void,
+ len: usize,
+ ix: tg_index,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_error(geom: *const tg_geom) -> *const
::std::os::raw::c_char;
+}
+unsafe extern "C" {
+ pub fn tg_geobin_fullrect(
+ geobin: *const u8,
+ len: usize,
+ min: *mut f64,
+ max: *mut f64,
+ ) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_geobin_rect(geobin: *const u8, len: usize) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_geobin_point(geobin: *const u8, len: usize) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_geom_geojson(
+ geom: *const tg_geom,
+ dst: *mut ::std::os::raw::c_char,
+ n: usize,
+ ) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_wkt(geom: *const tg_geom, dst: *mut ::std::os::raw::c_char,
n: usize) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_wkb(geom: *const tg_geom, dst: *mut u8, n: usize) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_hex(geom: *const tg_geom, dst: *mut ::std::os::raw::c_char,
n: usize) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_geobin(geom: *const tg_geom, dst: *mut u8, n: usize) ->
usize;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_point_z(point: tg_point, z: f64) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_point_m(point: tg_point, m: f64) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_point_zm(point: tg_point, z: f64, m: f64) -> *mut
tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_point_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_linestring_z(
+ line: *const tg_line,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_linestring_m(
+ line: *const tg_line,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_linestring_zm(
+ line: *const tg_line,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_linestring_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_polygon_z(
+ poly: *const tg_poly,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_polygon_m(
+ poly: *const tg_poly,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_polygon_zm(
+ poly: *const tg_poly,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_polygon_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipoint_z(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipoint_m(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipoint_zm(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipoint_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multilinestring_z(
+ lines: *const *const tg_line,
+ nlines: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multilinestring_m(
+ lines: *const *const tg_line,
+ nlines: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multilinestring_zm(
+ lines: *const *const tg_line,
+ nlines: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multilinestring_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipolygon_z(
+ polys: *const *const tg_poly,
+ npolys: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipolygon_m(
+ polys: *const *const tg_poly,
+ npolys: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipolygon_zm(
+ polys: *const *const tg_poly,
+ npolys: ::std::os::raw::c_int,
+ extra_coords: *const f64,
+ ncoords: ::std::os::raw::c_int,
+ ) -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_multipolygon_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_geom_new_geometrycollection_empty() -> *mut tg_geom;
+}
+unsafe extern "C" {
+ pub fn tg_point_rect(point: tg_point) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_point_intersects_rect(a: tg_point, b: tg_rect) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_segment_rect(s: tg_segment) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_segment_intersects_segment(a: tg_segment, b: tg_segment) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_rect_expand(rect: tg_rect, other: tg_rect) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_rect_expand_point(rect: tg_rect, point: tg_point) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_rect_center(rect: tg_rect) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_rect_intersects_rect(a: tg_rect, b: tg_rect) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_rect_intersects_point(a: tg_rect, b: tg_point) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_ring_new(points: *const tg_point, npoints:
::std::os::raw::c_int) -> *mut tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_ring_new_ix(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ ix: tg_index,
+ ) -> *mut tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_ring_free(ring: *mut tg_ring);
+}
+unsafe extern "C" {
+ pub fn tg_ring_clone(ring: *const tg_ring) -> *mut tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_ring_copy(ring: *const tg_ring) -> *mut tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_ring_memsize(ring: *const tg_ring) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_ring_rect(ring: *const tg_ring) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_ring_num_points(ring: *const tg_ring) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_ring_point_at(ring: *const tg_ring, index:
::std::os::raw::c_int) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_ring_points(ring: *const tg_ring) -> *const tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_ring_num_segments(ring: *const tg_ring) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_ring_segment_at(ring: *const tg_ring, index:
::std::os::raw::c_int) -> tg_segment;
+}
+unsafe extern "C" {
+ pub fn tg_ring_convex(ring: *const tg_ring) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_ring_clockwise(ring: *const tg_ring) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_ring_index_spread(ring: *const tg_ring) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_ring_index_num_levels(ring: *const tg_ring) ->
::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_ring_index_level_num_rects(
+ ring: *const tg_ring,
+ levelidx: ::std::os::raw::c_int,
+ ) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_ring_index_level_rect(
+ ring: *const tg_ring,
+ levelidx: ::std::os::raw::c_int,
+ rectidx: ::std::os::raw::c_int,
+ ) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_ring_nearest_segment(
+ ring: *const tg_ring,
+ rect_dist: ::std::option::Option<
+ unsafe extern "C" fn(
+ rect: tg_rect,
+ more: *mut ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> f64,
+ >,
+ seg_dist: ::std::option::Option<
+ unsafe extern "C" fn(
+ seg: tg_segment,
+ more: *mut ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> f64,
+ >,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ seg: tg_segment,
+ dist: f64,
+ index: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_ring_line_search(
+ a: *const tg_ring,
+ b: *const tg_line,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ aseg: tg_segment,
+ aidx: ::std::os::raw::c_int,
+ bseg: tg_segment,
+ bidx: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ );
+}
+unsafe extern "C" {
+ pub fn tg_ring_ring_search(
+ a: *const tg_ring,
+ b: *const tg_ring,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ aseg: tg_segment,
+ aidx: ::std::os::raw::c_int,
+ bseg: tg_segment,
+ bidx: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ );
+}
+unsafe extern "C" {
+ pub fn tg_ring_area(ring: *const tg_ring) -> f64;
+}
+unsafe extern "C" {
+ pub fn tg_ring_perimeter(ring: *const tg_ring) -> f64;
+}
+unsafe extern "C" {
+ pub fn tg_line_new(points: *const tg_point, npoints:
::std::os::raw::c_int) -> *mut tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_line_new_ix(
+ points: *const tg_point,
+ npoints: ::std::os::raw::c_int,
+ ix: tg_index,
+ ) -> *mut tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_line_free(line: *mut tg_line);
+}
+unsafe extern "C" {
+ pub fn tg_line_clone(line: *const tg_line) -> *mut tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_line_copy(line: *const tg_line) -> *mut tg_line;
+}
+unsafe extern "C" {
+ pub fn tg_line_memsize(line: *const tg_line) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_line_rect(line: *const tg_line) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_line_num_points(line: *const tg_line) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_line_points(line: *const tg_line) -> *const tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_line_point_at(line: *const tg_line, index:
::std::os::raw::c_int) -> tg_point;
+}
+unsafe extern "C" {
+ pub fn tg_line_num_segments(line: *const tg_line) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_line_segment_at(line: *const tg_line, index:
::std::os::raw::c_int) -> tg_segment;
+}
+unsafe extern "C" {
+ pub fn tg_line_clockwise(line: *const tg_line) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_line_index_spread(line: *const tg_line) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_line_index_num_levels(line: *const tg_line) ->
::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_line_index_level_num_rects(
+ line: *const tg_line,
+ levelidx: ::std::os::raw::c_int,
+ ) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_line_index_level_rect(
+ line: *const tg_line,
+ levelidx: ::std::os::raw::c_int,
+ rectidx: ::std::os::raw::c_int,
+ ) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_line_nearest_segment(
+ line: *const tg_line,
+ rect_dist: ::std::option::Option<
+ unsafe extern "C" fn(
+ rect: tg_rect,
+ more: *mut ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> f64,
+ >,
+ seg_dist: ::std::option::Option<
+ unsafe extern "C" fn(
+ seg: tg_segment,
+ more: *mut ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> f64,
+ >,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ seg: tg_segment,
+ dist: f64,
+ index: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_line_line_search(
+ a: *const tg_line,
+ b: *const tg_line,
+ iter: ::std::option::Option<
+ unsafe extern "C" fn(
+ aseg: tg_segment,
+ aidx: ::std::os::raw::c_int,
+ bseg: tg_segment,
+ bidx: ::std::os::raw::c_int,
+ udata: *mut ::std::os::raw::c_void,
+ ) -> bool,
+ >,
+ udata: *mut ::std::os::raw::c_void,
+ );
+}
+unsafe extern "C" {
+ pub fn tg_line_length(line: *const tg_line) -> f64;
+}
+unsafe extern "C" {
+ pub fn tg_poly_new(
+ exterior: *const tg_ring,
+ holes: *const *const tg_ring,
+ nholes: ::std::os::raw::c_int,
+ ) -> *mut tg_poly;
+}
+unsafe extern "C" {
+ pub fn tg_poly_free(poly: *mut tg_poly);
+}
+unsafe extern "C" {
+ pub fn tg_poly_clone(poly: *const tg_poly) -> *mut tg_poly;
+}
+unsafe extern "C" {
+ pub fn tg_poly_copy(poly: *const tg_poly) -> *mut tg_poly;
+}
+unsafe extern "C" {
+ pub fn tg_poly_memsize(poly: *const tg_poly) -> usize;
+}
+unsafe extern "C" {
+ pub fn tg_poly_exterior(poly: *const tg_poly) -> *const tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_poly_num_holes(poly: *const tg_poly) -> ::std::os::raw::c_int;
+}
+unsafe extern "C" {
+ pub fn tg_poly_hole_at(poly: *const tg_poly, index: ::std::os::raw::c_int)
-> *const tg_ring;
+}
+unsafe extern "C" {
+ pub fn tg_poly_rect(poly: *const tg_poly) -> tg_rect;
+}
+unsafe extern "C" {
+ pub fn tg_poly_clockwise(poly: *const tg_poly) -> bool;
+}
+unsafe extern "C" {
+ pub fn tg_env_set_allocator(
+ malloc: ::std::option::Option<
+ unsafe extern "C" fn(arg1: usize) -> *mut ::std::os::raw::c_void,
+ >,
+ realloc: ::std::option::Option<
+ unsafe extern "C" fn(
+ arg1: *mut ::std::os::raw::c_void,
+ arg2: usize,
+ ) -> *mut ::std::os::raw::c_void,
+ >,
+ free: ::std::option::Option<unsafe extern "C" fn(arg1: *mut
::std::os::raw::c_void)>,
+ );
+}
+unsafe extern "C" {
+ pub fn tg_env_set_index(ix: tg_index);
+}
+unsafe extern "C" {
+ pub fn tg_env_set_index_spread(spread: ::std::os::raw::c_int);
+}
+unsafe extern "C" {
+ pub fn tg_env_set_print_fixed_floats(print: bool);
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_locale_data {
+ pub _address: u8,
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __crt_multibyte_data {
+ pub _address: u8,
+}
diff --git a/c/sedona-tg/src/tg_bindgen.rs b/c/sedona-tg/src/tg_bindgen.rs
index 5d8a395..8810e77 100644
--- a/c/sedona-tg/src/tg_bindgen.rs
+++ b/c/sedona-tg/src/tg_bindgen.rs
@@ -19,4 +19,4 @@
#![allow(non_snake_case)]
#![allow(dead_code)]
-include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
+include!(env!("BINDINGS_PATH"));