From b8e7112f29b1ea6462d2ea2347f6d1ff9d854832 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu>
Date: Wed, 1 Apr 2020 01:48:00 +0200
Subject: [PATCH] Implement isConstrainedBy(factor)

---
 include/core/capture/capture_base.h   |  3 +++
 include/core/feature/feature_base.h   |  3 +++
 include/core/frame/frame_base.h       |  1 +
 include/core/landmark/landmark_base.h |  2 ++
 src/capture/capture_base.cpp          | 16 ++++++++++++++++
 src/feature/feature_base.cpp          | 15 +++++++++++++++
 src/frame/frame_base.cpp              | 15 +++++++++++++++
 src/landmark/landmark_base.cpp        | 15 +++++++++++++++
 8 files changed, 70 insertions(+)

diff --git a/include/core/capture/capture_base.h b/include/core/capture/capture_base.h
index aaa76c922..a5eac842e 100644
--- a/include/core/capture/capture_base.h
+++ b/include/core/capture/capture_base.h
@@ -79,6 +79,8 @@ class CaptureBase : public NodeBase, public HasStateBlocks, public std::enable_s
     public:
         unsigned int getHits() const;
         const FactorBasePtrList& getConstrainedByList() const;
+        bool isConstrainedBy(const FactorBasePtr &_factor) const;
+
 
         // State blocks
         const std::string& getStructure() const;
@@ -183,6 +185,7 @@ inline const FactorBasePtrList& CaptureBase::getConstrainedByList() const
     return constrained_by_list_;
 }
 
+
 inline TimeStamp CaptureBase::getTimeStamp() const
 {
     return time_stamp_;
diff --git a/include/core/feature/feature_base.h b/include/core/feature/feature_base.h
index 720342591..a2ba3bc60 100644
--- a/include/core/feature/feature_base.h
+++ b/include/core/feature/feature_base.h
@@ -95,6 +95,9 @@ class FeatureBase : public NodeBase, public std::enable_shared_from_this<Feature
 
         unsigned int getHits() const;
         const FactorBasePtrList& getConstrainedByList() const;
+        bool isConstrainedBy(const FactorBasePtr &_factor) const;
+
+
 
         // all factors
         void getFactorList(FactorBasePtrList & _fac_list) const;
diff --git a/include/core/frame/frame_base.h b/include/core/frame/frame_base.h
index 3745de048..eea8873b3 100644
--- a/include/core/frame/frame_base.h
+++ b/include/core/frame/frame_base.h
@@ -126,6 +126,7 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha
         void getFactorList(FactorBasePtrList& _fac_list) const;
         unsigned int getHits() const;
         const FactorBasePtrList& getConstrainedByList() const;
+        bool isConstrainedBy(const FactorBasePtr& _factor) const;
         void link(TrajectoryBasePtr);
         template<typename classType, typename... T>
         static std::shared_ptr<classType> emplace(TrajectoryBasePtr _ptr, T&&... all);
diff --git a/include/core/landmark/landmark_base.h b/include/core/landmark/landmark_base.h
index 2f80a3d6f..254e03e48 100644
--- a/include/core/landmark/landmark_base.h
+++ b/include/core/landmark/landmark_base.h
@@ -71,6 +71,8 @@ class LandmarkBase : public NodeBase, public HasStateBlocks, public std::enable_
 
         unsigned int getHits() const;
         const FactorBasePtrList& getConstrainedByList() const;
+        bool isConstrainedBy(const FactorBasePtr &_factor) const;
+
 
         MapBasePtr getMap() const;
         void link(MapBasePtr);
diff --git a/src/capture/capture_base.cpp b/src/capture/capture_base.cpp
index 54e5d2a3c..d07b9b055 100644
--- a/src/capture/capture_base.cpp
+++ b/src/capture/capture_base.cpp
@@ -130,6 +130,22 @@ void CaptureBase::removeConstrainedBy(FactorBasePtr _fac_ptr)
     constrained_by_list_.remove(_fac_ptr);
 }
 
+bool CaptureBase::isConstrainedBy(const FactorBasePtr &_factor) const
+{
+    FactorBaseConstIter cby_it = std::find_if(constrained_by_list_.begin(),
+                                              constrained_by_list_.end(),
+                                              [_factor](const FactorBasePtr & cby)
+                                              {
+                                                 return cby == _factor;
+                                              }
+                                              );
+    if (cby_it != constrained_by_list_.end())
+        return true;
+    else
+        return false;
+}
+
+
 const std::string& CaptureBase::getStructure() const
 {
     if (getSensor())
diff --git a/src/feature/feature_base.cpp b/src/feature/feature_base.cpp
index df5d1f1e7..8dc3801ef 100644
--- a/src/feature/feature_base.cpp
+++ b/src/feature/feature_base.cpp
@@ -92,6 +92,21 @@ void FeatureBase::removeConstrainedBy(FactorBasePtr _fac_ptr)
     constrained_by_list_.remove(_fac_ptr);
 }
 
+bool FeatureBase::isConstrainedBy(const FactorBasePtr &_factor) const
+{
+    FactorBaseConstIter cby_it = std::find_if(constrained_by_list_.begin(),
+                                              constrained_by_list_.end(),
+                                              [_factor](const FactorBasePtr & cby)
+                                              {
+                                                 return cby == _factor;
+                                              }
+                                              );
+    if (cby_it != constrained_by_list_.end())
+        return true;
+    else
+        return false;
+}
+
 const FactorBasePtrList& FeatureBase::getFactorList() const
 {
     return factor_list_;
diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp
index 34e36705f..a3c679b62 100644
--- a/src/frame/frame_base.cpp
+++ b/src/frame/frame_base.cpp
@@ -297,6 +297,21 @@ void FrameBase::removeConstrainedBy(FactorBasePtr _fac_ptr)
     constrained_by_list_.remove(_fac_ptr);
 }
 
+bool FrameBase::isConstrainedBy(const FactorBasePtr &_factor) const
+{
+    FactorBaseConstIter cby_it = std::find_if(constrained_by_list_.begin(),
+                                              constrained_by_list_.end(),
+                                              [_factor](const FactorBasePtr & cby)
+                                              {
+                                                 return cby == _factor;
+                                              }
+    );
+    if (cby_it != constrained_by_list_.end())
+        return true;
+    else
+        return false;
+}
+
 void FrameBase::link(TrajectoryBasePtr _trj_ptr)
 {
     assert(!is_removing_ && "linking a removed frame");
diff --git a/src/landmark/landmark_base.cpp b/src/landmark/landmark_base.cpp
index 7c9b8b664..bc57f2729 100644
--- a/src/landmark/landmark_base.cpp
+++ b/src/landmark/landmark_base.cpp
@@ -138,6 +138,21 @@ void LandmarkBase::removeConstrainedBy(FactorBasePtr _fac_ptr)
     constrained_by_list_.remove(_fac_ptr);
 }
 
+bool LandmarkBase::isConstrainedBy(const FactorBasePtr &_factor) const
+{
+    FactorBaseConstIter cby_it = std::find_if(constrained_by_list_.begin(),
+                                              constrained_by_list_.end(),
+                                              [_factor](const FactorBasePtr & cby)
+                                              {
+                                                 return cby == _factor;
+                                              }
+                                              );
+    if (cby_it != constrained_by_list_.end())
+        return true;
+    else
+        return false;
+}
+
 LandmarkBasePtr LandmarkBase::create(const YAML::Node& _node)
 {
     unsigned int    id          = _node["id"]               .as< unsigned int     >();
-- 
GitLab