Somehow forgot to commit rc all this time
This commit is contained in:
44
stdlib/rc.krak
Normal file
44
stdlib/rc.krak
Normal file
@@ -0,0 +1,44 @@
|
||||
import mem:*
|
||||
|
||||
fun rc<T>(in:T):rc<T> {
|
||||
var to_ret.construct(in): rc<T>
|
||||
return to_ret
|
||||
}
|
||||
|
||||
obj rc<T> (Object) {
|
||||
var inner: *rc_inner<T>
|
||||
fun construct(): *rc<T> {
|
||||
inner = null<rc_inner<T>>()
|
||||
return this
|
||||
}
|
||||
fun construct(data: ref T): *rc<T> {
|
||||
inner = new<rc_inner<T>>()
|
||||
inner->data.copy_construct(&data)
|
||||
inner->count = 1
|
||||
}
|
||||
fun copy_construct(old: *rc<T>): void {
|
||||
inner = old->inner
|
||||
inner->count++;
|
||||
}
|
||||
fun operator=(other: ref rc<T>): 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<T> {
|
||||
var count: int
|
||||
var data: T
|
||||
}
|
||||
Reference in New Issue
Block a user