Fix Vec_Insert_All
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5153beff Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5153beff Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5153beff Branch: refs/heads/master Commit: 5153beff28d3066da42bdee782875e75168a508c Parents: cd34607 Author: Nick Wellnhofer <[email protected]> Authored: Tue Jul 14 13:24:16 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Tue Jul 14 13:54:13 2015 +0200 ---------------------------------------------------------------------- runtime/core/Clownfish/Test/TestVector.c | 46 ++++++++++++++++++++++++++- runtime/core/Clownfish/Vector.c | 7 ++-- 2 files changed, 49 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5153beff/runtime/core/Clownfish/Test/TestVector.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Test/TestVector.c b/runtime/core/Clownfish/Test/TestVector.c index aad8369..1a72768 100644 --- a/runtime/core/Clownfish/Test/TestVector.c +++ b/runtime/core/Clownfish/Test/TestVector.c @@ -179,6 +179,49 @@ test_Push_Pop_Insert(TestBatchRunner *runner) { } static void +test_Insert_All(TestBatchRunner *runner) { + size_t i; + + { + Vector *dst = Vec_new(20); + Vector *src = Vec_new(10); + Vector *wanted = Vec_new(30); + + for (i = 0; i < 10; i++) { Vec_Push(dst, (Obj*)Int_new(i)); } + for (i = 0; i < 10; i++) { Vec_Push(dst, (Obj*)Int_new(i + 20)); } + for (i = 0; i < 10; i++) { Vec_Push(src, (Obj*)Int_new(i + 10)); } + for (i = 0; i < 30; i++) { Vec_Push(wanted, (Obj*)Int_new(i)); } + + Vec_Insert_All(dst, 10, src); + TEST_TRUE(runner, Vec_Equals(dst, (Obj*)wanted), "Insert_All between"); + + DECREF(wanted); + DECREF(src); + DECREF(dst); + } + + { + Vector *dst = Vec_new(10); + Vector *src = Vec_new(10); + Vector *wanted = Vec_new(30); + + for (i = 0; i < 10; i++) { Vec_Push(dst, (Obj*)Int_new(i)); } + for (i = 0; i < 10; i++) { Vec_Push(src, (Obj*)Int_new(i + 20)); } + for (i = 0; i < 10; i++) { Vec_Push(wanted, (Obj*)Int_new(i)); } + for (i = 0; i < 10; i++) { + Vec_Store(wanted, i + 20, (Obj*)Int_new(i + 20)); + } + + Vec_Insert_All(dst, 20, src); + TEST_TRUE(runner, Vec_Equals(dst, (Obj*)wanted), "Insert_All after"); + + DECREF(wanted); + DECREF(src); + DECREF(dst); + } +} + +static void test_Delete(TestBatchRunner *runner) { Vector *wanted = Vec_new(5); Vector *got = Vec_new(5); @@ -474,10 +517,11 @@ test_Grow(TestBatchRunner *runner) { void TestVector_Run_IMP(TestVector *self, TestBatchRunner *runner) { - TestBatchRunner_Plan(runner, (TestBatch*)self, 59); + TestBatchRunner_Plan(runner, (TestBatch*)self, 61); test_Equals(runner); test_Store_Fetch(runner); test_Push_Pop_Insert(runner); + test_Insert_All(runner); test_Delete(runner); test_Resize(runner); test_Excise(runner); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5153beff/runtime/core/Clownfish/Vector.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Vector.c b/runtime/core/Clownfish/Vector.c index 7f87fa1..2973e5b 100644 --- a/runtime/core/Clownfish/Vector.c +++ b/runtime/core/Clownfish/Vector.c @@ -127,19 +127,20 @@ Vec_Insert_IMP(Vector *self, size_t tick, Obj *elem) { void Vec_Insert_All_IMP(Vector *self, size_t tick, Vector *other) { - SI_add_grow_and_oversize(self, tick, other->size); - if (tick < self->size) { + SI_add_grow_and_oversize(self, self->size, other->size); memmove(self->elems + tick + other->size, self->elems + tick, (self->size - tick) * sizeof(Obj*)); + self->size += other->size; } else { + SI_add_grow_and_oversize(self, tick, other->size); memset(self->elems + self->size, 0, (tick - self->size) * sizeof(Obj*)); + self->size = tick + other->size; } SI_copy_and_incref(self->elems + tick, other->elems, other->size); - self->size = tick + other->size; } Obj*
