blob: 3ce6d3eee74e1ebdd0f82a041500047b325aeda9 [file] [log] [blame]
#[macro_use]
extern crate rental;
pub struct Foo<'a> {
i: &'a i32,
}
impl<'a> Foo<'a> {
fn borrow(&self) -> &i32 { self.i }
fn try_borrow(&self) -> Result<&i32, ()> { Ok(self.i) }
fn fail_borrow(&self) -> Result<&i32, ()> { Err(()) }
}
rental! {
mod rentals {
use super::*;
#[rental]
pub struct LtParam<'a> {
foo: Box<Foo<'a>>,
iref: &'foo i32,
}
}
}
#[test]
fn new() {
let i = 5;
let foo = Foo { i: &i };
let _ = rentals::LtParam::new(Box::new(foo), |foo| foo.borrow());
let foo = Foo { i: &i };
let sr = rentals::LtParam::try_new(Box::new(foo), |foo| foo.try_borrow());
assert!(sr.is_ok());
let foo = Foo { i: &i };
let sr = rentals::LtParam::try_new(Box::new(foo), |foo| foo.fail_borrow());
assert!(sr.is_err());
}
#[test]
fn read() {
let i = 5;
let foo = Foo { i: &i };
let mut sr = rentals::LtParam::new(Box::new(foo), |foo| foo.borrow());
{
let i: i32 = sr.rent(|iref| **iref);
assert_eq!(i, 5);
}
{
let iref: &i32 = sr.ref_rent(|iref| *iref);
assert_eq!(*iref, 5);
}
assert_eq!(sr.rent_all_mut(|borrows| *borrows.foo.i), 5);
}