use crate::ffi::collections::NonNullConst;
use crate::ffi::CBaseFn;
use crate::global::{get_interface, get_mut_interface, LockToken};
use crate::library::library_loader::{LibraryLoader, LibraryLoaderABICompat, LibraryLoaderAPI};
use crate::library::{Error, InternalLibrary, Library, LibraryAPI, LibraryType, Loader, Symbol};
use crate::ownership::{BorrowMutable, ImmutableAccessIdentifier, MutableAccessIdentifier, Owned};
use std::ffi::{c_void, CStr};
use std::path::Path;
#[inline]
pub fn register_loader<'loader, L, LT, T>(
_token: &mut LockToken<L>,
loader: &'loader LT,
lib_type: &impl AsRef<str>,
) -> Result<Loader<'static, Owned>, Error>
where
T: LibraryLoaderAPI<'static>,
LibraryLoader<T, Owned>: From<&'loader LT>,
{
LibraryAPI::register_loader(get_mut_interface(), loader, lib_type)
}
#[inline]
pub fn unregister_loader<L>(
_token: &mut LockToken<L>,
loader: Loader<'_, Owned>,
) -> Result<(), Error> {
LibraryAPI::unregister_loader(get_mut_interface(), loader)
}
#[inline]
pub fn get_loader_interface<'loader, L, O, T>(
_token: &mut LockToken<L>,
loader: &Loader<'loader, O>,
) -> Result<LibraryLoader<T, O>, Error>
where
O: ImmutableAccessIdentifier,
T: LibraryLoaderAPI<'loader> + LibraryLoaderABICompat,
{
LibraryAPI::get_loader_interface(get_mut_interface(), loader)
}
#[inline]
pub fn get_loader_handle_from_type<'tok, L>(
_token: &'tok LockToken<L>,
lib_type: &impl AsRef<str>,
) -> Result<Loader<'static, BorrowMutable<'tok>>, Error> {
LibraryAPI::get_loader_handle_from_type(get_interface(), lib_type)
}
#[inline]
pub fn get_loader_handle_from_library<'l, 'library, L, O>(
_token: &'l LockToken<L>,
library: &Library<'library, O>,
) -> Result<Loader<'library, BorrowMutable<'l>>, Error>
where
O: ImmutableAccessIdentifier,
{
LibraryAPI::get_loader_handle_from_library(get_interface(), library)
}
#[inline]
pub fn get_num_loaders<L>(_token: &LockToken<L>) -> usize {
LibraryAPI::get_num_loaders(get_interface())
}
#[inline]
pub fn library_exists<'library, L, O>(_token: &LockToken<L>, library: &Library<'library, O>) -> bool
where
O: ImmutableAccessIdentifier,
{
LibraryAPI::library_exists(get_interface(), library)
}
#[inline]
pub fn type_exists<L>(_token: &LockToken<L>, lib_type: &impl AsRef<str>) -> Result<bool, Error> {
LibraryAPI::type_exists(get_interface(), lib_type)
}
#[inline]
pub fn get_library_types<L>(
_token: &LockToken<L>,
buffer: impl AsMut<[LibraryType]>,
) -> Result<usize, Error> {
LibraryAPI::get_library_types(get_interface(), buffer)
}
#[inline]
pub unsafe fn create_library_handle<L>(_token: &mut LockToken<L>) -> Library<'static, Owned> {
LibraryAPI::create_library_handle(get_mut_interface())
}
#[inline]
pub unsafe fn remove_library_handle<L>(
_token: &mut LockToken<L>,
library: Library<'_, Owned>,
) -> Result<(), Error> {
LibraryAPI::remove_library_handle(get_mut_interface(), library)
}
#[inline]
pub unsafe fn link_library<'library, 'loader, L, O, LO, IO>(
_token: &mut LockToken<L>,
library: &Library<'library, O>,
loader: &Loader<'loader, LO>,
internal: &InternalLibrary<IO>,
) -> Result<(), Error>
where
'loader: 'library,
O: MutableAccessIdentifier,
LO: ImmutableAccessIdentifier,
IO: ImmutableAccessIdentifier,
{
LibraryAPI::link_library(get_mut_interface(), library, loader, internal)
}
#[inline]
pub fn get_internal_library_handle<'library, L, O>(
_token: &LockToken<L>,
library: &Library<'library, O>,
) -> Result<InternalLibrary<O>, Error>
where
O: ImmutableAccessIdentifier,
{
LibraryAPI::get_internal_library_handle(get_interface(), library)
}
#[inline]
pub fn load<L, O>(
_token: &mut LockToken<L>,
loader: &Loader<'static, O>,
path: &impl AsRef<Path>,
) -> Result<Library<'static, Owned>, Error>
where
O: MutableAccessIdentifier,
{
LibraryAPI::load(get_mut_interface(), loader, path)
}
#[inline]
pub fn unload<L>(_token: &mut LockToken<L>, library: Library<'_, Owned>) -> Result<(), Error> {
LibraryAPI::unload(get_mut_interface(), library)
}
#[inline]
pub fn get_data_symbol<'library, 'handle, L, O, U>(
_token: &LockToken<L>,
library: &'handle Library<'library, O>,
symbol: &impl AsRef<CStr>,
caster: impl FnOnce(NonNullConst<c_void>) -> &'library U,
) -> Result<Symbol<'handle, &'library U>, Error>
where
O: ImmutableAccessIdentifier,
{
LibraryAPI::get_data_symbol(get_interface(), library, symbol, caster)
}
#[inline]
pub fn get_function_symbol<'library, 'handle, L, O, U>(
_token: &LockToken<L>,
library: &'handle Library<'library, O>,
symbol: &impl AsRef<CStr>,
caster: impl FnOnce(CBaseFn) -> U,
) -> Result<Symbol<'handle, U>, Error>
where
O: ImmutableAccessIdentifier,
{
LibraryAPI::get_function_symbol(get_interface(), library, symbol, caster)
}