From 43c0e8f16624eb4841bbbb862618c1323bee7be5 Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Tue, 1 Apr 2014 10:01:56 +0200 Subject: [PATCH 1/2] Small improvement in lookup. --- lib/BasicsC/associative-multi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/BasicsC/associative-multi.c b/lib/BasicsC/associative-multi.c index e9891ac34a..a94bc3f2e3 100644 --- a/lib/BasicsC/associative-multi.c +++ b/lib/BasicsC/associative-multi.c @@ -438,7 +438,7 @@ void* TRI_LookupByElementMultiPointer (TRI_multi_pointer_t* array, #endif i = LookupByElement(array, element); - return (NULL != array->_table[i].ptr) ? array->_table[i].ptr : NULL; + return array->_table[i].ptr; } //////////////////////////////////////////////////////////////////////////////// From 064371769a5879ba42595f26cdd4a50e61093204 Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Tue, 1 Apr 2014 10:02:10 +0200 Subject: [PATCH 2/2] Add to unittest, not yet working. --- .../Basics/associative-multi-pointer-test.cpp | 46 ++++++++++++++++--- UnitTests/Makefile.unittests | 1 + 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/UnitTests/Basics/associative-multi-pointer-test.cpp b/UnitTests/Basics/associative-multi-pointer-test.cpp index 0bbfdba76b..51f4d71a6c 100644 --- a/UnitTests/Basics/associative-multi-pointer-test.cpp +++ b/UnitTests/Basics/associative-multi-pointer-test.cpp @@ -139,7 +139,7 @@ BOOST_AUTO_TEST_CASE (tst_init) { /// @brief test unique insertion //////////////////////////////////////////////////////////////////////////////// -BOOST_AUTO_TEST_CASE (tst_insert_many_keys) { +BOOST_AUTO_TEST_CASE (tst_insert_few) { INIT_MULTI void* r = 0; @@ -156,13 +156,15 @@ BOOST_AUTO_TEST_CASE (tst_insert_many_keys) { DESTROY_MULTI } -#define NUMBER_OF_ELEMENTS 100 -#define MODULUS 10 +// Note MODULUS must be a divisor of NUMBER_OF_ELEMENTS +// and NUMBER_OF_ELEMENTS must be a multiple of 3. +#define NUMBER_OF_ELEMENTS 24 +#define MODULUS 4 -BOOST_AUTO_TEST_CASE (tst_insert_key_unique) { +BOOST_AUTO_TEST_CASE (tst_insert_delete_many) { INIT_MULTI - int i; + unsigned int i, j; ELEMENT(e, 0, 0); vector v; @@ -192,9 +194,41 @@ BOOST_AUTO_TEST_CASE (tst_insert_key_unique) { // Now check by key: TRI_vector_pointer_t res; + for (i = 0;i < MODULUS;i++) { - + int* space = static_cast(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, + sizeof(int) * NUMBER_OF_ELEMENTS / MODULUS, + true)); + res = TRI_LookupByKeyMultiPointer(TRI_UNKNOWN_MEM_ZONE, &a1, &i); + BOOST_CHECK_EQUAL(TRI_LengthVectorPointer(&res), + NUMBER_OF_ELEMENTS/MODULUS); + // Now check its contents: + for (j = 0;j < TRI_LengthVectorPointer(&res);j++) { + data_container_t* q = static_cast + (TRI_AtVectorPointer(&res, j)); + BOOST_CHECK_EQUAL(q->value % MODULUS, i); + BOOST_CHECK_EQUAL(space[(q->value - i) / MODULUS],0); + space[(q->value - i) / MODULUS] = 1; + } + TRI_Free(TRI_UNKNOWN_MEM_ZONE, space); + TRI_DestroyVectorPointer(&res); } + + // Delete some data: + for (i = 0;i < v.size();i += 3) { + BOOST_CHECK_EQUAL(v[i], TRI_RemoveElementMultiPointer(&a1, v[i])); + } + + // Delete some more: + for (i = 1;i < v.size();i += 3) { + BOOST_CHECK_EQUAL(v[i], TRI_RemoveElementMultiPointer(&a1, v[i])); + } + + // Delete the rest: + for (i = 2;i < v.size();i += 3) { + BOOST_CHECK_EQUAL(v[i], TRI_RemoveElementMultiPointer(&a1, v[i])); + } + // Pull down data again: for (i = 0;i < NUMBER_OF_ELEMENTS;i++) { delete v[i]; diff --git a/UnitTests/Makefile.unittests b/UnitTests/Makefile.unittests index f31a6f45b6..040c167575 100755 --- a/UnitTests/Makefile.unittests +++ b/UnitTests/Makefile.unittests @@ -272,6 +272,7 @@ UnitTests_basics_suite_SOURCES = \ UnitTests/Basics/hashes-test.cpp \ UnitTests/Basics/mersenne-test.cpp \ UnitTests/Basics/associative-pointer-test.cpp \ + UnitTests/Basics/associative-multi-pointer-test.cpp \ UnitTests/Basics/associative-synced-test.cpp \ UnitTests/Basics/string-buffer-test.cpp \ UnitTests/Basics/string-utf8-normalize-test.cpp \