From 68aeed24bba1ce27aab8917c71aa50e77ae12ebc Mon Sep 17 00:00:00 2001
From: Fabian Vu <Fabian.Vu@hhu.de>
Date: Thu, 22 May 2025 12:49:27 +0200
Subject: [PATCH] Fix performance lack in C++ BRelation

---
 btypes_big_integer/src/main/cpp/BRelation.hpp | 11 +++++++----
 btypes_primitives/src/main/cpp/BRelation.hpp  | 11 +++++++----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/btypes_big_integer/src/main/cpp/BRelation.hpp b/btypes_big_integer/src/main/cpp/BRelation.hpp
index 9c8b17185..848292ecd 100644
--- a/btypes_big_integer/src/main/cpp/BRelation.hpp
+++ b/btypes_big_integer/src/main/cpp/BRelation.hpp
@@ -1514,10 +1514,11 @@ class BRelation : public BObject {
             S prj1 = object.projection1();
             T prj2 = object.projection2();
 
-            if(this->domain().getSet().count(prj1) == 0) {
+            const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1);
+            if(rangePtr == nullptr) {
                 return BBoolean(false);
             }
-            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1];
+            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr;
             return BBoolean(range.count(prj2) > 0);
         }
 
@@ -1525,10 +1526,12 @@ class BRelation : public BObject {
             S prj1 = object.projection1();
             T prj2 = object.projection2();
 
-            if(this->domain().getSet().count(prj1) == 0) {
+            const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1);
+            if(rangePtr == nullptr) {
                 return BBoolean(true);
             }
-            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1];
+
+            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr;
             return BBoolean(range.count(prj2) == 0);
         }
 
diff --git a/btypes_primitives/src/main/cpp/BRelation.hpp b/btypes_primitives/src/main/cpp/BRelation.hpp
index f6f4eb08f..35c453b86 100644
--- a/btypes_primitives/src/main/cpp/BRelation.hpp
+++ b/btypes_primitives/src/main/cpp/BRelation.hpp
@@ -1514,10 +1514,11 @@ class BRelation : public BObject {
             S prj1 = object.projection1();
             T prj2 = object.projection2();
 
-            if(this->domain().getSet().count(prj1) == 0) {
+            const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1);
+            if(rangePtr == nullptr) {
                 return BBoolean(false);
             }
-            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1];
+            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr;
             return BBoolean(range.count(prj2) > 0);
         }
 
@@ -1525,10 +1526,12 @@ class BRelation : public BObject {
             S prj1 = object.projection1();
             T prj2 = object.projection2();
 
-            if(this->domain().getSet().count(prj1) == 0) {
+            const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1);
+            if(rangePtr == nullptr) {
                 return BBoolean(true);
             }
-            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1];
+
+            immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr;
             return BBoolean(range.count(prj2) == 0);
         }
 
-- 
GitLab