ffi: add Rust bindings for point.hpp

This commit is contained in:
2025-11-12 01:12:02 +01:00
parent ddc2fb4172
commit e9cb80797d
+71
View File
@@ -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 {}