Rework of FFI, adding a value identifier, so we can keep knowledge of data even when data moves.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -16,13 +16,26 @@ macro_rules! ffi_getter {
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! ffi_stringkey_getter {
|
||||
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 {
|
||||
(
|
||||
$type:ty, $func:ident
|
||||
) => {
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $type:lower _ $func >](ptr: ExternPointer<$type>) -> OwnedPtr<c_char> {
|
||||
extern "C" fn [< $type:lower _ $func >](ptr: ExternPointer<Arc<$type>>) -> OwnedPtr<c_char> {
|
||||
std::ffi::CString::new(ptr.as_ref().$func().str()).unwrap().into_raw()
|
||||
}
|
||||
}
|
||||
@@ -35,11 +48,11 @@ macro_rules! ffi_vec_value_getters {
|
||||
) => {
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<$type>) -> usize {
|
||||
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<Arc<$type>>) -> usize {
|
||||
ptr.as_ref().$func().len()
|
||||
}
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<$type>, index: usize) -> $returns {
|
||||
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<Arc<$type>>, index: usize) -> $returns {
|
||||
*ptr.as_ref().$func().get(index).unwrap()
|
||||
}
|
||||
}
|
||||
@@ -52,21 +65,24 @@ macro_rules! ffi_vec_stringkey_getters {
|
||||
) => {
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<$type>) -> usize {
|
||||
extern "C" fn [< $type:lower _ $func _length>](ptr: ExternPointer<Arc<$type>>) -> usize {
|
||||
ptr.as_ref().$func().len()
|
||||
}
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<$type>, index: usize) -> OwnedPtr<c_char> {
|
||||
extern "C" fn [< $type:lower _ $func _get>](ptr: ExternPointer<Arc<$type>>, index: usize) -> OwnedPtr<c_char> {
|
||||
CString::new(ptr.as_ref().$func().get(index).unwrap().str()).unwrap().into_raw()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
use crate::{ValueIdentifiable, ValueIdentifier};
|
||||
pub(self) use ffi_arc_getter;
|
||||
pub(self) use ffi_arc_stringkey_getter;
|
||||
pub(self) use ffi_getter;
|
||||
pub(self) use ffi_stringkey_getter;
|
||||
pub(self) use ffi_vec_stringkey_getters;
|
||||
pub(self) use ffi_vec_value_getters;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[repr(C)]
|
||||
pub(self) struct ExternPointer<T: ?Sized> {
|
||||
@@ -98,3 +114,45 @@ impl<T> Into<ExternPointer<T>> for *mut T {
|
||||
ExternPointer { ptr: self }
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub(self) struct IdentifiablePointer<T> {
|
||||
pub ptr: *const T,
|
||||
pub id: ValueIdentifier,
|
||||
}
|
||||
|
||||
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(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{Ability, EffectParameter};
|
||||
use crate::StringKey;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_new(
|
||||
@@ -10,7 +11,7 @@ unsafe extern "C" fn ability_new(
|
||||
effect: *const c_char,
|
||||
parameters: *const OwnedPtr<EffectParameter>,
|
||||
parameters_length: usize,
|
||||
) -> OwnedPtr<Ability> {
|
||||
) -> IdentifiablePointer<Arc<Ability>> {
|
||||
let parameters = std::slice::from_raw_parts(parameters, parameters_length);
|
||||
let mut parameters_vec: Vec<EffectParameter> = Vec::with_capacity(parameters_length);
|
||||
for parameter in parameters {
|
||||
@@ -20,34 +21,37 @@ unsafe extern "C" fn ability_new(
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
let effect: StringKey = CStr::from_ptr(effect).to_str().unwrap().into();
|
||||
|
||||
Box::into_raw(Box::new(Ability::new(&name, &effect, parameters_vec)))
|
||||
Arc::new(Ability::new(&name, &effect, parameters_vec)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_drop(ptr: OwnedPtr<Ability>) {
|
||||
unsafe extern "C" fn ability_drop(ptr: OwnedPtr<Arc<Ability>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_name(ptr: ExternPointer<Ability>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn ability_name(ptr: ExternPointer<Arc<Ability>>) -> OwnedPtr<c_char> {
|
||||
CString::new(ptr.as_ref().name().str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_effect(ptr: ExternPointer<Ability>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn ability_effect(ptr: ExternPointer<Arc<Ability>>) -> OwnedPtr<c_char> {
|
||||
CString::new(ptr.as_ref().effect().str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_parameter_length(ptr: ExternPointer<Ability>) -> usize {
|
||||
unsafe extern "C" fn ability_parameter_length(ptr: ExternPointer<Arc<Ability>>) -> usize {
|
||||
ptr.as_ref().parameters().len()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn ability_parameter_get(ptr: ExternPointer<Ability>, index: usize) -> BorrowedPtr<EffectParameter> {
|
||||
unsafe extern "C" fn ability_parameter_get(
|
||||
ptr: ExternPointer<Arc<Ability>>,
|
||||
index: usize,
|
||||
) -> IdentifiablePointer<EffectParameter> {
|
||||
if let Some(p) = ptr.as_ref().parameters().get(index) {
|
||||
p as *const EffectParameter
|
||||
(p as *const EffectParameter).into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use crate::ffi::{ffi_getter, ffi_vec_stringkey_getters, ffi_vec_value_getters, BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{
|
||||
ffi_arc_getter, ffi_vec_stringkey_getters, ffi_vec_value_getters, BorrowedPtr, ExternPointer, IdentifiablePointer,
|
||||
OwnedPtr,
|
||||
};
|
||||
use crate::static_data::{Form, LearnableMoves, StaticStatisticSet, TypeIdentifier};
|
||||
use crate::StringKey;
|
||||
use hashbrown::HashSet;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn form_new(
|
||||
@@ -21,7 +25,7 @@ unsafe extern "C" fn form_new(
|
||||
moves: OwnedPtr<LearnableMoves>,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> OwnedPtr<Form> {
|
||||
) -> IdentifiablePointer<Arc<Form>> {
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
|
||||
let abilities = std::slice::from_raw_parts(abilities, abilities_length);
|
||||
@@ -41,7 +45,7 @@ unsafe extern "C" fn form_new(
|
||||
flags_set.insert(CStr::from_ptr(*flag).to_str().unwrap().into());
|
||||
}
|
||||
|
||||
Box::into_raw(Box::new(Form::new(
|
||||
Arc::new(Form::new(
|
||||
&name,
|
||||
height,
|
||||
weight,
|
||||
@@ -52,35 +56,39 @@ unsafe extern "C" fn form_new(
|
||||
hidden_abilities_vec,
|
||||
*Box::from_raw(moves),
|
||||
flags_set,
|
||||
)))
|
||||
))
|
||||
.into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn form_drop(ptr: OwnedPtr<Form>) {
|
||||
unsafe extern "C" fn form_drop(ptr: OwnedPtr<Arc<Form>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn form_name(ptr: ExternPointer<Form>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn form_name(ptr: ExternPointer<Arc<Form>>) -> OwnedPtr<c_char> {
|
||||
let name = ptr.as_ref().name();
|
||||
CString::new(name.str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
ffi_getter!(Form, height, f32);
|
||||
ffi_getter!(Form, weight, f32);
|
||||
ffi_getter!(Form, base_experience, u32);
|
||||
ffi_arc_getter!(Form, height, f32);
|
||||
ffi_arc_getter!(Form, weight, f32);
|
||||
ffi_arc_getter!(Form, base_experience, u32);
|
||||
|
||||
ffi_vec_value_getters!(Form, types, TypeIdentifier);
|
||||
|
||||
ffi_getter!(Form, base_stats, BorrowedPtr<StaticStatisticSet<u16>>);
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn form_base_stats(ptr: ExternPointer<Arc<Form>>) -> IdentifiablePointer<StaticStatisticSet<u16>> {
|
||||
(ptr.as_ref().base_stats() as *const StaticStatisticSet<u16>).into()
|
||||
}
|
||||
|
||||
ffi_vec_stringkey_getters!(Form, abilities);
|
||||
ffi_vec_stringkey_getters!(Form, hidden_abilities);
|
||||
|
||||
ffi_getter!(Form, moves, BorrowedPtr<LearnableMoves>);
|
||||
ffi_arc_getter!(Form, moves, BorrowedPtr<LearnableMoves>);
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn form_has_flag(ptr: ExternPointer<Form>, flag: *const c_char) -> u8 {
|
||||
unsafe extern "C" fn form_has_flag(ptr: ExternPointer<Arc<Form>>, flag: *const c_char) -> u8 {
|
||||
let flag = CStr::from_ptr(flag).into();
|
||||
if ptr.as_ref().has_flag(&flag) {
|
||||
1
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::ffi::{ffi_getter, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ffi_arc_getter, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{BattleItemCategory, Item, ItemCategory};
|
||||
use crate::StringKey;
|
||||
use hashbrown::HashSet;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn item_new(
|
||||
@@ -13,33 +14,33 @@ unsafe extern "C" fn item_new(
|
||||
price: i32,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> OwnedPtr<Item> {
|
||||
) -> IdentifiablePointer<Arc<Item>> {
|
||||
let flags = std::slice::from_raw_parts(flags, flags_length);
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
let mut flags_set: HashSet<StringKey> = HashSet::with_capacity(flags_length);
|
||||
for flag in flags {
|
||||
flags_set.insert(CStr::from_ptr(*flag).to_str().unwrap().into());
|
||||
}
|
||||
Box::into_raw(Box::new(Item::new(&name, category, battle_category, price, flags_set)))
|
||||
Arc::new(Item::new(&name, category, battle_category, price, flags_set)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn item_drop(ptr: OwnedPtr<Item>) {
|
||||
unsafe extern "C" fn item_drop(ptr: OwnedPtr<Arc<Item>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn item_name(ptr: ExternPointer<Item>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn item_name(ptr: ExternPointer<Arc<Item>>) -> OwnedPtr<c_char> {
|
||||
let name = ptr.as_ref().name();
|
||||
CString::new(name.str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
ffi_getter!(Item, category, ItemCategory);
|
||||
ffi_getter!(Item, battle_category, BattleItemCategory);
|
||||
ffi_getter!(Item, price, i32);
|
||||
ffi_arc_getter!(Item, category, ItemCategory);
|
||||
ffi_arc_getter!(Item, battle_category, BattleItemCategory);
|
||||
ffi_arc_getter!(Item, price, i32);
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn item_has_flag(ptr: ExternPointer<Item>, flag: *const c_char) -> u8 {
|
||||
unsafe extern "C" fn item_has_flag(ptr: ExternPointer<Arc<Item>>, flag: *const c_char) -> u8 {
|
||||
let flag = CStr::from_ptr(flag).into();
|
||||
if ptr.as_ref().has_flag(&flag) {
|
||||
1
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
use crate::defines::LevelInt;
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{GrowthRate, GrowthRateLibrary};
|
||||
use std::ffi::{c_char, CStr};
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn growth_rate_library_new(capacity: usize) -> OwnedPtr<GrowthRateLibrary> {
|
||||
Box::into_raw(Box::new(GrowthRateLibrary::new(capacity)))
|
||||
extern "C" fn growth_rate_library_new(capacity: usize) -> IdentifiablePointer<GrowthRateLibrary> {
|
||||
Box::new(GrowthRateLibrary::new(capacity)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use crate::defines::LevelInt;
|
||||
use crate::ffi::{ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::LibrarySettings;
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn library_settings_new(max_level: LevelInt) -> OwnedPtr<LibrarySettings> {
|
||||
Box::into_raw(Box::new(LibrarySettings::new(max_level)))
|
||||
extern "C" fn library_settings_new(max_level: LevelInt) -> IdentifiablePointer<LibrarySettings> {
|
||||
Box::new(LibrarySettings::new(max_level)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -4,7 +4,7 @@ mod nature_library;
|
||||
mod static_data;
|
||||
mod type_library;
|
||||
|
||||
use crate::ffi::{BorrowedPtr, OwnedPtr};
|
||||
use crate::ffi::{BorrowedPtr, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::*;
|
||||
use std::ffi::{c_char, CStr};
|
||||
use std::ptr::drop_in_place;
|
||||
@@ -14,8 +14,8 @@ macro_rules! library_interface {
|
||||
($library_type:ty, $return_type:ty) => {
|
||||
paste::paste! {
|
||||
#[no_mangle]
|
||||
extern "C" fn [< $library_type:snake _new >](capacity: usize) -> OwnedPtr<$library_type> {
|
||||
Box::into_raw(Box::new($library_type::new(capacity)))
|
||||
extern "C" fn [< $library_type:snake _new >](capacity: usize) -> IdentifiablePointer<$library_type> {
|
||||
Box::new($library_type::new(capacity)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -24,7 +24,7 @@ macro_rules! library_interface {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn [< $library_type:snake _add >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>, value: OwnedPtr<$return_type>) {
|
||||
unsafe extern "C" fn [< $library_type:snake _add >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>, value: OwnedPtr<Arc<$return_type>>) {
|
||||
let lib = ptr.as_mut().unwrap();
|
||||
lib.add(&CStr::from_ptr(key).into(), *Box::from_raw(value));
|
||||
}
|
||||
@@ -36,13 +36,13 @@ macro_rules! library_interface {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn [< $library_type:snake _get >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) -> BorrowedPtr<$return_type> {
|
||||
unsafe extern "C" fn [< $library_type:snake _get >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) -> IdentifiablePointer<Arc<$return_type>> {
|
||||
let lib = ptr.as_mut().unwrap();
|
||||
let v = lib.get(&CStr::from_ptr(key).into());
|
||||
if let Some(value) = v {
|
||||
Arc::as_ptr(value)
|
||||
value.clone().into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{Nature, NatureLibrary};
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn nature_library_new(capacity: usize) -> OwnedPtr<NatureLibrary> {
|
||||
Box::into_raw(Box::new(NatureLibrary::new(capacity)))
|
||||
extern "C" fn nature_library_new(capacity: usize) -> IdentifiablePointer<NatureLibrary> {
|
||||
Box::new(NatureLibrary::new(capacity)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -18,31 +18,30 @@ unsafe extern "C" fn nature_library_drop(ptr: OwnedPtr<NatureLibrary>) {
|
||||
unsafe extern "C" fn nature_library_load_nature(
|
||||
ptr: ExternPointer<NatureLibrary>,
|
||||
name: BorrowedPtr<c_char>,
|
||||
nature: OwnedPtr<Nature>,
|
||||
nature: OwnedPtr<Arc<Nature>>,
|
||||
) {
|
||||
ptr.as_mut()
|
||||
.load_nature(CStr::from_ptr(name).into(), *Box::from_raw(nature))
|
||||
.load_nature(CStr::from_ptr(name).into(), nature.as_ref().unwrap().clone())
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn nature_library_get_nature(
|
||||
ptr: ExternPointer<NatureLibrary>,
|
||||
name: BorrowedPtr<c_char>,
|
||||
) -> BorrowedPtr<Nature> {
|
||||
) -> IdentifiablePointer<Arc<Nature>> {
|
||||
if let Some(nature) = ptr.as_ref().get_nature(&CStr::from_ptr(name).into()) {
|
||||
Arc::into_raw(nature.clone())
|
||||
nature.clone().into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn nature_library_get_nature_name(
|
||||
ptr: ExternPointer<NatureLibrary>,
|
||||
nature: BorrowedPtr<Nature>,
|
||||
nature: BorrowedPtr<Arc<Nature>>,
|
||||
) -> OwnedPtr<c_char> {
|
||||
let arc = Arc::from_raw(nature);
|
||||
CString::new(ptr.as_ref().get_nature_name(&arc).str())
|
||||
CString::new(ptr.as_ref().get_nature_name(nature.as_ref().unwrap()).str())
|
||||
.unwrap()
|
||||
.into_raw()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{
|
||||
AbilityLibrary, GrowthRateLibrary, ItemLibrary, LibrarySettings, MoveLibrary, NatureLibrary, SpeciesLibrary,
|
||||
StaticData, TypeLibrary,
|
||||
@@ -6,8 +6,8 @@ use crate::static_data::{
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_new(settings: OwnedPtr<LibrarySettings>) -> OwnedPtr<StaticData> {
|
||||
Box::into_raw(Box::new(StaticData::new(*Box::from_raw(settings))))
|
||||
unsafe extern "C" fn static_data_new(settings: OwnedPtr<LibrarySettings>) -> IdentifiablePointer<StaticData> {
|
||||
Box::new(StaticData::new(*Box::from_raw(settings))).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -16,41 +16,43 @@ unsafe extern "C" fn static_data_drop(ptr: OwnedPtr<StaticData>) {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_settings(data: ExternPointer<StaticData>) -> BorrowedPtr<LibrarySettings> {
|
||||
data.as_mut().settings() as *const LibrarySettings
|
||||
unsafe extern "C" fn static_data_settings(data: ExternPointer<StaticData>) -> IdentifiablePointer<LibrarySettings> {
|
||||
(data.as_mut().settings() as *const LibrarySettings).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_species(data: ExternPointer<StaticData>) -> BorrowedPtr<SpeciesLibrary> {
|
||||
data.as_mut().species_mut() as *mut SpeciesLibrary
|
||||
unsafe extern "C" fn static_data_species(data: ExternPointer<StaticData>) -> IdentifiablePointer<SpeciesLibrary> {
|
||||
(data.as_mut().species_mut() as *const SpeciesLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_moves(data: ExternPointer<StaticData>) -> BorrowedPtr<MoveLibrary> {
|
||||
data.as_mut().moves_mut() as *mut MoveLibrary
|
||||
unsafe extern "C" fn static_data_moves(data: ExternPointer<StaticData>) -> IdentifiablePointer<MoveLibrary> {
|
||||
(data.as_mut().moves_mut() as *const MoveLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_items(data: ExternPointer<StaticData>) -> BorrowedPtr<ItemLibrary> {
|
||||
data.as_mut().items_mut() as *mut ItemLibrary
|
||||
unsafe extern "C" fn static_data_items(data: ExternPointer<StaticData>) -> IdentifiablePointer<ItemLibrary> {
|
||||
(data.as_mut().items_mut() as *const ItemLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_growth_rates(data: ExternPointer<StaticData>) -> BorrowedPtr<GrowthRateLibrary> {
|
||||
data.as_mut().growth_rates_mut() as *mut GrowthRateLibrary
|
||||
unsafe extern "C" fn static_data_growth_rates(
|
||||
data: ExternPointer<StaticData>,
|
||||
) -> IdentifiablePointer<GrowthRateLibrary> {
|
||||
(data.as_mut().growth_rates_mut() as *const GrowthRateLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_types(data: ExternPointer<StaticData>) -> BorrowedPtr<TypeLibrary> {
|
||||
data.as_mut().types_mut() as *mut TypeLibrary
|
||||
unsafe extern "C" fn static_data_types(data: ExternPointer<StaticData>) -> IdentifiablePointer<TypeLibrary> {
|
||||
(data.as_mut().types_mut() as *const TypeLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_natures(data: ExternPointer<StaticData>) -> BorrowedPtr<NatureLibrary> {
|
||||
data.as_mut().natures_mut() as *mut NatureLibrary
|
||||
unsafe extern "C" fn static_data_natures(data: ExternPointer<StaticData>) -> IdentifiablePointer<NatureLibrary> {
|
||||
(data.as_mut().natures_mut() as *const NatureLibrary).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn static_data_abilities(data: ExternPointer<StaticData>) -> BorrowedPtr<AbilityLibrary> {
|
||||
data.as_mut().abilities_mut() as *mut AbilityLibrary
|
||||
unsafe extern "C" fn static_data_abilities(data: ExternPointer<StaticData>) -> IdentifiablePointer<AbilityLibrary> {
|
||||
(data.as_mut().abilities_mut() as *const AbilityLibrary).into()
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{TypeIdentifier, TypeLibrary};
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn type_library_new(capacity: usize) -> OwnedPtr<TypeLibrary> {
|
||||
Box::into_raw(Box::new(TypeLibrary::new(capacity)))
|
||||
extern "C" fn type_library_new(capacity: usize) -> IdentifiablePointer<TypeLibrary> {
|
||||
Box::new(TypeLibrary::new(capacity)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use crate::ffi::{ExternPointer, OwnedPtr};
|
||||
use crate::static_data::EffectParameter;
|
||||
use crate::StringKey;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
@@ -8,32 +9,31 @@ mod form;
|
||||
mod growth_rate;
|
||||
mod item;
|
||||
mod learnable_moves;
|
||||
mod libraries;
|
||||
mod move_data;
|
||||
mod nature;
|
||||
mod species;
|
||||
mod statistic_set;
|
||||
mod libraries;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_bool(value: u8) -> OwnedPtr<EffectParameter> {
|
||||
Box::into_raw(Box::new(EffectParameter::Bool(value == 1)))
|
||||
Box::into_raw(Box::new((value == 1).into()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_int(value: i64) -> OwnedPtr<EffectParameter> {
|
||||
Box::into_raw(Box::new(EffectParameter::Int(value)))
|
||||
Box::into_raw(Box::new(value.into()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_new_float(value: f32) -> OwnedPtr<EffectParameter> {
|
||||
Box::into_raw(Box::new(EffectParameter::Float(value)))
|
||||
Box::into_raw(Box::new(value.into()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn effect_parameter_new_string(value: *const c_char) -> OwnedPtr<EffectParameter> {
|
||||
Box::into_raw(Box::new(EffectParameter::String(
|
||||
CStr::from_ptr(value).to_str().unwrap().into(),
|
||||
)))
|
||||
let sk: StringKey = CStr::from_ptr(value).to_str().unwrap().into();
|
||||
Box::into_raw(Box::new(sk.into()))
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -44,17 +44,17 @@ unsafe extern "C" fn effect_parameter_drop(ptr: OwnedPtr<EffectParameter>) {
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_type(ptr: ExternPointer<EffectParameter>) -> u8 {
|
||||
match ptr.as_ref() {
|
||||
EffectParameter::Bool(_) => 0,
|
||||
EffectParameter::Int(_) => 1,
|
||||
EffectParameter::Float(_) => 2,
|
||||
EffectParameter::String(_) => 3,
|
||||
EffectParameter::Bool(_, _) => 0,
|
||||
EffectParameter::Int(_, _) => 1,
|
||||
EffectParameter::Float(_, _) => 2,
|
||||
EffectParameter::String(_, _) => 3,
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_bool(ptr: ExternPointer<EffectParameter>) -> u8 {
|
||||
let p = ptr.as_ref();
|
||||
if let EffectParameter::Bool(b) = p {
|
||||
if let EffectParameter::Bool(_, b) = p {
|
||||
return if *b { 1 } else { 0 };
|
||||
}
|
||||
panic!("Unexpected effect parameter. Expected bool, was: {}", p);
|
||||
@@ -63,7 +63,7 @@ extern "C" fn effect_parameter_get_as_bool(ptr: ExternPointer<EffectParameter>)
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_int(ptr: ExternPointer<EffectParameter>) -> i64 {
|
||||
let p = ptr.as_ref();
|
||||
if let EffectParameter::Int(b) = p {
|
||||
if let EffectParameter::Int(_, b) = p {
|
||||
return *b;
|
||||
}
|
||||
panic!("Unexpected effect parameter. Expected int, was: {}", p);
|
||||
@@ -72,7 +72,7 @@ extern "C" fn effect_parameter_get_as_int(ptr: ExternPointer<EffectParameter>) -
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_float(ptr: ExternPointer<EffectParameter>) -> f32 {
|
||||
let p = ptr.as_ref();
|
||||
if let EffectParameter::Float(b) = p {
|
||||
if let EffectParameter::Float(_, b) = p {
|
||||
return *b;
|
||||
}
|
||||
panic!("Unexpected effect parameter. Expected float, was: {}", p);
|
||||
@@ -81,7 +81,7 @@ extern "C" fn effect_parameter_get_as_float(ptr: ExternPointer<EffectParameter>)
|
||||
#[no_mangle]
|
||||
extern "C" fn effect_parameter_get_as_string(ptr: ExternPointer<EffectParameter>) -> OwnedPtr<c_char> {
|
||||
let p = ptr.as_ref();
|
||||
if let EffectParameter::String(b) = p {
|
||||
if let EffectParameter::String(_, b) = p {
|
||||
return CString::new(b.str().to_string()).unwrap().into_raw();
|
||||
}
|
||||
panic!("Unexpected effect parameter. Expected string, was: {}", p);
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::ffi::{ffi_getter, BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ffi_arc_getter, ffi_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{EffectParameter, MoveCategory, MoveData, MoveTarget, SecondaryEffect, TypeIdentifier};
|
||||
use crate::StringKey;
|
||||
use hashbrown::HashSet;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_new(
|
||||
@@ -18,7 +19,7 @@ unsafe extern "C" fn move_data_new(
|
||||
secondary_effect: *mut SecondaryEffect,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> OwnedPtr<MoveData> {
|
||||
) -> IdentifiablePointer<Arc<MoveData>> {
|
||||
let flags = std::slice::from_raw_parts(flags, flags_length);
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
let mut flags_set: HashSet<StringKey> = HashSet::with_capacity(flags_length);
|
||||
@@ -30,7 +31,7 @@ unsafe extern "C" fn move_data_new(
|
||||
} else {
|
||||
Some(*Box::from_raw(secondary_effect))
|
||||
};
|
||||
Box::into_raw(Box::new(MoveData::new(
|
||||
Arc::new(MoveData::new(
|
||||
&name,
|
||||
move_type,
|
||||
category,
|
||||
@@ -41,40 +42,43 @@ unsafe extern "C" fn move_data_new(
|
||||
priority,
|
||||
secondary_effect,
|
||||
flags_set,
|
||||
)))
|
||||
))
|
||||
.into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_drop(ptr: OwnedPtr<MoveData>) {
|
||||
unsafe extern "C" fn move_data_drop(ptr: OwnedPtr<Arc<MoveData>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_name(ptr: ExternPointer<MoveData>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn move_data_name(ptr: ExternPointer<Arc<MoveData>>) -> OwnedPtr<c_char> {
|
||||
let name = ptr.as_ref().name();
|
||||
CString::new(name.str()).unwrap().into_raw()
|
||||
}
|
||||
|
||||
ffi_getter!(MoveData, move_type, TypeIdentifier);
|
||||
ffi_getter!(MoveData, category, MoveCategory);
|
||||
ffi_getter!(MoveData, base_power, u8);
|
||||
ffi_getter!(MoveData, accuracy, u8);
|
||||
ffi_getter!(MoveData, base_usages, u8);
|
||||
ffi_getter!(MoveData, target, MoveTarget);
|
||||
ffi_getter!(MoveData, priority, i8);
|
||||
ffi_arc_getter!(MoveData, move_type, TypeIdentifier);
|
||||
ffi_arc_getter!(MoveData, category, MoveCategory);
|
||||
ffi_arc_getter!(MoveData, base_power, u8);
|
||||
ffi_arc_getter!(MoveData, accuracy, u8);
|
||||
ffi_arc_getter!(MoveData, base_usages, u8);
|
||||
ffi_arc_getter!(MoveData, target, MoveTarget);
|
||||
ffi_arc_getter!(MoveData, priority, i8);
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_secondary_effect(ptr: ExternPointer<MoveData>) -> BorrowedPtr<SecondaryEffect> {
|
||||
unsafe extern "C" fn move_data_secondary_effect(
|
||||
ptr: ExternPointer<Arc<MoveData>>,
|
||||
) -> IdentifiablePointer<SecondaryEffect> {
|
||||
let effect = ptr.as_ref().secondary_effect();
|
||||
if let Some(v) = effect {
|
||||
v as *const SecondaryEffect
|
||||
(v as *const SecondaryEffect).into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_has_flag(ptr: ExternPointer<MoveData>, flag: *const c_char) -> u8 {
|
||||
unsafe extern "C" fn move_data_has_flag(ptr: ExternPointer<Arc<MoveData>>, flag: *const c_char) -> u8 {
|
||||
let flag = CStr::from_ptr(flag).into();
|
||||
if ptr.as_ref().has_flag(&flag) {
|
||||
1
|
||||
@@ -89,18 +93,19 @@ unsafe extern "C" fn secondary_effect_new(
|
||||
effect_name: BorrowedPtr<c_char>,
|
||||
parameters: *mut OwnedPtr<EffectParameter>,
|
||||
parameters_length: usize,
|
||||
) -> OwnedPtr<SecondaryEffect> {
|
||||
) -> IdentifiablePointer<SecondaryEffect> {
|
||||
let parameter_slice = std::slice::from_raw_parts(parameters, parameters_length);
|
||||
let mut parameters = Vec::with_capacity(parameters_length);
|
||||
for parameter in parameter_slice {
|
||||
parameters.push(*Box::from_raw(*parameter))
|
||||
}
|
||||
|
||||
Box::into_raw(Box::new(SecondaryEffect::new(
|
||||
Box::new(SecondaryEffect::new(
|
||||
chance,
|
||||
CStr::from_ptr(effect_name).into(),
|
||||
parameters,
|
||||
)))
|
||||
))
|
||||
.into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -124,10 +129,10 @@ unsafe extern "C" fn secondary_effect_parameter_length(ptr: ExternPointer<Second
|
||||
unsafe extern "C" fn secondary_effect_parameter_get(
|
||||
ptr: ExternPointer<SecondaryEffect>,
|
||||
index: usize,
|
||||
) -> BorrowedPtr<EffectParameter> {
|
||||
) -> IdentifiablePointer<EffectParameter> {
|
||||
if let Some(v) = ptr.as_ref().parameters().get(index) {
|
||||
v as *const EffectParameter
|
||||
(v as *const EffectParameter).into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
use crate::ffi::{ffi_getter, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{Nature, Statistic};
|
||||
use std::ptr::drop_in_place;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn nature_new(
|
||||
@@ -8,24 +9,26 @@ extern "C" fn nature_new(
|
||||
decrease_stat: Statistic,
|
||||
increase_modifier: f32,
|
||||
decrease_modifier: f32,
|
||||
) -> OwnedPtr<Nature> {
|
||||
Box::into_raw(Box::new(Nature::new(
|
||||
increase_stat,
|
||||
decrease_stat,
|
||||
increase_modifier,
|
||||
decrease_modifier,
|
||||
)))
|
||||
) -> IdentifiablePointer<Arc<Nature>> {
|
||||
Nature::new(increase_stat, decrease_stat, increase_modifier, decrease_modifier).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn nature_drop(ptr: OwnedPtr<Nature>) {
|
||||
unsafe extern "C" fn nature_drop(ptr: OwnedPtr<Arc<Nature>>) {
|
||||
drop_in_place(ptr)
|
||||
}
|
||||
|
||||
ffi_getter!(Nature, increased_stat, Statistic);
|
||||
ffi_getter!(Nature, decreased_stat, Statistic);
|
||||
#[no_mangle]
|
||||
extern "C" fn nature_increased_stat(ptr: ExternPointer<Arc<Nature>>) -> Statistic {
|
||||
ptr.as_ref().increased_stat()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn nature_get_stat_modifier(ptr: ExternPointer<Nature>, stat: Statistic) -> f32 {
|
||||
extern "C" fn nature_decreased_stat(ptr: ExternPointer<Arc<Nature>>) -> Statistic {
|
||||
ptr.as_ref().decreased_stat()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn nature_get_stat_modifier(ptr: ExternPointer<Arc<Nature>>, stat: Statistic) -> f32 {
|
||||
ptr.as_ref().get_stat_modifier(stat)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::ffi::{ffi_getter, ffi_stringkey_getter, BorrowedPtr, ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ffi_arc_getter, ffi_arc_stringkey_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{Form, Species};
|
||||
use crate::StringKey;
|
||||
use hashbrown::HashSet;
|
||||
@@ -13,10 +13,10 @@ unsafe extern "C" fn species_new(
|
||||
gender_rate: f32,
|
||||
growth_rate: BorrowedPtr<c_char>,
|
||||
capture_rate: u8,
|
||||
default_form: OwnedPtr<Form>,
|
||||
default_form: OwnedPtr<Arc<Form>>,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> OwnedPtr<Species> {
|
||||
) -> IdentifiablePointer<Arc<Species>> {
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
let growth_rate: StringKey = CStr::from_ptr(growth_rate).to_str().unwrap().into();
|
||||
|
||||
@@ -25,44 +25,48 @@ unsafe extern "C" fn species_new(
|
||||
for flag in flags {
|
||||
flags_set.insert(CStr::from_ptr(*flag).to_str().unwrap().into());
|
||||
}
|
||||
Box::into_raw(Box::new(Species::new(
|
||||
Arc::new(Species::new(
|
||||
id,
|
||||
&name,
|
||||
gender_rate,
|
||||
&growth_rate,
|
||||
capture_rate,
|
||||
*Box::from_raw(default_form),
|
||||
default_form.as_ref().unwrap().clone(),
|
||||
flags_set,
|
||||
)))
|
||||
))
|
||||
.into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn species_drop(ptr: OwnedPtr<Species>) {
|
||||
unsafe extern "C" fn species_drop(ptr: OwnedPtr<Arc<Species>>) {
|
||||
drop_in_place(ptr);
|
||||
}
|
||||
|
||||
ffi_getter!(Species, id, u16);
|
||||
ffi_stringkey_getter!(Species, name);
|
||||
ffi_getter!(Species, gender_rate, f32);
|
||||
ffi_stringkey_getter!(Species, growth_rate);
|
||||
ffi_getter!(Species, capture_rate, u8);
|
||||
ffi_arc_getter!(Species, id, u16);
|
||||
ffi_arc_stringkey_getter!(Species, name);
|
||||
ffi_arc_getter!(Species, gender_rate, f32);
|
||||
ffi_arc_stringkey_getter!(Species, growth_rate);
|
||||
ffi_arc_getter!(Species, capture_rate, u8);
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn species_add_form(
|
||||
species: ExternPointer<Species>,
|
||||
species: ExternPointer<Arc<Species>>,
|
||||
name: BorrowedPtr<c_char>,
|
||||
form: OwnedPtr<Form>,
|
||||
form: OwnedPtr<Arc<Form>>,
|
||||
) {
|
||||
let form = *Box::from_raw(form);
|
||||
let form = form.as_ref().unwrap().clone();
|
||||
species.as_mut().add_form(CStr::from_ptr(name).into(), form)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn species_get_form(species: ExternPointer<Species>, name: BorrowedPtr<c_char>) -> BorrowedPtr<Form> {
|
||||
unsafe extern "C" fn species_get_form(
|
||||
species: ExternPointer<Arc<Species>>,
|
||||
name: BorrowedPtr<c_char>,
|
||||
) -> IdentifiablePointer<Arc<Form>> {
|
||||
let form = species.as_ref().get_form(&CStr::from_ptr(name).into());
|
||||
if let Some(form) = form {
|
||||
Arc::as_ptr(form)
|
||||
form.into()
|
||||
} else {
|
||||
std::ptr::null()
|
||||
IdentifiablePointer::none()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::ffi::{ExternPointer, OwnedPtr};
|
||||
use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::static_data::{StaticStatisticSet, Statistic, StatisticSet};
|
||||
use std::ptr::drop_in_place;
|
||||
|
||||
@@ -14,15 +14,15 @@ extern "C" fn [<statistic_set_ $num_type _new>](
|
||||
special_attack: $num_type,
|
||||
special_defense: $num_type,
|
||||
speed: $num_type,
|
||||
) -> OwnedPtr<StatisticSet<$num_type>> {
|
||||
Box::into_raw(Box::new(StatisticSet::new(
|
||||
) -> IdentifiablePointer<StatisticSet<$num_type>> {
|
||||
Box::new(StatisticSet::new(
|
||||
hp,
|
||||
attack,
|
||||
defense,
|
||||
special_attack,
|
||||
special_defense,
|
||||
speed,
|
||||
)))
|
||||
)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
@@ -73,15 +73,15 @@ extern "C" fn [<static_statistic_set_ $num_type _new>](
|
||||
special_attack: $num_type,
|
||||
special_defense: $num_type,
|
||||
speed: $num_type,
|
||||
) -> OwnedPtr<StaticStatisticSet<$num_type>> {
|
||||
Box::into_raw(Box::new(StaticStatisticSet::new(
|
||||
) -> IdentifiablePointer<StaticStatisticSet<$num_type>> {
|
||||
Box::new(StaticStatisticSet::new(
|
||||
hp,
|
||||
attack,
|
||||
defense,
|
||||
special_attack,
|
||||
special_defense,
|
||||
speed,
|
||||
)))
|
||||
)).into()
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
Reference in New Issue
Block a user