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);

Reply via email to