pub trait Projectable<'tcx, Prov: Provenance>: Sized + Debug {
    // Required methods
    fn layout(&self) -> TyAndLayout<'tcx>;
    fn meta(&self) -> MemPlaceMeta<Prov>;
    fn offset_with_meta<M: Machine<'tcx, Provenance = Prov>>(
        &self,
        offset: Size,
        mode: OffsetMode,
        meta: MemPlaceMeta<Prov>,
        layout: TyAndLayout<'tcx>,
        ecx: &InterpCx<'tcx, M>,
    ) -> InterpResult<'tcx, Self>;
    fn to_op<M: Machine<'tcx, Provenance = Prov>>(
        &self,
        ecx: &InterpCx<'tcx, M>,
    ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>;
    // Provided methods
    fn len<M: Machine<'tcx, Provenance = Prov>>(
        &self,
        ecx: &InterpCx<'tcx, M>,
    ) -> InterpResult<'tcx, u64> { ... }
    fn offset<M: Machine<'tcx, Provenance = Prov>>(
        &self,
        offset: Size,
        layout: TyAndLayout<'tcx>,
        ecx: &InterpCx<'tcx, M>,
    ) -> InterpResult<'tcx, Self> { ... }
    fn transmute<M: Machine<'tcx, Provenance = Prov>>(
        &self,
        layout: TyAndLayout<'tcx>,
        ecx: &InterpCx<'tcx, M>,
    ) -> InterpResult<'tcx, Self> { ... }
}Expand description
A thing that we can project into, and that has a layout.
Required Methods§
sourcefn layout(&self) -> TyAndLayout<'tcx>
 
fn layout(&self) -> TyAndLayout<'tcx>
Get the layout.
sourcefn meta(&self) -> MemPlaceMeta<Prov>
 
fn meta(&self) -> MemPlaceMeta<Prov>
Get the metadata of a wide value.
sourcefn offset_with_meta<M: Machine<'tcx, Provenance = Prov>>(
    &self,
    offset: Size,
    mode: OffsetMode,
    meta: MemPlaceMeta<Prov>,
    layout: TyAndLayout<'tcx>,
    ecx: &InterpCx<'tcx, M>,
) -> InterpResult<'tcx, Self>
 
fn offset_with_meta<M: Machine<'tcx, Provenance = Prov>>( &self, offset: Size, mode: OffsetMode, meta: MemPlaceMeta<Prov>, layout: TyAndLayout<'tcx>, ecx: &InterpCx<'tcx, M>, ) -> InterpResult<'tcx, Self>
Offset the value by the given amount, replacing the layout and metadata.
sourcefn to_op<M: Machine<'tcx, Provenance = Prov>>(
    &self,
    ecx: &InterpCx<'tcx, M>,
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
 
fn to_op<M: Machine<'tcx, Provenance = Prov>>( &self, ecx: &InterpCx<'tcx, M>, ) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>>
Convert this to an OpTy. This might be an irreversible transformation, but is useful for
reading from this thing.
Provided Methods§
sourcefn len<M: Machine<'tcx, Provenance = Prov>>(
    &self,
    ecx: &InterpCx<'tcx, M>,
) -> InterpResult<'tcx, u64>
 
fn len<M: Machine<'tcx, Provenance = Prov>>( &self, ecx: &InterpCx<'tcx, M>, ) -> InterpResult<'tcx, u64>
Get the length of a slice/string/array stored here.
fn offset<M: Machine<'tcx, Provenance = Prov>>( &self, offset: Size, layout: TyAndLayout<'tcx>, ecx: &InterpCx<'tcx, M>, ) -> InterpResult<'tcx, Self>
sourcefn transmute<M: Machine<'tcx, Provenance = Prov>>(
    &self,
    layout: TyAndLayout<'tcx>,
    ecx: &InterpCx<'tcx, M>,
) -> InterpResult<'tcx, Self>
 
fn transmute<M: Machine<'tcx, Provenance = Prov>>( &self, layout: TyAndLayout<'tcx>, ecx: &InterpCx<'tcx, M>, ) -> InterpResult<'tcx, Self>
This does an offset-by-zero, which is effectively a transmute. Note however that
not all transmutes are supported by all projectables – specifically, if this is an
OpTy or ImmTy, the new layout must have almost the same ABI as the old one
(only changing the valid_range is allowed and turning integers into pointers).
Object Safety§
This trait is not object safe.