From e9cb80797df4f70dce7338707ee836f8ea19ddc5 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Wed, 12 Nov 2025 01:12:02 +0100 Subject: [PATCH] ffi: add Rust bindings for point.hpp --- src/wrappers/point.rs | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/wrappers/point.rs diff --git a/src/wrappers/point.rs b/src/wrappers/point.rs new file mode 100644 index 0000000..5cf1d93 --- /dev/null +++ b/src/wrappers/point.rs @@ -0,0 +1,71 @@ +/* + SPDX-License-Identifier: AGPL-3.0-or-later + Copyright (C) 2025 Erick Ahmed +*/ + +use std::os::raw::c_double; + +// FFI bindings + +#[repr(C)] +pub struct PointShape { + _private: [u8; 0], +} + +extern "C" { + pub fn make_point(x: c_double, y: c_double, z: c_double) -> *mut PointShape; + pub fn coord_point( + shape: *const PointShape, + x: *mut c_double, + y: *mut c_double, + z: *mut c_double, + ); + pub fn delete_point(shape: *mut PointShape); +} + +// Safe wrapper + +pub struct Point { + ptr: *mut PointShape, +} + +impl Point { + pub fn new(x: f64, y: f64, z: f64) -> Self { + unsafe { + let ptr = make_point(x, y, z); + if ptr.is_null() { + panic!("Error: null pointer"); + } + Self { ptr } + } + } + + pub fn coordinates(&self) -> (f64, f64, f64) { + unsafe { + let mut x = 0.0; + let mut y = 0.0; + let mut z = 0.0; + + coord_point(self.ptr, &mut x, &mut y, &mut z); + (x, y, z) + } + } +} + +impl Drop for Point { + fn drop(&mut self) { + unsafe { + delete_point(self.ptr); + } + } +} + +impl Clone for Point { + fn clone(&self) -> Self { + let (x, y, z) = self.coordinates(); + Self::new(x, y, z) + } +} + +unsafe impl Send for Point {} +unsafe impl Sync for Point {}