diff --git a/stdlib/rc.krak b/stdlib/rc.krak new file mode 100644 index 0000000..8fb4c19 --- /dev/null +++ b/stdlib/rc.krak @@ -0,0 +1,44 @@ +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 +}