This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch feature/cap_req_model_lib in repository https://gitbox.apache.org/repos/asf/celix.git
commit a8cb54f862e5431e2466caa287da0ad910e972af Author: Pepijn Noltes <[email protected]> AuthorDate: Thu Apr 6 16:08:31 2023 +0200 Remove equals/hashCode from celix_resource --- .../src/RequirementCapabilityModelTestSuite.cc | 25 ++++++----- libs/rcm/include/celix_resource.h | 4 +- libs/rcm/src/celix_resource.c | 49 ++++++++++++++++------ 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/libs/rcm/gtest/src/RequirementCapabilityModelTestSuite.cc b/libs/rcm/gtest/src/RequirementCapabilityModelTestSuite.cc index e90b0aa5..b9c7d555 100644 --- a/libs/rcm/gtest/src/RequirementCapabilityModelTestSuite.cc +++ b/libs/rcm/gtest/src/RequirementCapabilityModelTestSuite.cc @@ -153,35 +153,40 @@ TEST_F(RequirementCapabilityModelTestSuite, TestResource) { EXPECT_EQ(0, celix_arrayList_size(celix_resource_getRequirements(res, nullptr))); EXPECT_EQ(0, celix_arrayList_size(celix_resource_getCapabilities(res, nullptr))); - EXPECT_EQ(celix_resource_hashCode(res), celix_resource_hashCode(res2)); - EXPECT_TRUE(celix_resource_equals(res, res2)); +// EXPECT_EQ(celix_resource_hashCode(res), celix_resource_hashCode(res2)); +// EXPECT_TRUE(celix_resource_equals(res, res2)); celix_requirement_t* req = celix_requirement_create(res, "test-namespace", "(&(capability.attribute1=foo)(capability.attribute2=bar))"); - celix_resource_addRequirement(res, req); + EXPECT_TRUE(celix_resource_addRequirement(res, req)); EXPECT_EQ(res, celix_requirement_getResource(req)); EXPECT_EQ(1, celix_arrayList_size(celix_resource_getRequirements(res, nullptr))); + req = celix_requirement_create(res, "test-namespace2", nullptr); + EXPECT_TRUE(celix_resource_addRequirement(res, req)); + EXPECT_EQ(2, celix_arrayList_size(celix_resource_getRequirements(res, nullptr))); celix_capability_t *cap = celix_capability_create(res, "test-namespace"); - celix_resource_addCapability(res, cap); + EXPECT_TRUE(celix_resource_addCapability(res, cap)); EXPECT_EQ(res, celix_capability_getResource(cap)); EXPECT_EQ(1, celix_arrayList_size(celix_resource_getCapabilities(res, nullptr))); - EXPECT_FALSE(celix_resource_equals(res, res2)); //note res 1 changed - EXPECT_NE(celix_resource_hashCode(res), celix_resource_hashCode(res2)); +// EXPECT_FALSE(celix_resource_equals(res, res2)); //note res 1 changed +// EXPECT_NE(celix_resource_hashCode(res), celix_resource_hashCode(res2)); + req = celix_requirement_create(res2, "test-namespace2", nullptr); + EXPECT_TRUE(celix_resource_addRequirement(res2, req)); req = celix_requirement_create(res2, "test-namespace", "(&(capability.attribute1=foo)(capability.attribute2=bar))"); - cap = celix_capability_create(res2, "test-namespace"); EXPECT_TRUE(celix_resource_addRequirement(res2, req)); + cap = celix_capability_create(res2, "test-namespace"); EXPECT_TRUE(celix_resource_addCapability(res2, cap)); - EXPECT_TRUE(celix_resource_equals(res, res2)); //note res and res2 are the same again - EXPECT_EQ(celix_resource_hashCode(res), celix_resource_hashCode(res2)); +// EXPECT_TRUE(celix_resource_equals(res, res2)); //note res and res2 are the same again +// EXPECT_EQ(celix_resource_hashCode(res), celix_resource_hashCode(res2)); //test get capabilities/requirements by namespace req = celix_requirement_create(res, "test-namespace2", nullptr); cap = celix_capability_create(res, "test-namespace2"); EXPECT_TRUE(celix_resource_addRequirement(res, req)); EXPECT_TRUE(celix_resource_addCapability(res, cap)); - EXPECT_EQ(2, celix_arrayList_size(celix_resource_getRequirements(res, nullptr))); + EXPECT_EQ(3, celix_arrayList_size(celix_resource_getRequirements(res, nullptr))); EXPECT_EQ(2, celix_arrayList_size(celix_resource_getCapabilities(res, nullptr))); const celix_array_list_t* caps = celix_resource_getCapabilities(res, "test-namespace"); EXPECT_EQ(1, celix_arrayList_size(caps)); diff --git a/libs/rcm/include/celix_resource.h b/libs/rcm/include/celix_resource.h index 59b31cf1..99821f7a 100644 --- a/libs/rcm/include/celix_resource.h +++ b/libs/rcm/include/celix_resource.h @@ -42,9 +42,9 @@ celix_resource_t* celix_resource_create(); void celix_resource_destroy(celix_resource_t* resource); -bool celix_resource_equals(const celix_resource_t* res1, const celix_resource_t* res2); +//bool celix_resource_equals(const celix_resource_t* res1, const celix_resource_t* res2); -unsigned int celix_resource_hashCode(const celix_resource_t* res); +//unsigned int celix_resource_hashCode(const celix_resource_t* res); const celix_array_list_t* celix_resource_getCapabilities(const celix_resource_t* res, const char* ns); diff --git a/libs/rcm/src/celix_resource.c b/libs/rcm/src/celix_resource.c index 6b41f457..e981e0ee 100644 --- a/libs/rcm/src/celix_resource.c +++ b/libs/rcm/src/celix_resource.c @@ -82,7 +82,7 @@ void celix_resource_destroy(celix_resource_t* resource) { free(resource); } } - +/* bool celix_resource_equals(const celix_resource_t* res1, const celix_resource_t* res2) { if (res1 == res2) { return true; @@ -93,42 +93,57 @@ bool celix_resource_equals(const celix_resource_t* res1, const celix_resource_t* return false; } - //FIXME this is not correct, as the order of the capabilities and requirements is not important + + int equalCount = 0; for (int i = 0; i < celix_arrayList_size(res1->allCapabilities); ++i) { celix_capability_t* cap1 = celix_arrayList_get(res1->allCapabilities, i); - celix_capability_t* cap2 = celix_arrayList_get(res2->allCapabilities, i); - if (!celix_capability_equals(cap1, cap2)) { - return false; + for (int k = 0; k < celix_arrayList_size(res2->allCapabilities); ++k) { + celix_capability_t* cap2 = celix_arrayList_get(res2->allCapabilities, k); + if (celix_capability_equals(cap1, cap2)) { + equalCount++; + break; + } } } + //FIXME only correct if all capabilities are unique + if (equalCount != celix_arrayList_size(res1->allCapabilities)) { + return false; + } - //FIXME this is not correct, as the order of the capabilities and requirements is not important - for (int i = 0; i < celix_arrayList_size(res1->allCapabilities); ++i) { - celix_requirement_t* req1 = celix_arrayList_get(res1->allCapabilities, i); - celix_requirement_t* req2 = celix_arrayList_get(res2->allCapabilities, i); - if (!celix_requirement_equals(req1, req2)) { - return false; + equalCount = 0; + for (int i = 0; i < celix_arrayList_size(res1->allRequirements); ++i) { + celix_requirement_t* req1 = celix_arrayList_get(res1->allRequirements, i); + for (int k = 0; k < celix_arrayList_size(res2->allRequirements); ++k) { + celix_requirement_t* req2 = celix_arrayList_get(res2->allRequirements, k); + if (celix_requirement_equals(req1, req2)) { + equalCount++; + break; + } } } + //FIXME only correct if all capabilities are unique + if (equalCount != celix_arrayList_size(res1->allCapabilities)) { + return false; + } + return true; } unsigned int celix_resource_hashCode(const celix_resource_t* res) { unsigned int hash = 0; - //FIXME this is not correct, as the order of the capabilities and requirements is not important for (int i = 0; i < celix_arrayList_size(res->allCapabilities); ++i) { celix_capability_t* cap = celix_arrayList_get(res->allCapabilities, i); hash += celix_capability_hashCode(cap); } - //FIXME this is not correct, as the order of the capabilities and requirements is not important for (int i = 0; i < celix_arrayList_size(res->allRequirements); ++i) { celix_requirement_t* req = celix_arrayList_get(res->allRequirements, i); hash += celix_requirement_hashCode(req); } return hash; } + */ const celix_array_list_t* celix_resource_getCapabilities(const celix_resource_t* res, const char* ns) { if (ns != NULL) { @@ -157,6 +172,10 @@ bool celix_resource_addCapability(celix_resource_t* res, celix_capability_t* cap celix_array_list_t* caps = celix_stringHashMap_get(res->capabilitiesByNamespace, ns); if (caps == NULL) { caps = celix_arrayList_create(); + if (caps == NULL) { + celix_rcmErr_push("Failed to allocate capabilities list. Out of memory."); + return false; + } celix_stringHashMap_put(res->capabilitiesByNamespace, ns, caps); } celix_arrayList_add(caps, cap); @@ -176,6 +195,10 @@ bool celix_resource_addRequirement(celix_resource_t* res, celix_requirement_t* r celix_array_list_t* reqs = celix_stringHashMap_get(res->requirementsByNamespace, ns); if (reqs == NULL) { reqs = celix_arrayList_create(); + if (reqs == NULL) { + celix_rcmErr_push("Failed to allocate requirement list. Out of memory."); + return false; + } celix_stringHashMap_put(res->requirementsByNamespace, ns, reqs); } celix_arrayList_add(reqs, req);
