use std::marker::PhantomData;
use crate::logical::registered::Registered;
use crate::logical::registry::Registry;
use crate::raw::RegistryEntry;
pub struct Registration<
R: Registry + ?Sized,
T: Registered<R> + ?Sized
> {
#[allow(dead_code)]
raw_entry: &'static RegistryEntry,
registry: PhantomData<fn(R)>,
marker: PhantomData<fn(T) -> T>
}
impl<
R: Registry + ?Sized,
T: Registered<R> + ?Sized
> Registration<R, T> {
#[doc(hidden)]
pub const unsafe fn new(raw_entry: &'static RegistryEntry) -> Self {
Registration {
raw_entry,
registry: PhantomData,
marker: PhantomData,
}
}
}
#[macro_export]
macro_rules! registration {
($registry_type:ty, $registered_type:ty) => {
{
use $crate::reexports::linkme::distributed_slice;
use $crate::raw::{RegistryEntry, REGISTRY};
use $crate::{Registration};
#[distributed_slice(REGISTRY)]
#[linkme(crate=$crate::reexports::linkme)]
static REGISTRATION: RegistryEntry = RegistryEntry::new::<$registry_type, $registered_type>();
unsafe { Registration::<$registry_type, $registered_type>::new(®ISTRATION) }
}
};
}