diff --git a/stdlib/mem.krak b/stdlib/mem.krak index 23da7cc..8deec61 100644 --- a/stdlib/mem.krak +++ b/stdlib/mem.krak @@ -128,4 +128,67 @@ fun safe_recursive_clone(first: *T, cloningFunc: fun(*T, fun(*T):*T, fun(*T): return rec_it(first) } +obj shared_ptr (Object){ + var data: *T; + var refCount: int; + + fun construct(): *shared_ptr { + data = 0; + refCount = 1; + return this; + } + + fun construct(newPtr: *T): *shared_ptr { + data = newPtr; + refCount = 1; + return this; + } + + fun construct(newPtr: ref shared_ptr): *shared_ptr { + data = newPtr.data; + refCount = newPtr.refCount; + refCount++; + return this; + } + + fun destruct(): void { + if(refCount == 1){ + delete(data,1); + refCount--; + } + + } + + fun operator*(): ref T { + return *data; + } + + fun operator->(): *T { + return data; + } + + fun operator=(newPtr: ref shared_ptr): ref shared_ptr { + if(this != &newPtr){ + if(refCount == 1){ + delete(data,1); + refCount--; + } + //use copy constructor here??? + data = newPtr.data; + refCount = newPtr.refCount; + refCount++; + }//end self-assignment check + return *this; + } + + fun operator=(newPtr: ref *T): ref shared_ptr { + data = newPtr; + refCount = 1; + delete(newPtr,1); + return *this; + } + +}; //end shared_ptr class + +