From 0e840e1d4fb21bf7d080abc5c8570d3c3a80a1a8 Mon Sep 17 00:00:00 2001 From: Hans Moog <hm@mkjc.net> Date: Wed, 24 Jul 2019 11:41:29 +0200 Subject: [PATCH] Feat: started experimenting with a weakmap implementation (tests) --- packages/datastructure/weakmap_test.go | 92 ++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 packages/datastructure/weakmap_test.go diff --git a/packages/datastructure/weakmap_test.go b/packages/datastructure/weakmap_test.go new file mode 100644 index 00000000..2c239962 --- /dev/null +++ b/packages/datastructure/weakmap_test.go @@ -0,0 +1,92 @@ +package datastructure + +import ( + "fmt" + "testing" +) +import "runtime" +import "unsafe" +import "errors" +import "time" + +func TestWeakmap(t *testing.T) { + generateA(6) + fmt.Println("") + + debugWeakMap(6) + fmt.Println("") + + runtime.GC() + fmt.Println("GC runned.") + + time.Sleep(1 * time.Second) + + debugWeakMap(6) +} + +func generateA(n int) { + + for i := 0; i < n; i++ { + a := NewA() + WMap.Add(a) + fmt.Println("Added to WM A with id =", a.Id) + } + +} + +func debugWeakMap(n int) { + for i := 0; i < n; i++ { + if WMap.Has(i) { + fmt.Println("Has id =", i) + } else { + fmt.Println("Hasn't id =", i) + } + } +} + +var aId int + +func NewA() *A { + aId++ + return &A{aId} +} + +var WMap = &WeakMap{weakMap: make(map[int]uintptr)} + +type WeakMap struct { + weakMap map[int]uintptr +} + +type A struct { + Id int +} + +func (w *WeakMap) Add(a *A) { + runtime.SetFinalizer(a, finalizer) + + w.weakMap[a.Id] = uintptr(unsafe.Pointer(a)) +} + +func (w *WeakMap) Get(id int) (*A, error) { + if !w.Has(id) { + return nil, errors.New("") + } + + a := (*A)(unsafe.Pointer(w.weakMap[id])) + + return a, nil +} + +func (w *WeakMap) Has(id int) bool { + _, ok := w.weakMap[id] + return ok +} + +func (w *WeakMap) Remove(a *A) { + delete(w.weakMap, a.Id) +} + +func finalizer(a *A) { + fmt.Println(a.Id) + WMap.Remove(a) +} -- GitLab