FFI for dynamic libraries
This commit is contained in:
10
src/ffi/dynamic_data/libraries/battle_stat_calculator.rs
Normal file
10
src/ffi/dynamic_data/libraries/battle_stat_calculator.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
use crate::dynamic_data::{BattleStatCalculator, Gen7BattleStatCalculator};
|
||||
use crate::ffi::IdentifiablePointer;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn gen_7_battle_stat_calculator_new() -> IdentifiablePointer<Box<dyn BattleStatCalculator>> {
|
||||
let v: Box<dyn BattleStatCalculator> = Box::new(Gen7BattleStatCalculator::new());
|
||||
let id = v.value_identifier();
|
||||
let ptr = Box::into_raw(Box::new(v));
|
||||
IdentifiablePointer::new(ptr, id)
|
||||
}
|
||||
10
src/ffi/dynamic_data/libraries/damage_library.rs
Normal file
10
src/ffi/dynamic_data/libraries/damage_library.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
use crate::dynamic_data::{DamageLibrary, Gen7DamageLibrary};
|
||||
use crate::ffi::IdentifiablePointer;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn gen_7_damage_library_new(randomness: u8) -> IdentifiablePointer<Box<dyn DamageLibrary>> {
|
||||
let v: Box<dyn DamageLibrary> = Box::new(Gen7DamageLibrary::new(randomness == 1));
|
||||
let id = v.value_identifier();
|
||||
let ptr = Box::into_raw(Box::new(v));
|
||||
IdentifiablePointer::new(ptr, id)
|
||||
}
|
||||
23
src/ffi/dynamic_data/libraries/dynamic_library.rs
Normal file
23
src/ffi/dynamic_data/libraries/dynamic_library.rs
Normal file
@@ -0,0 +1,23 @@
|
||||
use crate::dynamic_data::{BattleStatCalculator, DamageLibrary, DynamicLibrary, MiscLibrary, ScriptResolver};
|
||||
use crate::ffi::{IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::StaticData;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn dynamic_library_new(
|
||||
static_data: OwnedPtr<StaticData>,
|
||||
stat_calculator: OwnedPtr<Box<dyn BattleStatCalculator>>,
|
||||
damage_library: OwnedPtr<Box<dyn DamageLibrary>>,
|
||||
misc_library: OwnedPtr<Box<dyn MiscLibrary>>,
|
||||
script_resolver: OwnedPtr<Box<dyn ScriptResolver>>,
|
||||
) -> IdentifiablePointer<DynamicLibrary> {
|
||||
unsafe {
|
||||
Box::new(DynamicLibrary::new(
|
||||
*Box::from_raw(static_data),
|
||||
*Box::from_raw(stat_calculator),
|
||||
*Box::from_raw(damage_library),
|
||||
*Box::from_raw(misc_library),
|
||||
*Box::from_raw(script_resolver),
|
||||
))
|
||||
.into()
|
||||
}
|
||||
}
|
||||
10
src/ffi/dynamic_data/libraries/misc_library.rs
Normal file
10
src/ffi/dynamic_data/libraries/misc_library.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
use crate::dynamic_data::{Gen7MiscLibrary, MiscLibrary};
|
||||
use crate::ffi::IdentifiablePointer;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn gen_7_misc_library_new() -> IdentifiablePointer<Box<dyn MiscLibrary>> {
|
||||
let v: Box<dyn MiscLibrary> = Box::new(Gen7MiscLibrary::new());
|
||||
let id = v.value_identifier();
|
||||
let ptr = Box::into_raw(Box::new(v));
|
||||
IdentifiablePointer::new(ptr, id)
|
||||
}
|
||||
5
src/ffi/dynamic_data/libraries/mod.rs
Normal file
5
src/ffi/dynamic_data/libraries/mod.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
mod battle_stat_calculator;
|
||||
mod damage_library;
|
||||
mod dynamic_library;
|
||||
mod misc_library;
|
||||
mod script_resolver;
|
||||
41
src/ffi/dynamic_data/libraries/script_resolver.rs
Normal file
41
src/ffi/dynamic_data/libraries/script_resolver.rs
Normal file
@@ -0,0 +1,41 @@
|
||||
use crate::dynamic_data::{EmptyScriptResolver, ScriptResolver};
|
||||
use crate::ffi::IdentifiablePointer;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn empty_script_resolver_new() -> IdentifiablePointer<Box<dyn ScriptResolver>> {
|
||||
let v: Box<dyn ScriptResolver> = Box::new(EmptyScriptResolver {
|
||||
identifier: Default::default(),
|
||||
});
|
||||
let id = v.value_identifier();
|
||||
let ptr = Box::into_raw(Box::new(v));
|
||||
IdentifiablePointer::new(ptr, id)
|
||||
}
|
||||
|
||||
#[cfg(feature = "wasm")]
|
||||
mod web_assembly_script_resolver {
|
||||
use crate::dynamic_data::ScriptResolver;
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer};
|
||||
use crate::script_implementations::wasm::script_resolver::WebAssemblyScriptResolver;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn webassembly_script_resolver_new() -> IdentifiablePointer<Box<dyn ScriptResolver>> {
|
||||
let v: Box<dyn ScriptResolver> = WebAssemblyScriptResolver::new();
|
||||
let id = v.value_identifier();
|
||||
let ptr = Box::into_raw(Box::new(v));
|
||||
IdentifiablePointer::new(ptr, id)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn webassembly_script_resolver_load_wasm_from_bytes(
|
||||
ptr: ExternPointer<Box<WebAssemblyScriptResolver>>,
|
||||
arr: *const u8,
|
||||
len: usize,
|
||||
) {
|
||||
unsafe { ptr.as_mut().load_wasm_from_bytes(std::slice::from_raw_parts(arr, len)) }
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn webassembly_script_resolver_finalize(ptr: ExternPointer<Box<WebAssemblyScriptResolver>>) {
|
||||
ptr.as_mut().finalize();
|
||||
}
|
||||
}
|
||||
1
src/ffi/dynamic_data/mod.rs
Normal file
1
src/ffi/dynamic_data/mod.rs
Normal file
@@ -0,0 +1 @@
|
||||
mod libraries;
|
||||
@@ -1,3 +1,4 @@
|
||||
mod dynamic_data;
|
||||
mod static_data;
|
||||
|
||||
type OwnedPtr<T> = *mut T;
|
||||
@@ -121,6 +122,12 @@ pub(self) struct IdentifiablePointer<T> {
|
||||
pub id: ValueIdentifier,
|
||||
}
|
||||
|
||||
impl<T> IdentifiablePointer<T> {
|
||||
pub(self) fn new(ptr: *const T, id: ValueIdentifier) -> Self {
|
||||
Self { ptr, id }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ValueIdentifiable> From<Arc<T>> for IdentifiablePointer<Arc<T>> {
|
||||
fn from(v: Arc<T>) -> Self {
|
||||
let id = v.value_identifier();
|
||||
|
||||
Reference in New Issue
Block a user