use fieldwork_borrow::with_;
struct SomeState(u32);
fn new_state(x: u32) -> SomeState {
SomeState(x)
}
struct StorageEngine {
page: u32,
state: Option<SomeState>,
c: u32,
}
impl StorageEngine {
fn problem(&mut self) -> (&mut u32, &mut u32, &mut SomeState) {
with_!(self, {
methods {
assign_next_page(mut page) -> u32 {
let p = *page;
*page += 1;
p
}
}
fields {
mut state
mut c
}
body {
let state_ref = state.get_or_insert_with(|| {
let x = self.assign_next_page();
new_state(x)
});
(c, page, state_ref)
}
})
}
fn _assign_next_page(&mut self) -> u32 {
let page = self.page;
self.page += 1;
page
}
}
#[test]
fn test_e1() {
let mut engine = StorageEngine {
page: 10,
state: None,
c: 100,
};
let (c, page, state) = engine.problem();
assert_eq!(*page, 11);
assert_eq!(state.0, 10);
assert_eq!(*c, 100);
}
#[test]
fn test_e1_already_initialized() {
let mut engine = StorageEngine {
page: 10,
state: Some(SomeState(999)),
c: 100,
};
let (_, page, state) = engine.problem();
assert_eq!(*page, 10); assert_eq!(state.0, 999); }