import mem:* fun rc(in:T):rc { var to_ret.construct(in): rc return to_ret } obj rc (Object) { var inner: *rc_inner fun construct(): *rc { inner = null>() return this } fun construct(data: ref T): *rc { inner = new>() inner->data.copy_construct(&data) inner->count = 1 } fun copy_construct(old: *rc): void { inner = old->inner inner->count++; } fun operator=(other: ref rc): void { if other.inner != inner { destruct() copy_construct(&other) } } fun destruct(): void { inner->count--; if inner->count == 0 { inner->data.destruct() delete(inner) } } fun get(): ref T { return inner->data } } obj rc_inner { var count: int var data: T }