From 436532b079b8d0d5282321a16eef4a34816a3a44 Mon Sep 17 00:00:00 2001 From: ChrisFadden Date: Mon, 11 Jan 2016 19:25:09 -0500 Subject: [PATCH 1/2] Added shared pointers to mem library --- stdlib/mem.krak | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/stdlib/mem.krak b/stdlib/mem.krak index 23da7cc..95dd8b9 100644 --- a/stdlib/mem.krak +++ b/stdlib/mem.krak @@ -128,4 +128,60 @@ 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; + } + +}; //end shared_ptr class + + From f7789d5434b5e2ba93375a84644b2e76f37916b5 Mon Sep 17 00:00:00 2001 From: ChrisFadden Date: Mon, 11 Jan 2016 19:52:11 -0500 Subject: [PATCH 2/2] fixed bug in assignment operator --- stdlib/mem.krak | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/stdlib/mem.krak b/stdlib/mem.krak index 95dd8b9..8deec61 100644 --- a/stdlib/mem.krak +++ b/stdlib/mem.krak @@ -180,6 +180,13 @@ obj shared_ptr (Object){ }//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