Skip to main content

rich_phantoms/
lib.rs

1use core::marker::PhantomData;
2
3/// Is Covariant and always Send/Sync. Construct with `let x = PhantomData`.
4pub type PhantomCovariantAlwaysSendSync<T> = PhantomData<PhantomCoFnWorkaround<T>>;
5#[doc(hidden)]
6pub struct PhantomCoFnWorkaround<T: ?Sized>{_a: fn() -> T}
7
8/// Is Covariant and never Send/Sync. Construct with `let x = PhantomData`.
9pub type PhantomCovariantNeverSendSync<T> = PhantomData<PhantomCoFnWorkaroundNonSync<T>>;
10#[doc(hidden)]
11pub struct PhantomCoFnWorkaroundNonSync<T: ?Sized>{_a: fn() -> T, _b: *const ()}
12
13/// Is Covariant and is Send/Sync if and only if T is. Construct with `let x = PhantomData`.
14pub type PhantomCovariantInheritSendSync<T> = PhantomData<PhantomCoFnWorkaroundInheritSync<T>>;
15#[doc(hidden)]
16pub struct PhantomCoFnWorkaroundInheritSync<T: ?Sized>{_a: fn() -> T, _b: T}
17
18/// Is Contravariant and always Send/Sync. Construct with `let x = PhantomData`.
19pub type PhantomContravariantAlwaysSendSync<T> = PhantomData<PhantomContraFnWorkaround<T>>;
20#[doc(hidden)]
21pub struct PhantomContraFnWorkaround<T: ?Sized>{_a: fn(T)}
22
23/// Is Contravariant and never Send/Sync. Construct with `let x = PhantomData`.
24pub type PhantomContravariantNeverSendSync<T> = PhantomData<PhantomContravariantNeverSendSyncWorkaround<T>>;
25#[doc(hidden)]
26pub struct PhantomContravariantNeverSendSyncWorkaround<T: ?Sized>{_a: fn(T), _b: *const ()}
27
28/// Is Contravariant and is Send/Sync if and only if T is. Construct with `let x = PhantomData`.
29pub type PhantomContravariantInheritSendSync<T> = PhantomData<PhantomContravariantInheritSendSyncWorkaround<T>>;
30#[doc(hidden)]
31pub struct PhantomContravariantInheritSendSyncWorkaround<T: ?Sized>{_a: fn(T), _b: *const ()}
32// These impls are safe because no `PhantomContravariantInheritSendSyncWorkaround` should ever actually be created.
33unsafe impl<T: Send + ?Sized> Send for PhantomContravariantInheritSendSyncWorkaround<T> {}
34unsafe impl<T: Sync + ?Sized> Sync for PhantomContravariantInheritSendSyncWorkaround<T> {}
35
36/// Is Invariant and always Send/Sync. Construct with `let x = PhantomData`.
37pub type PhantomInvariantAlwaysSendSync<T> = PhantomData<PhantomInvariantAlwaysSendSyncWorkaround<T>>;
38#[doc(hidden)]
39pub struct PhantomInvariantAlwaysSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T}
40
41/// Is Invariant and never Send/Sync. Construct with `let x = PhantomData`.
42pub type PhantomInvariantNeverSendSync<T> = PhantomData<PhantomInvariantNeverSendSyncWorkaround<T>>;
43#[doc(hidden)]
44pub struct PhantomInvariantNeverSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T, _b: *const ()}
45
46/// Is Invariant and is Send/Sync if and only if T is. Construct with `let x = PhantomData`.
47pub type PhantomInvariantInheritSendSync<T> = PhantomData<PhantomInvariantInheritSendSyncWorkaround<T>>;
48#[doc(hidden)]
49pub struct PhantomInvariantInheritSendSyncWorkaround<T: ?Sized>{_a: fn(T) -> T, _b: T}