Implement LFReg#Clone
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/c1d89c3a Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/c1d89c3a Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/c1d89c3a Branch: refs/heads/clone_class_registry Commit: c1d89c3a3ab7c152da1165ae190ead024aafb9d5 Parents: fd30d70 Author: Nick Wellnhofer <[email protected]> Authored: Sun Aug 3 14:53:13 2014 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Sun Aug 3 17:38:04 2014 +0200 ---------------------------------------------------------------------- runtime/core/Clownfish/LockFreeRegistry.c | 23 ++++++++++++++++++++ runtime/core/Clownfish/LockFreeRegistry.cfh | 9 +++++--- .../core/Clownfish/Test/TestLockFreeRegistry.c | 9 +++++++- 3 files changed, 37 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c1d89c3a/runtime/core/Clownfish/LockFreeRegistry.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/LockFreeRegistry.c b/runtime/core/Clownfish/LockFreeRegistry.c index c95a791..fab4f54 100644 --- a/runtime/core/Clownfish/LockFreeRegistry.c +++ b/runtime/core/Clownfish/LockFreeRegistry.c @@ -106,6 +106,29 @@ LFReg_Fetch_IMP(LockFreeRegistry *self, Obj *key) { return NULL; } +LockFreeRegistry* +LFReg_Clone_IMP(LockFreeRegistry *self) { + size_t capacity = self->capacity; + LFRegEntry **entries = (LFRegEntry**)self->entries; + LockFreeRegistry *twin = LFReg_new(capacity); + + for (size_t i = 0; i < capacity; ++i) { + LFRegEntry *entry = entries[i]; + + while (entry) { + Obj *key = Obj_Clone(entry->key); + Obj *value = Obj_Clone(entry->value); + LFReg_Register(twin, key, value); + DECREF(key); + DECREF(value); + + entry = entry->next; + } + } + + return twin; +} + void LFReg_Destroy_IMP(LockFreeRegistry *self) { LFRegEntry **entries = (LFRegEntry**)self->entries; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c1d89c3a/runtime/core/Clownfish/LockFreeRegistry.cfh ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/LockFreeRegistry.cfh b/runtime/core/Clownfish/LockFreeRegistry.cfh index bb41fbd..2061a23 100644 --- a/runtime/core/Clownfish/LockFreeRegistry.cfh +++ b/runtime/core/Clownfish/LockFreeRegistry.cfh @@ -29,17 +29,20 @@ class Clownfish::LockFreeRegistry nickname LFReg inherits Clownfish::Obj { inert LockFreeRegistry* init(LockFreeRegistry *self, size_t capacity); - public void - Destroy(LockFreeRegistry *self); - bool Register(LockFreeRegistry *self, Obj *key, Obj *value); nullable Obj* Fetch(LockFreeRegistry *self, Obj *key); + public incremented LockFreeRegistry* + Clone(LockFreeRegistry *self); + void* To_Host(LockFreeRegistry *self); + + public void + Destroy(LockFreeRegistry *self); } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c1d89c3a/runtime/core/Clownfish/Test/TestLockFreeRegistry.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Test/TestLockFreeRegistry.c b/runtime/core/Clownfish/Test/TestLockFreeRegistry.c index 46d725e..fb69065 100644 --- a/runtime/core/Clownfish/Test/TestLockFreeRegistry.c +++ b/runtime/core/Clownfish/Test/TestLockFreeRegistry.c @@ -66,6 +66,13 @@ test_all(TestBatchRunner *runner) { TEST_TRUE(runner, LFReg_Fetch(registry, (Obj*)baz) == NULL, "Fetch() non-existent key returns NULL"); + LockFreeRegistry *twin = LFReg_Clone(registry); + Obj *twin_entry = LFReg_Fetch(twin, (Obj*)foo); + TEST_TRUE(runner, twin_entry != NULL, "Fetch() from clone"); + TEST_TRUE(runner, Obj_Equals(twin_entry, (Obj*)foo), + "Fetch() from clone returns equal entry"); + TEST_TRUE(runner, twin_entry != (Obj*)foo, "Clone() performs deep clone"); + DECREF(foo_dupe); DECREF(baz); DECREF(bar); @@ -75,7 +82,7 @@ test_all(TestBatchRunner *runner) { void TestLFReg_Run_IMP(TestLockFreeRegistry *self, TestBatchRunner *runner) { - TestBatchRunner_Plan(runner, (TestBatch*)self, 6); + TestBatchRunner_Plan(runner, (TestBatch*)self, 9); test_all(runner); }
