[][src]Trait borrow_trait::BorrowRefMut

pub trait BorrowRefMut<'a> {
    type Target;
    type Pointer: 'a + DerefMut<Target = Self::Target>;
    fn borrow_mut(&'a self) -> Self::Pointer;
}

A trait for mutably borrowing data.

The borrow function returns an mutable reference to Self::Target.

use std::ops::DerefMut;
use std::cell::RefCell;
use borrow_trait::{ BorrowRefMut };

fn takes_bound<T>(value: &T)
where
    T: for<'a> BorrowRefMut<'a, Target = String>,
{
    assert_eq!(value.borrow_mut().deref_mut(), &mut "Hello World".to_string());
}

let value = RefCell::new("Hello World".to_string());
takes_bound(&value)

Implementation Example

Implementing BorrowRefMut for RefCell:

This example is not tested
use std::cell::{ RefMut, RefCell };
use borrow_trait::{ BorrowRefMut };

impl<'a, T: 'a> BorrowRefMut<'a> for RefCell<T> {
    type Target = T;
    type Pointer = RefMut<'a, Self::Target>;

    fn borrow_mut(&'a self) -> Self::Pointer { RefCell::borrow_mut(self) }
}

Associated Types

type Target

The type, that is wrapped by the implementation.

Example

A RefCell<T> wraps around T therefore Target has to be T

This example is not tested
type Target = T;

type Pointer: 'a + DerefMut<Target = Self::Target>

The type returned by the implementor.

Example

A RefCell returns RefMut so Pointer has to be RefMut.

This example is not tested
type Pointer = RefMut<'a, Self::Target>;
Loading content...

Required methods

fn borrow_mut(&'a self) -> Self::Pointer

Mutably borrows the wrapped value. The value cannot be borrowed while this borrow is active.

Panics

The function should panic, if the value is currently borrowed.

Example

use std::ops::DerefMut;
use std::cell::RefCell;
use borrow_trait::{ BorrowRefMut };

fn takes_bound<T>(value: &T)
where
    T: for<'a> BorrowRefMut<'a, Target = String>,
{
    assert_eq!(value.borrow_mut().deref_mut(), &mut "Hello World".to_string());
}

let value = RefCell::new("Hello World".to_string());
takes_bound(&value)

An example of panic:

This example is not tested
use std::ops::DerefMut;
use std::cell::RefCell;
use borrow_trait::{ BorrowRefMut };
use std::panic;

fn takes_bound<T>(value: &T)
where
    T: for<'a> BorrowRefMut<'a, Target = String>,
{
    let result = panic::catch_unwind(move || {
        let mut first_borrow = value.borrow_mut();
        let mut second_borrow = value.borrow_mut(); // this causes a panic

        assert_eq!(first_borrow.deref_mut(), &mut "Hello World".to_string());
        assert_eq!(second_borrow.deref_mut(), &mut "Hello World".to_string());
    });
    assert!(result.is_err());
}

let value = RefCell::new("Hello World".to_string());
takes_bound(&value)
Loading content...

Implementations on Foreign Types

impl<'a, T: 'a> BorrowRefMut<'a> for RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ mut RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, T: 'a> BorrowRefMut<'a> for AtomicRefCell<T>[src]

type Target = T

type Pointer = AtomicRefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ AtomicRefCell<T>[src]

type Target = T

type Pointer = AtomicRefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ mut AtomicRefCell<T>[src]

type Target = T

type Pointer = AtomicRefMut<'a, T>

impl<'a, T: 'a> BorrowRefMut<'a> for RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, '_, T: 'a> BorrowRefMut<'a> for &'_ mut RefCell<T>[src]

type Target = T

type Pointer = RefMut<'a, T>

impl<'a, K: 'a, T: 'a> BorrowRefMut<'a> for Rc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ Rc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ mut Rc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, K: 'a, T: 'a> BorrowRefMut<'a> for Arc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ Arc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ mut Arc<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, K: 'a, T: 'a> BorrowRefMut<'a> for Box<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ Box<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

impl<'a, '_, K: 'a, T: 'a> BorrowRefMut<'a> for &'_ mut Box<T> where
    T: BorrowRefMut<'a, Target = K>, 
[src]

type Target = K

type Pointer = <T as BorrowRefMut<'a>>::Pointer

Loading content...

Implementors

Loading content...