use super::storage::ModuleId;
use crate::{
arch::NativeArch,
image::{Module, ModuleHandle, ModuleScope},
relocation::RelocationArch,
tls::TlsResolver,
};
use alloc::vec::Vec;
use core::{fmt, ops::Deref};
pub struct UnloadedModule<Meta = (), Arch: RelocationArch = NativeArch, Tls: TlsResolver<Arch> = ()>
{
id: ModuleId,
module: ModuleHandle<Arch, Tls>,
_retained: ModuleScope<Arch, Tls>,
meta: Meta,
}
impl<Meta, Arch, Tls> UnloadedModule<Meta, Arch, Tls>
where
Arch: RelocationArch,
Tls: TlsResolver<Arch>,
{
#[inline]
pub(super) const fn new(
id: ModuleId,
module: ModuleHandle<Arch, Tls>,
retained: ModuleScope<Arch, Tls>,
meta: Meta,
) -> Self {
Self {
id,
module,
_retained: retained,
meta,
}
}
#[inline]
pub const fn id(&self) -> ModuleId {
self.id
}
#[inline]
pub fn module(&self) -> &dyn Module<Arch, Tls> {
self.module.as_ref()
}
#[inline]
pub const fn meta(&self) -> &Meta {
&self.meta
}
#[inline]
pub fn into_meta(self) -> Meta {
self.meta
}
}
impl<Meta, Arch, Tls> fmt::Debug for UnloadedModule<Meta, Arch, Tls>
where
Arch: RelocationArch,
Tls: TlsResolver<Arch> + 'static,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("UnloadedModule")
.field("id", &self.id)
.field("name", &self.module().name())
.finish_non_exhaustive()
}
}
pub struct UnloadGroup<Meta = (), Arch: RelocationArch = NativeArch, Tls: TlsResolver<Arch> = ()> {
modules: Vec<UnloadedModule<Meta, Arch, Tls>>,
}
impl<Meta, Arch, Tls> UnloadGroup<Meta, Arch, Tls>
where
Arch: RelocationArch,
Tls: TlsResolver<Arch>,
{
#[inline]
pub(super) fn new(modules: Vec<UnloadedModule<Meta, Arch, Tls>>) -> Self {
Self { modules }
}
}
impl<Meta, Arch, Tls> Deref for UnloadGroup<Meta, Arch, Tls>
where
Arch: RelocationArch,
Tls: TlsResolver<Arch>,
{
type Target = [UnloadedModule<Meta, Arch, Tls>];
#[inline]
fn deref(&self) -> &Self::Target {
&self.modules
}
}
impl<Meta, Arch, Tls> fmt::Debug for UnloadGroup<Meta, Arch, Tls>
where
Arch: RelocationArch,
Tls: TlsResolver<Arch> + 'static,
{
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_list().entries(&self.modules).finish()
}
}