#[allow(unused_imports)]
use paste::paste;
#[macro_export]
macro_rules! make_collection {
($collection_type_name:ident, $item_type_name:ident) => {
paste! {
pub type [<$collection_type_name Ptr>] = ergo_lib_c_core::collections::CollectionPtr<$item_type_name>;
pub type [<Const $collection_type_name Ptr>] = ergo_lib_c_core::collections::ConstCollectionPtr<$item_type_name>;
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $collection_type_name:snake _new>](
collection_ptr_out: *mut [<$collection_type_name Ptr>],
) {
#[allow(clippy::unwrap_used)]
ergo_lib_c_core::collections::collection_new(collection_ptr_out).unwrap();
}
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $collection_type_name:snake _delete>](ptr_out: [<$collection_type_name Ptr>]) {
ergo_lib_c_core::collections::collection_delete(ptr_out)
}
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $collection_type_name:snake _len>](
collection_ptr: [<Const $collection_type_name Ptr>],
) -> usize {
#[allow(clippy::unwrap_used)]
ergo_lib_c_core::collections::collection_len(collection_ptr).unwrap()
}
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $collection_type_name:snake _get>](
collection_ptr: [<Const $collection_type_name Ptr>],
index: usize,
element_ptr_out: *mut [<$item_type_name Ptr>],
) -> $crate::ReturnOption {
match ergo_lib_c_core::collections::collection_get(collection_ptr, index, element_ptr_out) {
Ok(is_some) => $crate::ReturnOption {
is_some,
error: std::ptr::null_mut(),
},
Err(e) => $crate::ReturnOption {
is_some: false, error: Error::c_api_from(Err(e)),
},
}
}
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $collection_type_name:snake _add>](
element_ptr: [<Const $item_type_name Ptr>],
collection_ptr_out: [<$collection_type_name Ptr>],
) {
#[allow(clippy::unwrap_used)]
ergo_lib_c_core::collections::collection_add(collection_ptr_out, element_ptr).unwrap();
}
}
};
}
#[macro_export]
macro_rules! make_ffi_eq {
($type_name:ident) => {
paste! {
#[no_mangle]
pub unsafe extern "C" fn [<ergo_lib_ $type_name:snake _eq>](
[< $type_name:snake _ptr_0>]: [< Const $type_name Ptr>],
[< $type_name:snake _ptr_1>]: [< Const $type_name Ptr>],
) -> bool {
ergo_lib_c_core::util::deref_eq([< $type_name:snake _ptr_0>], [< $type_name:snake _ptr_1>])
}
}
};
}