pub trait AsPhantomData {
    const PHANTOM: PhantomData<Self> = PhantomData;
    const PHANTOM_COVARIANT: PhantomData<fn() -> Self> = PhantomData;
    const PHANTOM_CONTRA: PhantomData<fn(_: Self)> = PhantomData;
    const PHANTOM_INVARIANT: PhantomData<fn(_: Self) -> Self> = PhantomData;

    fn as_phantom(&self) -> PhantomData<Self> { ... }
    fn as_phantom_covariant(&self) -> PhantomData<fn() -> Self> { ... }
    fn as_phantom_contra(&self) -> PhantomData<fn(_: Self)> { ... }
    fn as_phantom_invariant(&self) -> PhantomData<fn(_: Self) -> Self> { ... }
}
Available on crate feature phantom only.
Expand description

For getting a PhantomData<Self> with a variety of lifetime variances.

Provided Associated Constants

Gets a PhantomData<Self>.

Example
use core_extensions::AsPhantomData;
 
use std::marker::PhantomData;
 
fn get_default<T: Default>(_type: PhantomData<T>) -> T {
    Default::default()
}
 
assert_eq!(get_default(String::PHANTOM), "");
assert_eq!(get_default(Vec::<()>::PHANTOM), vec![]);
 

Constructs a PhantomData<fn() -> T>, a covariant PhantomData.

Example
use core_extensions::{AsPhantomData, CovariantPhantom};
 
struct WithGhost<T> {
    value: T,
    _ghost: CovariantPhantom<T>,
}
 
impl<T> WithGhost<T> {
    const fn new(value: T) -> Self {
        Self {
            value,
            _ghost: T::PHANTOM_COVARIANT,
        }
    }
}

Gets a PhantomData<fn(Self)>, a contravariant PhantomData.

Example
use core_extensions::{AsPhantomData, ContraVariantPhantom};
 
struct WithGhost<T> {
    value: T,
    _ghost: ContraVariantPhantom<T>,
}
 
impl<T> WithGhost<T> {
    const fn new(value: T) -> Self {
        Self {
            value,
            _ghost: T::PHANTOM_CONTRA,
        }
    }
}

Gets a PhantomData<fn(Self) -> Self>, an invariant PhantomData.

Example
use core_extensions::{AsPhantomData, InvariantPhantom};
 
struct WithGhost<T> {
    value: T,
    _ghost: InvariantPhantom<T>,
}
 
impl<T> WithGhost<T> {
    const fn new(value: T) -> Self {
        Self {
            value,
            _ghost: T::PHANTOM_INVARIANT,
        }
    }
}

Provided Methods

Gets a PhantomData<Self>.

Example
use core_extensions::AsPhantomData;
 
use std::marker::PhantomData;
 
fn get_default<T: Default>(_type: PhantomData<T>) -> T {
    Default::default()
}
 
let string = String::new();
let vector = vec![0u8];
 
assert_eq!(get_default(string.as_phantom()), "");
assert_eq!(get_default(vector.as_phantom()), vec![]);
 

Gets a PhantomData<fn() -> Self>, a covariant PhantomData.

Gets a PhantomData<fn(Self)>, a contravariant PhantomData.

Gets a PhantomData<fn(Self) -> Self>, an invariant PhantomData.

Implementors