Enum rustc_type_ir::Variance
source · pub enum Variance {
Covariant,
Invariant,
Contravariant,
Bivariant,
}
Variants§
Implementations§
source§impl Variance
impl Variance
sourcepub fn xform(self, v: Variance) -> Variance
pub fn xform(self, v: Variance) -> Variance
a.xform(b)
combines the variance of a context with the
variance of a type with the following meaning. If we are in a
context with variance a
, and we encounter a type argument in
a position with variance b
, then a.xform(b)
is the new
variance with which the argument appears.
Example 1:
*mut Vec<i32>
Here, the “ambient” variance starts as covariant. *mut T
is
invariant with respect to T
, so the variance in which the
Vec<i32>
appears is Covariant.xform(Invariant)
, which
yields Invariant
. Now, the type Vec<T>
is covariant with
respect to its type argument T
, and hence the variance of
the i32
here is Invariant.xform(Covariant)
, which results
(again) in Invariant
.
Example 2:
fn(*const Vec<i32>, *mut Vec<i32)
The ambient variance is covariant. A fn
type is
contravariant with respect to its parameters, so the variance
within which both pointer types appear is
Covariant.xform(Contravariant)
, or Contravariant
. *const T
is covariant with respect to T
, so the variance within
which the first Vec<i32>
appears is
Contravariant.xform(Covariant)
or Contravariant
. The same
is true for its i32
argument. In the *mut T
case, the
variance of Vec<i32>
is Contravariant.xform(Invariant)
,
and hence the outermost type is Invariant
with respect to
Vec<i32>
(and its i32
argument).
Source: Figure 1 of “Taming the Wildcards: Combining Definition- and Use-Site Variance” published in PLDI’11.
Trait Implementations§
source§impl<__CTX> HashStable<__CTX> for Variancewhere
__CTX: HashStableContext,
impl<__CTX> HashStable<__CTX> for Variancewhere __CTX: HashStableContext,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
source§impl PartialEq<Variance> for Variance
impl PartialEq<Variance> for Variance
impl Copy for Variance
impl Eq for Variance
impl StructuralEq for Variance
impl StructuralPartialEq for Variance
Auto Trait Implementations§
impl RefUnwindSafe for Variance
impl Send for Variance
impl Sync for Variance
impl Unpin for Variance
impl UnwindSafe for Variance
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 1 byte
Size for each variant:
Covariant
: 0 bytesInvariant
: 0 bytesContravariant
: 0 bytesBivariant
: 0 bytes