From 33387643d291a31c59676ab6c4c9ac1a97cd229f Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Sun, 18 Aug 2024 00:44:10 +0200
Subject: [PATCH] Add BoundaryConditionDescriptorBase

It handles IBoundaryDescriptor data and its access functions
---
 .../AxisBoundaryConditionDescriptor.hpp       | 16 +++------
 .../BoundaryConditionDescriptorBase.hpp       | 34 +++++++++++++++++++
 .../DirichletBoundaryConditionDescriptor.hpp  | 15 +++-----
 .../ExternalBoundaryConditionDescriptor.hpp   | 15 +++-----
 .../FixedBoundaryConditionDescriptor.hpp      | 16 +++------
 .../FourierBoundaryConditionDescriptor.hpp    | 17 +++-------
 .../FreeBoundaryConditionDescriptor.hpp       | 14 ++------
 src/scheme/IBoundaryConditionDescriptor.hpp   |  4 ++-
 .../InflowBoundaryConditionDescriptor.hpp     | 15 +++-----
 .../NeumannBoundaryConditionDescriptor.hpp    | 15 +++-----
 .../OutflowBoundaryConditionDescriptor.hpp    | 16 +++------
 .../SymmetryBoundaryConditionDescriptor.hpp   | 16 +++------
 12 files changed, 77 insertions(+), 116 deletions(-)
 create mode 100644 src/scheme/BoundaryConditionDescriptorBase.hpp

diff --git a/src/scheme/AxisBoundaryConditionDescriptor.hpp b/src/scheme/AxisBoundaryConditionDescriptor.hpp
index 07ab3be48..1dbbf9899 100644
--- a/src/scheme/AxisBoundaryConditionDescriptor.hpp
+++ b/src/scheme/AxisBoundaryConditionDescriptor.hpp
@@ -2,11 +2,11 @@
 #define AXIS_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class AxisBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class AxisBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -16,23 +16,15 @@ class AxisBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return os;
   }
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
-
  public:
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
     return Type::axis;
   }
 
-  AxisBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
+  AxisBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor)
+    : BoundaryConditionDescriptorBase{boundary_descriptor}
   {
     ;
   }
diff --git a/src/scheme/BoundaryConditionDescriptorBase.hpp b/src/scheme/BoundaryConditionDescriptorBase.hpp
new file mode 100644
index 000000000..d05dfd671
--- /dev/null
+++ b/src/scheme/BoundaryConditionDescriptorBase.hpp
@@ -0,0 +1,34 @@
+#ifndef BOUNDARY_CONDITION_DESCRIPTOR_BASE_HPP
+#define BOUNDARY_CONDITION_DESCRIPTOR_BASE_HPP
+
+#include <scheme/IBoundaryConditionDescriptor.hpp>
+
+class BoundaryConditionDescriptorBase : public IBoundaryConditionDescriptor
+{
+ protected:
+  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
+
+ public:
+  const std::shared_ptr<const IBoundaryDescriptor>&
+  boundaryDescriptor_shared() const final
+  {
+    return m_boundary_descriptor;
+  }
+
+  const IBoundaryDescriptor&
+  boundaryDescriptor() const final
+  {
+    return *m_boundary_descriptor;
+  }
+
+  BoundaryConditionDescriptorBase(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
+    : m_boundary_descriptor{boundary_descriptor}
+  {}
+
+  BoundaryConditionDescriptorBase(const BoundaryConditionDescriptorBase&) = delete;
+  BoundaryConditionDescriptorBase(BoundaryConditionDescriptorBase&&)      = delete;
+
+  virtual ~BoundaryConditionDescriptorBase() = default;
+};
+
+#endif   // BOUNDARY_CONDITION_DESCRIPTOR_BASE_HPP
diff --git a/src/scheme/DirichletBoundaryConditionDescriptor.hpp b/src/scheme/DirichletBoundaryConditionDescriptor.hpp
index 36f95df0d..3b80103cb 100644
--- a/src/scheme/DirichletBoundaryConditionDescriptor.hpp
+++ b/src/scheme/DirichletBoundaryConditionDescriptor.hpp
@@ -3,11 +3,11 @@
 
 #include <language/utils/FunctionSymbolId.hpp>
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class DirichletBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class DirichletBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -19,7 +19,6 @@ class DirichletBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
 
   const std::string_view m_name;
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
   const FunctionSymbolId m_rhs_symbol_id;
 
  public:
@@ -35,12 +34,6 @@ class DirichletBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return m_rhs_symbol_id;
   }
 
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
@@ -48,9 +41,9 @@ class DirichletBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
   }
 
   DirichletBoundaryConditionDescriptor(const std::string_view name,
-                                       std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
+                                       const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor,
                                        const FunctionSymbolId& rhs_symbol_id)
-    : m_name{name}, m_boundary_descriptor(boundary_descriptor), m_rhs_symbol_id{rhs_symbol_id}
+    : BoundaryConditionDescriptorBase{boundary_descriptor}, m_name{name}, m_rhs_symbol_id{rhs_symbol_id}
   {
     ;
   }
diff --git a/src/scheme/ExternalBoundaryConditionDescriptor.hpp b/src/scheme/ExternalBoundaryConditionDescriptor.hpp
index 056592931..eb915db37 100644
--- a/src/scheme/ExternalBoundaryConditionDescriptor.hpp
+++ b/src/scheme/ExternalBoundaryConditionDescriptor.hpp
@@ -2,12 +2,12 @@
 #define EXTERNAL_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 #include <utils/Socket.hpp>
 
 #include <memory>
 
-class ExternalBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class ExternalBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -19,7 +19,6 @@ class ExternalBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
 
   const std::string_view m_name;
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
   const std::shared_ptr<const Socket> m_socket;
 
  public:
@@ -35,12 +34,6 @@ class ExternalBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return m_socket;
   }
 
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
@@ -48,9 +41,9 @@ class ExternalBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
   }
 
   ExternalBoundaryConditionDescriptor(const std::string_view name,
-                                      std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
+                                      const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor,
                                       const std::shared_ptr<const Socket>& socket)
-    : m_name{name}, m_boundary_descriptor(boundary_descriptor), m_socket{socket}
+    : BoundaryConditionDescriptorBase{boundary_descriptor}, m_name{name}, m_socket{socket}
   {}
 
   ExternalBoundaryConditionDescriptor(const ExternalBoundaryConditionDescriptor&) = delete;
diff --git a/src/scheme/FixedBoundaryConditionDescriptor.hpp b/src/scheme/FixedBoundaryConditionDescriptor.hpp
index b69648e38..010d427c3 100644
--- a/src/scheme/FixedBoundaryConditionDescriptor.hpp
+++ b/src/scheme/FixedBoundaryConditionDescriptor.hpp
@@ -3,11 +3,11 @@
 
 #include <language/utils/FunctionSymbolId.hpp>
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class FixedBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class FixedBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -19,23 +19,15 @@ class FixedBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
 
   const std::string_view m_name;
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
-
  public:
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
     return Type::fixed;
   }
 
-  FixedBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
+  FixedBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor)
+    : BoundaryConditionDescriptorBase{boundary_descriptor}
   {}
 
   FixedBoundaryConditionDescriptor(const FixedBoundaryConditionDescriptor&) = delete;
diff --git a/src/scheme/FourierBoundaryConditionDescriptor.hpp b/src/scheme/FourierBoundaryConditionDescriptor.hpp
index c9d75883d..7c539f053 100644
--- a/src/scheme/FourierBoundaryConditionDescriptor.hpp
+++ b/src/scheme/FourierBoundaryConditionDescriptor.hpp
@@ -3,11 +3,11 @@
 
 #include <language/utils/FunctionSymbolId.hpp>
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class FourierBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class FourierBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -19,7 +19,6 @@ class FourierBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
 
   const std::string_view m_name;
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
   const FunctionSymbolId m_mass_symbol_id;
   const FunctionSymbolId m_rhs_symbol_id;
 
@@ -42,12 +41,6 @@ class FourierBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return m_rhs_symbol_id;
   }
 
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
@@ -55,11 +48,11 @@ class FourierBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
   }
 
   FourierBoundaryConditionDescriptor(const std::string_view name,
-                                     std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
+                                     const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor,
                                      const FunctionSymbolId& mass_symbol_id,
                                      const FunctionSymbolId& rhs_symbol_id)
-    : m_name{name},
-      m_boundary_descriptor(boundary_descriptor),
+    : BoundaryConditionDescriptorBase{boundary_descriptor},
+      m_name{name},
       m_mass_symbol_id{mass_symbol_id},
       m_rhs_symbol_id{rhs_symbol_id}
   {
diff --git a/src/scheme/FreeBoundaryConditionDescriptor.hpp b/src/scheme/FreeBoundaryConditionDescriptor.hpp
index 2d46f2a36..8b6df26f7 100644
--- a/src/scheme/FreeBoundaryConditionDescriptor.hpp
+++ b/src/scheme/FreeBoundaryConditionDescriptor.hpp
@@ -2,11 +2,11 @@
 #define FREE_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class FreeBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class FreeBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -16,15 +16,7 @@ class FreeBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return os;
   }
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
-
  public:
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
@@ -32,7 +24,7 @@ class FreeBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
   }
 
   FreeBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
+    : BoundaryConditionDescriptorBase{boundary_descriptor}
   {
     ;
   }
diff --git a/src/scheme/IBoundaryConditionDescriptor.hpp b/src/scheme/IBoundaryConditionDescriptor.hpp
index 1350aa4db..58e8b6076 100644
--- a/src/scheme/IBoundaryConditionDescriptor.hpp
+++ b/src/scheme/IBoundaryConditionDescriptor.hpp
@@ -2,6 +2,7 @@
 #define I_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <iostream>
+#include <memory>
 
 class IBoundaryDescriptor;
 
@@ -32,7 +33,8 @@ class IBoundaryConditionDescriptor
     return bcd._write(os);
   }
 
-  virtual const IBoundaryDescriptor& boundaryDescriptor() const = 0;
+  virtual const std::shared_ptr<const IBoundaryDescriptor>& boundaryDescriptor_shared() const = 0;
+  virtual const IBoundaryDescriptor& boundaryDescriptor() const                               = 0;
 
   virtual Type type() const = 0;
 
diff --git a/src/scheme/InflowBoundaryConditionDescriptor.hpp b/src/scheme/InflowBoundaryConditionDescriptor.hpp
index e648c1593..0b4608469 100644
--- a/src/scheme/InflowBoundaryConditionDescriptor.hpp
+++ b/src/scheme/InflowBoundaryConditionDescriptor.hpp
@@ -3,11 +3,11 @@
 
 #include <language/utils/FunctionSymbolId.hpp>
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class InflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class InflowBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -17,7 +17,6 @@ class InflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return os;
   }
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
   const FunctionSymbolId m_function_symbol_id;
 
  public:
@@ -27,21 +26,15 @@ class InflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return m_function_symbol_id;
   }
 
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
     return Type::inflow;
   }
 
-  InflowBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
+  InflowBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor,
                                     const FunctionSymbolId& function_symbol_id)
-    : m_boundary_descriptor(boundary_descriptor), m_function_symbol_id{function_symbol_id}
+    : BoundaryConditionDescriptorBase{boundary_descriptor}, m_function_symbol_id{function_symbol_id}
   {
     ;
   }
diff --git a/src/scheme/NeumannBoundaryConditionDescriptor.hpp b/src/scheme/NeumannBoundaryConditionDescriptor.hpp
index 597ab95e7..ae591a38f 100644
--- a/src/scheme/NeumannBoundaryConditionDescriptor.hpp
+++ b/src/scheme/NeumannBoundaryConditionDescriptor.hpp
@@ -3,11 +3,11 @@
 
 #include <language/utils/FunctionSymbolId.hpp>
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class NeumannBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class NeumannBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -19,7 +19,6 @@ class NeumannBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
 
   const std::string_view m_name;
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
   const FunctionSymbolId m_rhs_symbol_id;
 
  public:
@@ -35,12 +34,6 @@ class NeumannBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return m_rhs_symbol_id;
   }
 
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
@@ -48,9 +41,9 @@ class NeumannBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
   }
 
   NeumannBoundaryConditionDescriptor(const std::string_view name,
-                                     std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor,
+                                     const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor,
                                      const FunctionSymbolId& rhs_symbol_id)
-    : m_name{name}, m_boundary_descriptor(boundary_descriptor), m_rhs_symbol_id{rhs_symbol_id}
+    : BoundaryConditionDescriptorBase{boundary_descriptor}, m_name{name}, m_rhs_symbol_id{rhs_symbol_id}
   {
     ;
   }
diff --git a/src/scheme/OutflowBoundaryConditionDescriptor.hpp b/src/scheme/OutflowBoundaryConditionDescriptor.hpp
index 83ef7a775..bc999c501 100644
--- a/src/scheme/OutflowBoundaryConditionDescriptor.hpp
+++ b/src/scheme/OutflowBoundaryConditionDescriptor.hpp
@@ -2,11 +2,11 @@
 #define OUTFLOW_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class OutflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class OutflowBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -16,23 +16,15 @@ class OutflowBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return os;
   }
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
-
  public:
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
     return Type::outflow;
   }
 
-  OutflowBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
+  OutflowBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor)
+    : BoundaryConditionDescriptorBase{boundary_descriptor}
   {
     ;
   }
diff --git a/src/scheme/SymmetryBoundaryConditionDescriptor.hpp b/src/scheme/SymmetryBoundaryConditionDescriptor.hpp
index 9364090dd..1172bf7e4 100644
--- a/src/scheme/SymmetryBoundaryConditionDescriptor.hpp
+++ b/src/scheme/SymmetryBoundaryConditionDescriptor.hpp
@@ -2,11 +2,11 @@
 #define SYMMETRY_BOUNDARY_CONDITION_DESCRIPTOR_HPP
 
 #include <mesh/IBoundaryDescriptor.hpp>
-#include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/BoundaryConditionDescriptorBase.hpp>
 
 #include <memory>
 
-class SymmetryBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
+class SymmetryBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase
 {
  private:
   std::ostream&
@@ -16,23 +16,15 @@ class SymmetryBoundaryConditionDescriptor : public IBoundaryConditionDescriptor
     return os;
   }
 
-  std::shared_ptr<const IBoundaryDescriptor> m_boundary_descriptor;
-
  public:
-  const IBoundaryDescriptor&
-  boundaryDescriptor() const final
-  {
-    return *m_boundary_descriptor;
-  }
-
   Type
   type() const final
   {
     return Type::symmetry;
   }
 
-  SymmetryBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor)
-    : m_boundary_descriptor(boundary_descriptor)
+  SymmetryBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor)
+    : BoundaryConditionDescriptorBase{boundary_descriptor}
   {
     ;
   }
-- 
GitLab