Trait TempRepr

Source
pub unsafe trait TempRepr {
    type Shared<'a>
       where Self: 'a;

    // Required methods
    unsafe fn new_temp(obj: Self::Shared<'_>) -> Self;
    fn get(&self) -> Self::Shared<'_>;
}
Expand description

A trait that specifies that a type is a “temporary representation” of another type, where that other type can depend on a lifetime (via GATs). The standard example is that a raw pointer can be regarded as a temporary representation of a reference. The trait implementation for tuples generalizes this to combinations of more than one pointer/reference, the trait implementation for Option extends it to optional references, etc.

Every type implementing TempRepr can be used in TempInst, which provides a safe API around the temporary representation.

Rather than implementing this trait directly, it is recommended to do so by defining a mapping to and from built-in types, using the safe trait mapped::HasTempRepr.

§Safety

  • The implementation of the trait must ensure that new_temp<'a> followed by get<'b> cannot cause undefined behavior when 'a: 'b. (This essentially restricts Shared<'a> to types that are covariant in 'a.)

  • The above must also hold if a (legal) cast was applied to the result of new_temp.

Required Associated Types§

Source

type Shared<'a> where Self: 'a

The type that Self is a temporary representation of. May contain shared references of lifetime 'a.

Required Methods§

Source

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Converts the given object to its temporary representation.

§Safety

The caller must ensure that the returned object does not outlive the lifetime argument of obj, and that TempReprMut::get_mut or TempReprMut::get_mut_pinned is never called on the result.

(Exception: see the caveat in the safety rules of TempReprMutChk.)

Source

fn get(&self) -> Self::Shared<'_>

Converts from a shared temporary reference back to the original type with a suitably-restricted lifetime.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl TempRepr for ()

Source§

type Shared<'a> = () where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl TempRepr for RangeFull

Source§

type Shared<'a> = RangeFull where Self: 'a

Source§

unsafe fn new_temp(_obj: RangeFull) -> Self

Source§

fn get(&self) -> RangeFull

Source§

impl<T0: TempRepr> TempRepr for (T0,)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>,) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr> TempRepr for Either<T0, T1>

Source§

type Shared<'a> = Either<<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>> where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr> TempRepr for (T0, T1)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr> TempRepr for (T0, T1, T2)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr> TempRepr for (T0, T1, T2, T3)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr> TempRepr for (T0, T1, T2, T3, T4)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr, T7: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6, T7)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>, <T7 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr, T7: TempRepr, T8: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6, T7, T8)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>, <T7 as TempRepr>::Shared<'a>, <T8 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr, T7: TempRepr, T8: TempRepr, T9: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>, <T7 as TempRepr>::Shared<'a>, <T8 as TempRepr>::Shared<'a>, <T9 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr, T7: TempRepr, T8: TempRepr, T9: TempRepr, T10: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>, <T7 as TempRepr>::Shared<'a>, <T8 as TempRepr>::Shared<'a>, <T9 as TempRepr>::Shared<'a>, <T10 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T0: TempRepr, T1: TempRepr, T2: TempRepr, T3: TempRepr, T4: TempRepr, T5: TempRepr, T6: TempRepr, T7: TempRepr, T8: TempRepr, T9: TempRepr, T10: TempRepr, T11: TempRepr> TempRepr for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

Source§

type Shared<'a> = (<T0 as TempRepr>::Shared<'a>, <T1 as TempRepr>::Shared<'a>, <T2 as TempRepr>::Shared<'a>, <T3 as TempRepr>::Shared<'a>, <T4 as TempRepr>::Shared<'a>, <T5 as TempRepr>::Shared<'a>, <T6 as TempRepr>::Shared<'a>, <T7 as TempRepr>::Shared<'a>, <T8 as TempRepr>::Shared<'a>, <T9 as TempRepr>::Shared<'a>, <T10 as TempRepr>::Shared<'a>, <T11 as TempRepr>::Shared<'a>) where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T: TempRepr> TempRepr for Option<T>

Source§

type Shared<'a> = Option<<T as TempRepr>::Shared<'a>> where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T: TempRepr> TempRepr for Range<T>

Source§

type Shared<'a> = Range<<T as TempRepr>::Shared<'a>> where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T: TempRepr> TempRepr for RangeFrom<T>

Source§

type Shared<'a> = RangeFrom<<T as TempRepr>::Shared<'a>> where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Source§

impl<T: TempRepr> TempRepr for RangeTo<T>

Source§

type Shared<'a> = RangeTo<<T as TempRepr>::Shared<'a>> where Self: 'a

Source§

unsafe fn new_temp(obj: Self::Shared<'_>) -> Self

Source§

fn get(&self) -> Self::Shared<'_>

Implementors§

Source§

impl<T: Clone> TempRepr for SelfRepr<T>

Source§

type Shared<'a> = T where Self: 'a

Source§

impl<T: HasTempRepr> TempRepr for MappedTempRepr<T>

Source§

type Shared<'a> = <T as HasTempRepr>::Shared<'a> where Self: 'a

Source§

impl<T: ?Sized + ToOwned<Owned: Clone>> TempRepr for TempCow<T>

Source§

type Shared<'a> = Cow<'a, T> where Self: 'a

Source§

impl<T: ?Sized> TempRepr for TempRef<T>

Source§

type Shared<'a> = &'a T where Self: 'a

Source§

impl<T: ?Sized> TempRepr for TempRefMut<T>

Source§

type Shared<'a> = &'a T where Self: 'a

Source§

impl<T: ?Sized> TempRepr for TempRefPin<T>

Source§

type Shared<'a> = &'a T where Self: 'a