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) -> IdentifiablePointer { Box::new(TypeLibrary::new(capacity)).into() } #[no_mangle] unsafe extern "C" fn type_library_drop(ptr: OwnedPtr) { drop_in_place(ptr); } #[no_mangle] unsafe extern "C" fn type_library_get_type_id( ptr: ExternPointer, key: BorrowedPtr, found: *mut bool, ) -> TypeIdentifier { if let Some(v) = ptr.as_ref().get_type_id(&CStr::from_ptr(key).into()) { *found = true; v } else { *found = false; TypeIdentifier::default() } } #[no_mangle] unsafe extern "C" fn type_library_get_type_name( ptr: ExternPointer, type_id: TypeIdentifier, found: *mut bool, ) -> *mut c_char { if let Some(v) = ptr.as_ref().get_type_name(type_id) { *found = true; CString::new(v.str()).unwrap().into_raw() } else { *found = false; std::ptr::null_mut() } } #[no_mangle] extern "C" fn type_library_get_single_effectiveness( ptr: ExternPointer, attacking: TypeIdentifier, defending: TypeIdentifier, ) -> f32 { ptr.as_ref().get_single_effectiveness(attacking, defending) } #[no_mangle] unsafe extern "C" fn type_library_get_effectiveness( ptr: ExternPointer, attacking: TypeIdentifier, defending: OwnedPtr, defending_length: usize, ) -> f32 { let v = std::slice::from_raw_parts(defending, defending_length); ptr.as_ref().get_effectiveness(attacking, v) } #[no_mangle] unsafe extern "C" fn type_library_register_type( ptr: ExternPointer, name: BorrowedPtr, ) -> TypeIdentifier { ptr.as_mut().register_type(&CStr::from_ptr(name).into()) } #[no_mangle] unsafe extern "C" fn type_library_set_effectiveness( ptr: ExternPointer, attacking: TypeIdentifier, defending: TypeIdentifier, effectiveness: f32, ) { ptr.as_mut().set_effectiveness(attacking, defending, effectiveness); }