Trait r3_core::kernel::cfg::DelegateKernelStatic   
source · pub trait DelegateKernelStatic<System> {
    type Target;
}Expand description
The marker trait to generate a forwarding implementation of
KernelStatic<System> as well as CfgPhase1<System> and
CfgPhase2<System>.
This is useful for circumventing the orphan rules. Suppose we have a
kernel crate r3_kernel and an application crate app, and r3_kernel
provides a system type System<Traits>, where Traits is a marker type to
be defined in an application crate. For many reasons, static items to
store a kernel state can only be defined in app, where the concrete form
of the kernel is known. This means impl KernelStatic for System<Traits>
has to appear in app, but since both KernelStatic and System are
foreign to app, this is not allowed by the orphan rules.
// r3::kernel::cfg
// ========================
trait KernelStatic<System> {}
// r3_kernel
// ========================
struct System<Traits> { /* ... */ }
// app
// ========================
struct Traits;
impl r3::kernel::cfg::KernelStatic<r3_kernel::System<Traits>>
    for r3_kernel::System<Traits> {} // E0117The above example can be fixed by implementing KernelStatic on Traits
instead and DelegateKernelStatic on System.
// r3::kernel::cfg
// ========================
trait KernelStatic<System> {}
trait DelegateKernelStatic<System> { type Target; }
impl<T, System> KernelStatic<System> for T
    where T: DelegateKernelStatic<System> {}
// r3_kernel
// ========================
struct System<Traits> { /* ... */ }
impl<Traits> DelegateKernelStatic for System<Traits> {
    // Inherit `Traits`'s implementation
    type Target = Traits;
}
// app
// ========================
struct Traits;
impl r3::kernel::cfg::KernelStatic<r3_kernel::System<Traits>>
    for Traits {} // OK