2022-10-14 08:33:19 +00:00
|
|
|
mod dynamic_data;
|
2022-09-18 16:02:13 +00:00
|
|
|
mod static_data;
|
|
|
|
|
|
|
|
type OwnedPtr<T> = *mut T;
|
|
|
|
type BorrowedPtr<T> = *const T;
|
|
|
|
|
|
|
|
macro_rules! ffi_getter {
|
|
|
|
(
|
|
|
|
$type:ty, $func:ident, $returns: ty
|
|
|
|
) => {
|
|
|
|
paste::paste! {
|
|
|
|
#[no_mangle]
|
|
|
|
extern "C" fn [< $type:snake _ $func >](ptr: ExternPointer<$type>) -> $returns {
|
|
|
|
ptr.as_ref().$func()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-10-08 11:15:04 +00:00
|
|
|
macro_rules! ffi_arc_getter {
|
|
|
|
(
|
|
|
|
$type:ty, $func:ident, $returns: ty
|
|
|
|
) => {
|
|
|
|
paste::paste! {
|
|
|
|
#[no_mangle]
|
|
|
|
extern "C" fn [< $type:snake _ $func >](ptr: ExternPointer<Arc<$type>>) -> $returns {
|
|
|
|
ptr.as_ref().$func()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! ffi_arc_stringkey_getter {
|
2022-09-18 16:02:13 +00:00
|
|
|
(
|
|
|
|
$type:ty, $func:ident
|
|
|
|
) => {
|
|
|
|
paste::paste! {
|
|
|
|
#[no_mangle]
|
2022-10-08 11:15:04 +00:00
|
|
|
extern "C" fn [< $type:lower _ $func >](ptr: ExternPointer<Arc<$type>>) -> OwnedPtr<c_char> {
|
2022-09-18 16:02:13 +00:00
|
|
|
std::ffi::CString::new(ptr.as_ref().$func().str()).unwrap().into_raw()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! ffi_vec_value_getters {
|
|
|
|
(
|
|
|
|
$type:ty, $func:ident, $returns: ty
|
|
|
|
) => {
|
|
|
|
paste::paste! {
|
|
|
|
#[no_mangle]
|
2022-10-08 11:15:04 +00:00
|
|
|
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<Arc<$type>>) -> usize {
|
2022-09-18 16:02:13 +00:00
|
|
|
ptr.as_ref().$func().len()
|
|
|
|
}
|
|
|
|
#[no_mangle]
|
2022-10-08 11:15:04 +00:00
|
|
|
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<Arc<$type>>, index: usize) -> $returns {
|
2022-09-18 16:02:13 +00:00
|
|
|
*ptr.as_ref().$func().get(index).unwrap()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! ffi_vec_stringkey_getters {
|
|
|
|
(
|
|
|
|
$type:ident, $func:ident
|
|
|
|
) => {
|
|
|
|
paste::paste! {
|
|
|
|
#[no_mangle]
|
2022-10-08 11:15:04 +00:00
|
|
|
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<Arc<$type>>) -> usize {
|
2022-09-18 16:02:13 +00:00
|
|
|
ptr.as_ref().$func().len()
|
|
|
|
}
|
|
|
|
#[no_mangle]
|
2022-10-08 11:15:04 +00:00
|
|
|
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<Arc<$type>>, index: usize) -> OwnedPtr<c_char> {
|
2022-09-18 16:02:13 +00:00
|
|
|
CString::new(ptr.as_ref().$func().get(index).unwrap().str()).unwrap().into_raw()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-10-08 11:15:04 +00:00
|
|
|
use crate::{ValueIdentifiable, ValueIdentifier};
|
|
|
|
pub(self) use ffi_arc_getter;
|
|
|
|
pub(self) use ffi_arc_stringkey_getter;
|
2022-09-18 16:02:13 +00:00
|
|
|
pub(self) use ffi_getter;
|
|
|
|
pub(self) use ffi_vec_stringkey_getters;
|
|
|
|
pub(self) use ffi_vec_value_getters;
|
2022-10-08 11:15:04 +00:00
|
|
|
use std::sync::Arc;
|
2022-09-18 16:02:13 +00:00
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub(self) struct ExternPointer<T: ?Sized> {
|
|
|
|
ptr: *mut T,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: ?Sized> ExternPointer<T> {
|
|
|
|
pub(self) fn as_ref(&self) -> &T {
|
|
|
|
unsafe {
|
|
|
|
self.ptr.as_ref().expect(&format!(
|
|
|
|
"Given pointer of type '{}' was null",
|
|
|
|
std::any::type_name::<T>()
|
|
|
|
))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(self) fn as_mut(&self) -> &mut T {
|
|
|
|
unsafe {
|
|
|
|
self.ptr.as_mut().expect(&format!(
|
|
|
|
"Given pointer of type '{}' was null",
|
|
|
|
std::any::type_name::<T>()
|
|
|
|
))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> Into<ExternPointer<T>> for *mut T {
|
|
|
|
fn into(self) -> ExternPointer<T> {
|
|
|
|
ExternPointer { ptr: self }
|
|
|
|
}
|
|
|
|
}
|
2022-10-08 11:15:04 +00:00
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub(self) struct IdentifiablePointer<T> {
|
|
|
|
pub ptr: *const T,
|
|
|
|
pub id: ValueIdentifier,
|
|
|
|
}
|
|
|
|
|
2022-10-14 08:33:19 +00:00
|
|
|
impl<T> IdentifiablePointer<T> {
|
|
|
|
pub(self) fn new(ptr: *const T, id: ValueIdentifier) -> Self {
|
|
|
|
Self { ptr, id }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-08 11:15:04 +00:00
|
|
|
impl<T: ValueIdentifiable> From<Arc<T>> for IdentifiablePointer<Arc<T>> {
|
|
|
|
fn from(v: Arc<T>) -> Self {
|
|
|
|
let id = v.value_identifier();
|
|
|
|
Self {
|
|
|
|
ptr: Box::into_raw(Box::new(v)),
|
|
|
|
id,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: ValueIdentifiable> From<Box<T>> for IdentifiablePointer<T> {
|
|
|
|
fn from(v: Box<T>) -> Self {
|
|
|
|
let id = v.value_identifier();
|
|
|
|
Self {
|
|
|
|
ptr: Box::into_raw(v),
|
|
|
|
id,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T: ValueIdentifiable> From<*const T> for IdentifiablePointer<T> {
|
|
|
|
fn from(v: *const T) -> Self {
|
|
|
|
let id = unsafe { v.as_ref() }.unwrap().value_identifier();
|
|
|
|
Self { ptr: v, id }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> IdentifiablePointer<T> {
|
|
|
|
pub fn none() -> Self {
|
|
|
|
Self {
|
|
|
|
ptr: std::ptr::null(),
|
|
|
|
id: Default::default(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|