From 74ac0d388e91bfb6c5cba4b8efd8a57741efb66d Mon Sep 17 00:00:00 2001
From: Tomas Jakubec <jakubto1@fjfi.cvut.cz>
Date: Fri, 4 Oct 2019 15:42:17 +0200
Subject: [PATCH] Refactor: - consolelogger.h to only detect whether begin
 member function exists - refactor of coordinates from pointer to std::array

---
 Unstructured_mesh/Vector.h | 25 +++++++++++++++----------
 Unstructured_mesh/Vertex.h | 24 ++++++++++++++----------
 Unstructured_mesh/main.cpp |  5 ++++-
 debug/consolelogger.h      |  7 +++++--
 4 files changed, 38 insertions(+), 23 deletions(-)

diff --git a/Unstructured_mesh/Vector.h b/Unstructured_mesh/Vector.h
index 4bf7860..58ae583 100644
--- a/Unstructured_mesh/Vector.h
+++ b/Unstructured_mesh/Vector.h
@@ -5,7 +5,7 @@
 #include <iostream>
 #include <initializer_list>
 #include "InlineArrayOperations.h"
-
+#include <array>
 
 
 template <unsigned int Dim, typename Real = double>
@@ -13,7 +13,7 @@ class Vector {
     /**
      * @brief coordinates
      */
-    Real coordinates[Dim] = {};
+    std::array<Real, Dim> coordinates = {};
 
 public:
     Vector(){}
@@ -27,6 +27,11 @@ public:
         coordinates[pos] = coord;
     }
 
+
+    std::array<Real, Dim>& getCoordinates() {
+        return coordinates;
+    }
+
     Real& operator[](unsigned int pos){
         return coordinates[pos];
     }
@@ -38,7 +43,7 @@ public:
     Real normEukleid();
 
     inline Real sumOfSquares() {
-        return  inlineScalarProduct<Dim, Real>::computation(coordinates, coordinates);
+        return  inlineScalarProduct<Dim, Real>::computation(coordinates.data(), coordinates.data());
     }
 
     Vector<Dim, Real> operator-(const Vector<Dim, Real>&) const;
@@ -119,7 +124,7 @@ Real Vector<Dim, Real>::normEukleid(){
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real> Vector<Dim, Real>::operator -(const Vector<Dim, Real>& v) const {
     Vector<Dim, Real> res;
-    inlineSubtraction<Dim, Real>::computation(res.coordinates, this->coordinates, v.coordinates);
+    inlineSubtraction<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), v.coordinates.data());
     return res;
 }
 
@@ -127,7 +132,7 @@ Vector<Dim, Real> Vector<Dim, Real>::operator -(const Vector<Dim, Real>& v) cons
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real> Vector<Dim, Real>::operator +(const Vector<Dim, Real>& v) const {
     Vector<Dim, Real> res;
-    inlineAddition<Dim, Real>::computation(res.coordinates, this->coordinates, v.coordinates);
+    inlineAddition<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), v.coordinates.data());
     return res;
 }
 
@@ -135,7 +140,7 @@ Vector<Dim, Real> Vector<Dim, Real>::operator +(const Vector<Dim, Real>& v) cons
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real> Vector<Dim, Real>::operator *(const Real& x) const {
     Vector<Dim, Real> res;
-    inlineMultiplication<Dim, Real>::computation(res.coordinates, this->coordinates, x);
+    inlineMultiplication<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), x);
     return res;
 }
 
@@ -152,20 +157,20 @@ Vector<Dim, Real> Vector<Dim, Real>::operator /(const Real& x) const {
 template<unsigned int Dim, typename Real>
 Real Vector<Dim, Real>::operator*(const Vector &v)
 {
-    return inlineScalarProduct<Dim, Real>::computation(coordinates, v.coordinates);
+    return inlineScalarProduct<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
 }
 
 // Adds value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real>& Vector<Dim, Real>::operator +=(const Vector<Dim, Real>& v){
-    inlineAddition<Dim, Real>::computation(coordinates, v.coordinates);
+    inlineAddition<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
     return *this;
 }
 
 // Subtracts value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real>& Vector<Dim, Real>::operator -=(const Vector<Dim, Real>& v){
-    inlineSubtraction<Dim, Real>::computation(coordinates, v.coordinates);
+    inlineSubtraction<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
     return *this;
 }
 
@@ -173,7 +178,7 @@ Vector<Dim, Real>& Vector<Dim, Real>::operator -=(const Vector<Dim, Real>& v){
 // Adds value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vector<Dim, Real>& Vector<Dim, Real>::operator *=(const Real& x){
-    inlineMultiplication<Dim, Real>::computation(coordinates, x);
+    inlineMultiplication<Dim, Real>::computation(coordinates.data(), x);
     return *this;
 }
 
diff --git a/Unstructured_mesh/Vertex.h b/Unstructured_mesh/Vertex.h
index f033dc6..80c071c 100644
--- a/Unstructured_mesh/Vertex.h
+++ b/Unstructured_mesh/Vertex.h
@@ -4,7 +4,7 @@
 #include <iostream>
 #include <initializer_list>
 #include "InlineArrayOperations.h"
-
+#include <array>
 
 template <unsigned int Dim, typename Real = double>
 class Vertex {
@@ -12,7 +12,7 @@ class Vertex {
      * @brief coordinates<HR>
      * coordinates of the vertex in the space
      */
-    Real coordinates[Dim] = {};
+    std::array<Real, Dim> coordinates = {};
 
 public:
     Vertex(){}
@@ -26,6 +26,10 @@ public:
         coordinates[pos] = coord;
     }
 
+    std::array<Real, Dim>& getCoordinates() {
+        return coordinates;
+    }
+
     Real& operator[](unsigned int pos){
         return coordinates[pos];
     }
@@ -37,7 +41,7 @@ public:
     Real normEukleid();
 
     inline Real sumOfSquares() {
-        return  inlineScalarProduct<Dim, Real>::computation(coordinates, coordinates);
+        return  inlineScalarProduct<Dim, Real>::computation(coordinates.data(), coordinates.data());
     }
 
     Vertex<Dim, Real> operator-(const Vertex<Dim, Real>&) const;
@@ -105,7 +109,7 @@ Real Vertex<Dim, Real>::normEukleid(){
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real> Vertex<Dim, Real>::operator -(const Vertex<Dim, Real>& v) const {
     Vertex<Dim, Real> res;
-    inlineSubtraction<Dim, Real>::computation(res.coordinates, this->coordinates, v.coordinates);
+    inlineSubtraction<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), v.coordinates.data());
     return res;
 }
 
@@ -113,7 +117,7 @@ Vertex<Dim, Real> Vertex<Dim, Real>::operator -(const Vertex<Dim, Real>& v) cons
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real> Vertex<Dim, Real>::operator +(const Vertex<Dim, Real>& v) const {
     Vertex<Dim, Real> res;
-    inlineAddition<Dim, Real>::computation(res.coordinates, this->coordinates, v.coordinates);
+    inlineAddition<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), v.coordinates.data());
     return res;
 }
 
@@ -121,7 +125,7 @@ Vertex<Dim, Real> Vertex<Dim, Real>::operator +(const Vertex<Dim, Real>& v) cons
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real> Vertex<Dim, Real>::operator *(const Real& x) const {
     Vertex<Dim, Real> res;
-    inlineMultiplication<Dim, Real>::computation(res.coordinates, this->coordinates, x);
+    inlineMultiplication<Dim, Real>::computation(res.coordinates.data(), this->coordinates.data(), x);
     return res;
 }
 
@@ -136,7 +140,7 @@ Vertex<Dim, Real> Vertex<Dim, Real>::operator /(const Real& x) const {
 template<unsigned int Dim, typename Real>
 Real Vertex<Dim, Real>::operator*(const Vertex<Dim, Real> &v)
 {
-    return inlineScalarProduct<Dim, Real>::computation(coordinates, v.coordinates);
+    return inlineScalarProduct<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
 }
 
 
@@ -144,14 +148,14 @@ Real Vertex<Dim, Real>::operator*(const Vertex<Dim, Real> &v)
 // Adds value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real>& Vertex<Dim, Real>::operator +=(const Vertex<Dim, Real>& v){
-    inlineAddition<Dim, Real>::computation(coordinates, v.coordinates);
+    inlineAddition<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
     return *this;
 }
 
 // Subtracts value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real>& Vertex<Dim, Real>::operator -=(const Vertex<Dim, Real>& v){
-    inlineSubtraction<Dim, Real>::computation(coordinates, v.coordinates);
+    inlineSubtraction<Dim, Real>::computation(coordinates.data(), v.coordinates.data());
     return *this;
 }
 
@@ -159,7 +163,7 @@ Vertex<Dim, Real>& Vertex<Dim, Real>::operator -=(const Vertex<Dim, Real>& v){
 // Adds value of coordinates of another Point
 template <unsigned int Dim, typename Real>
 Vertex<Dim, Real>& Vertex<Dim, Real>::operator *=(const Real& x){
-    inlineMultiplication<Dim, Real>::computation(coordinates, x);
+    inlineMultiplication<Dim, Real>::computation(coordinates.data(), x);
     return *this;
 }
 
diff --git a/Unstructured_mesh/main.cpp b/Unstructured_mesh/main.cpp
index af79e47..a360ddf 100644
--- a/Unstructured_mesh/main.cpp
+++ b/Unstructured_mesh/main.cpp
@@ -695,6 +695,9 @@ void testDebug() {
     ConsoleLogger::writeVar(__LINE__, __FILE__, "r", r, "i", i, "c", c, "list", list, "vec", vec, "b", b, "map", m);
     ConsoleLogger::writeVar(__LINE__, __FILE__,"---", {5,4,3,2});
     DBGVAR(r, i, c, list, vec, b, m);
+
+    Vertex<7, double> vert;
+    DBGVAR(vert.getCoordinates());
 }
 
 
@@ -710,6 +713,6 @@ int main()
     //testTemplate();
     //UnstructuredMesh<5, size_t, double, 6,5,4> m;
     //m.ComputeElementMeasures();
-    testDebug();
+    //testDebug();
 
 }
diff --git a/debug/consolelogger.h b/debug/consolelogger.h
index d1b4d51..4f6672d 100644
--- a/debug/consolelogger.h
+++ b/debug/consolelogger.h
@@ -76,8 +76,11 @@ class ConsoleLogger {
 
     template<typename T>
     static auto _writeWar(const T &list)
-      -> typename std::enable_if<std::is_class<
-             decltype(std::declval<const T&>().begin())>::value &&
+      -> typename std::enable_if<
+             !std::is_same<
+                decltype(std::declval<const T&>().begin()),
+                void
+             >::value &&
              !std::is_same<T, std::string>::value
          >::type
     {
-- 
GitLab