Trait GetFieldMut

Source
pub unsafe trait GetFieldMut<FieldName>: GetField<FieldName> {
    // Required methods
    fn get_field_mut_(&mut self, field_name: FieldName) -> &mut Self::Ty;
    unsafe fn get_field_raw_mut(
        ptr: *mut (),
        field_name: FieldName,
    ) -> *mut Self::Ty
       where Self: Sized;
    fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<FieldName, Self::Ty>;
}
Expand description

Allows accessing the FieldName field mutably.

§Safety

These are requirements for manual implementations.

Implementors ought not mutate fields inside their accessor trait impls, or the accessor trait impls of other fields.

It is recommended that you use the z_unsafe_impl_get_field_raw_mut macro if you only borrow a field of the type.

§Implementing get_field_raw_mut

Your implementation of GetFieldMut::get_field_raw_mut must ensure these properties:

  • It must be side-effect free,

  • The method must return a pointer to a fully initialized field,

  • The field you access must always be the same one.

  • That no implementation returns a pointer to a field that (other) implementations for the same type also return,

  • That no implementation returns a pointer to a field that (other) GetVariantFieldMut implementations for the same type also return,

You can unerase the pointer by casting it to *mut Self (you can also use any type that’s compatible with Self).

Your implementation of the get_field_raw_mut_fn method must only return a function pointer to a function that ensures the properties listed above.

§Example: Usage as Bound

use structural::{StructuralExt,GetFieldMut,FP,fp};
use structural::for_examples::{Struct2,Struct3};

fn example<T>(this:&mut T)
where
    T: GetFieldMut<FP!(foo), Ty=Option<u32>> + GetFieldMut<FP!(bar), Ty=&'static str>
{
    assert_eq!( this.field_(fp!(foo)), &Some(21) );
    assert_eq!( this.field_(fp!(bar)), &"oh boy" );
    assert_eq!( this.fields(fp!(foo,bar)), (&Some(21), &"oh boy") );
    assert_eq!( this.cloned_fields(fp!(foo,bar)), (Some(21), "oh boy") );

    assert_eq!( this.field_mut(fp!(foo)), &mut Some(21) );
    assert_eq!( this.field_mut(fp!(bar)), &mut "oh boy" );
    assert_eq!( this.fields_mut(fp!(foo,bar)), (&mut Some(21), &mut "oh boy") );
}

example(&mut Struct2{ foo:Some(21), bar: "oh boy" });
example(&mut Struct3{ foo:Some(21), bar: "oh boy", baz:5 });

§Example: Manual implementation

While this trait is intended to be implemented using the Structural derive macro, you can also implement it like this:

use structural::{FieldType,GetField,GetFieldMut,Structural,FP};

struct Huh<T>{
    value:T,
}

impl<T> Structural for Huh<T>{}

impl<T> FieldType<FP!(value)> for Huh<T>{
    type Ty=T;
}

impl<T> GetField<FP!(value)> for Huh<T>{
    fn get_field_(&self,_:FP!(value))->&Self::Ty{
        &self.value
    }
}

unsafe impl<T> GetFieldMut<FP!(value)> for Huh<T>{
    fn get_field_mut_(&mut self,_:FP!(value))->&mut Self::Ty{
        &mut self.value
    }
    structural::z_unsafe_impl_get_field_raw_mut!{
        Self,
        field_tstr=value,
        name_generic=FP!(value),
    }
}

Required Methods§

Source

fn get_field_mut_(&mut self, field_name: FieldName) -> &mut Self::Ty

Accesses the FieldName field by mutable reference.

Source

unsafe fn get_field_raw_mut( ptr: *mut (), field_name: FieldName, ) -> *mut Self::Ty
where Self: Sized,

Gets a mutable pointer for the field.

§Safety

You must pass a pointer casted from *mut Self to *mut (), pointing to a fully initialized instance of the type.

Source

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<FieldName, Self::Ty>

Gets the get_field_raw_mut associated function as a function pointer.

Implementations on Foreign Types§

Source§

impl<'a, T, __F, __Ty> GetFieldMut<__F> for &'a mut T
where &'a mut T: Sized, T: GetFieldMut<__F, Ty = __Ty> + ?Sized + 'a,

Source§

fn get_field_mut_(&mut self, fname: __F) -> &mut __Ty

Source§

unsafe fn get_field_raw_mut(this: *mut (), fname: __F) -> *mut __Ty
where Self: Sized,

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<__F, __Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 0]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 1]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 2]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 3]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 4]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 5]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 6]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 7]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 8]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 9]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 10]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 11]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 12]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 13]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 14]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 15]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 16]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 17]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 18]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 19]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 20]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 21]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 22]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 23]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 24]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 25]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 26]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 27]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 28]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 29]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 30]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 31]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, P> GetFieldMut<P> for [T; 32]
where P: IsPathForArray<Self>,

Source§

fn get_field_mut_(&mut self, _: P) -> &mut Self::Ty

Source§

unsafe fn get_field_raw_mut(ptr: *mut (), _: P) -> *mut Self::Ty

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<P, Self::Ty>

Source§

impl<T, __F, __Ty> GetFieldMut<__F> for Box<T>
where Box<T>: Sized, T: GetFieldMut<__F, Ty = __Ty> + ?Sized,

Source§

fn get_field_mut_(&mut self, fname: __F) -> &mut __Ty

Source§

unsafe fn get_field_raw_mut(this: *mut (), fname: __F) -> *mut __Ty
where Self: Sized,

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<__F, __Ty>

Source§

impl<T, __F, __Ty> GetFieldMut<__F> for ManuallyDrop<T>
where ManuallyDrop<T>: Sized, T: GetFieldMut<__F, Ty = __Ty>,

Source§

fn get_field_mut_(&mut self, fname: __F) -> &mut __Ty

Source§

unsafe fn get_field_raw_mut(this: *mut (), fname: __F) -> *mut __Ty
where Self: Sized,

Source§

fn get_field_raw_mut_fn(&self) -> GetFieldRawMutFn<__F, __Ty>

Implementors§

Source§

impl<T, V, F> GetFieldMut<F> for VariantProxy<T, V>
where T: ?Sized + GetVariantFieldMut<V, F>, V: IsTStr,

Source§

impl<T, __F, __Ty> GetFieldMut<__F> for FieldCloner<T>
where FieldCloner<T>: Sized, T: GetFieldMut<__F, Ty = __Ty>,

Source§

impl<T, __F, __Ty> GetFieldMut<__F> for StrucWrapper<T>
where StrucWrapper<T>: Sized, T: GetFieldMut<__F, Ty = __Ty>,