From 8f518b3cbe5a16f42ab559b3cd21bdb62414142c Mon Sep 17 00:00:00 2001
From: Sebastian Eibl <sebastian.eibl@fau.de>
Date: Tue, 2 Oct 2018 09:57:11 +0200
Subject: [PATCH] make GenericAABB, Vector2, Vector3, Matrix3 and Quaternion
 trivially copyable

---
 src/core/math/GenericAABB.h               |  1 +
 src/core/math/Matrix3.h                   | 97 ++++-------------------
 src/core/math/Quaternion.h                | 79 ++++--------------
 src/core/math/Vector2.h                   | 75 ++++--------------
 src/core/math/Vector3.h                   | 77 ++++--------------
 src/pe/fcd/AnalyticCollisionDetection.h   |  4 +
 tests/core/math/PlaneTest.cpp             |  2 +-
 tests/lbm/boundary/DiffusionDirichlet.cpp |  4 +-
 8 files changed, 67 insertions(+), 272 deletions(-)

diff --git a/src/core/math/GenericAABB.h b/src/core/math/GenericAABB.h
index 270a7a53f..309d16f94 100644
--- a/src/core/math/GenericAABB.h
+++ b/src/core/math/GenericAABB.h
@@ -216,6 +216,7 @@ private:
    vector_type minCorner_; /// minimal values
    vector_type maxCorner_; /// maximal values
 };
+static_assert( std::is_trivially_copyable<GenericAABB<real_t>>::value, "GenericAABB<real_t> has to be trivially copyable!");
 
 
 
diff --git a/src/core/math/Matrix3.h b/src/core/math/Matrix3.h
index fe3c0e00c..3f38c096b 100644
--- a/src/core/math/Matrix3.h
+++ b/src/core/math/Matrix3.h
@@ -95,7 +95,7 @@ private:
 
 public:
    //**Constructors*****************************************************************************************************
-   explicit inline Matrix3();
+   explicit inline Matrix3() = default;
    explicit inline Matrix3( Type init );
    explicit inline Matrix3( const Vector3<Type>& a, const Vector3<Type>& b, const Vector3<Type>& c );
    explicit inline Matrix3( Type xx, Type xy, Type xz, Type yx, Type yy, Type yz, Type zx, Type zy, Type zz );
@@ -104,7 +104,7 @@ public:
    template< typename Axis, typename Angle >
    explicit Matrix3( Vector3<Axis> axis, Angle angle );
 
-   inline Matrix3( const Matrix3& m );
+   inline Matrix3( const Matrix3& m ) = default;
 
    template< typename Other >
    inline Matrix3( const Matrix3<Other>& m );
@@ -122,7 +122,7 @@ public:
    /*!\name Operators */
    //@{
                               inline Matrix3&    operator= ( Type set );
-                              inline Matrix3&    operator= ( const Matrix3& set );
+                              inline Matrix3&    operator= ( const Matrix3& set ) = default;
    template< typename Other > inline Matrix3&    operator= ( const Matrix3<Other>& set );
    template< typename Other > inline bool        operator==( const Matrix3<Other>& rhs )   const;
    template< typename Other > inline bool        operator!=( const Matrix3<Other>& rhs )   const;
@@ -236,17 +236,23 @@ private:
    //**Member variables****************************************************************************
    /*!\name Member variables */
    //@{
-   Type v_[9];  //!< The nine statically allocated matrix elements.
-                /*!< Access to the matrix elements is gained via the subscript or function call
-                     operator. The order of the elements is
-                     \f[\left(\begin{array}{*{3}{c}}
-                     0 & 1 & 2 \\
-                     3 & 4 & 5 \\
-                     6 & 7 & 8 \\
-                     \end{array}\right)\f] */
+   /**
+    * The nine statically allocated matrix elements.
+    * Access to the matrix elements is gained via the subscript or function call
+    * operator. The order of the elements is
+    * \f[\left(\begin{array}{*{3}{c}}
+    * 0 & 1 & 2 \\
+    * 3 & 4 & 5 \\
+    * 6 & 7 & 8 \\
+    * \end{array}\right)\f]
+   **/
+   Type v_[9] = {Type(1), Type(0), Type(0),
+                 Type(0), Type(1), Type(0),
+                 Type(0), Type(0), Type(1)};
    //@}
    //*******************************************************************************************************************
 };
+static_assert( std::is_trivially_copyable<Matrix3<real_t>>::value, "Matrix3<real_t> has to be trivially copyable!");
 //**********************************************************************************************************************
 
 
@@ -258,21 +264,6 @@ private:
 //
 //======================================================================================================================
 
-//**********************************************************************************************************************
-/*!\fn Matrix3<Type>::Matrix3()
-// \brief The default constructor for Matrix3.
-//
-// The diagonal matrix elements are initialized with 1, all other elements are initialized
-// with 0.
-*/
-template< typename Type >
-inline Matrix3<Type>::Matrix3()
-{
-   v_[0] = v_[4] = v_[8] = Type(1);
-   v_[1] = v_[2] = v_[3] = v_[5] = v_[6] = v_[7] = Type(0);
-}
-//**********************************************************************************************************************
-
 
 //**********************************************************************************************************************
 /*!\fn Matrix3<Type>::Matrix3( Type init )
@@ -392,30 +383,6 @@ Matrix3<Type>::Matrix3( Vector3<Axis> axis, Angle angle )
 //**********************************************************************************************************************
 
 
-//**********************************************************************************************************************
-/*!\fn Matrix3<Type>::Matrix3( const Matrix3& m )
-// \brief The copy constructor for Matrix3.
-//
-// \param m Matrix to be copied.
-//
-// The copy constructor is explicitly defined in order to enable/facilitate NRV optimization.
-*/
-template< typename Type >
-inline Matrix3<Type>::Matrix3( const Matrix3& m )
-{
-   v_[0] = m.v_[0];
-   v_[1] = m.v_[1];
-   v_[2] = m.v_[2];
-   v_[3] = m.v_[3];
-   v_[4] = m.v_[4];
-   v_[5] = m.v_[5];
-   v_[6] = m.v_[6];
-   v_[7] = m.v_[7];
-   v_[8] = m.v_[8];
-}
-//**********************************************************************************************************************
-
-
 //**********************************************************************************************************************
 /*!\fn Matrix3<Type>::Matrix3( const Matrix3<Other>& m )
 // \brief Conversion constructor from different Matrix3 instances.
@@ -514,36 +481,6 @@ inline Matrix3<Type>& Matrix3<Type>::operator=( Type set )
 //**********************************************************************************************************************
 
 
-//**********************************************************************************************************************
-/*!\fn Matrix3<Type>& Matrix3<Type>::operator=( const Matrix3& set )
-// \brief Copy assignment operator for Matrix3.
-//
-// \param set Matrix to be copied.
-// \return Reference to the assigned matrix.
-//
-// Explicit definition of a copy assignment operator for performance reasons.
-*/
-template< typename Type >
-inline Matrix3<Type>& Matrix3<Type>::operator=( const Matrix3& set )
-{
-   // This implementation is faster than the synthesized default copy assignment operator and
-   // faster than an implementation with the C library function 'memcpy' in combination with a
-   // protection against self-assignment. Additionally, this version goes without a protection
-   // against self-assignment.
-   v_[0] = set.v_[0];
-   v_[1] = set.v_[1];
-   v_[2] = set.v_[2];
-   v_[3] = set.v_[3];
-   v_[4] = set.v_[4];
-   v_[5] = set.v_[5];
-   v_[6] = set.v_[6];
-   v_[7] = set.v_[7];
-   v_[8] = set.v_[8];
-   return *this;
-}
-//**********************************************************************************************************************
-
-
 //**********************************************************************************************************************
 /*!\fn Matrix3<Type>& Matrix3<Type>::operator=( const Matrix3<Other>& set )
 // \brief Assignment operator for different Matrix3 instances.
diff --git a/src/core/math/Quaternion.h b/src/core/math/Quaternion.h
index ccf6836d1..4e531ea73 100644
--- a/src/core/math/Quaternion.h
+++ b/src/core/math/Quaternion.h
@@ -115,7 +115,7 @@ public:
    //**Constructors********************************************************************************
    /*!\name Constructors */
    //@{
-   explicit inline Quaternion();
+   explicit inline Quaternion() = default;
 
    explicit inline Quaternion( Type r, Type i, Type j, Type k );
 
@@ -127,7 +127,7 @@ public:
    template< typename Other >
    explicit inline Quaternion( const Vector3<Other>& euler );
 
-   inline Quaternion( const Quaternion& q );
+   inline Quaternion( const Quaternion& q ) = default;
 
    template< typename Other >
    inline Quaternion( const Quaternion<Other>& q );
@@ -141,7 +141,7 @@ public:
    //**Operators***********************************************************************************
    /*!\name Operators */
    //@{
-                              inline Quaternion& operator= ( const Quaternion& rhs );
+                              inline Quaternion& operator= ( const Quaternion& rhs ) = default;
    template< typename Other > inline Quaternion& operator= ( const Quaternion<Other>& rhs );
                               inline Type        operator[]( size_t index ) const;
    //@}
@@ -195,15 +195,20 @@ private:
    //**Member variables****************************************************************************
    /*!\name Member variables */
    //@{
-   Type v_[4];  //!< The four statically allocated quaternion elements.
-                /*!< Access to the quaternion values is gained via the subscript operator.
-                     The order of the elements is
-                     \f[\left(\begin{array}{*{4}{c}}
-                     0 & 1 & 2 & 3 \\
-                     \end{array}\right)\f] */
+   /**
+    * The four statically allocated quaternion elements.
+    *
+    * Access to the quaternion values is gained via the subscript operator.
+    * The order of the elements is
+    * \f[\left(\begin{array}{*{4}{c}}
+    * 0 & 1 & 2 & 3 \\
+    * \end{array}\right)\f]
+   **/
+   Type v_[4] = {Type(1), Type(0), Type(0), Type(0)};
    //@}
    //**********************************************************************************************
 };
+static_assert( std::is_trivially_copyable<Quaternion<real_t>>::value, "Quaternion<real_t> has to be trivially copyable!");
 //*************************************************************************************************
 
 
@@ -215,21 +220,6 @@ private:
 //
 //=================================================================================================
 
-//*************************************************************************************************
-/*!\brief The default constructor for Quaternion.
- *
- * The real part of the quaternion is initialized with 1, whereas the imaginary parts are
- * initialized with 0:
-
-           \f[ \left(\begin{array}{c} 1 \\ 0 \\ 0 \\ 0 \end{array}\right) \f]
- */
-template< typename Type >  // Data type of the quaternion
-inline Quaternion<Type>::Quaternion()
-{
-   reset();
-}
-//*************************************************************************************************
-
 
 //*************************************************************************************************
 /*!\brief Constructor for a direct initialization of all quaternion elements.
@@ -331,24 +321,6 @@ inline Quaternion<Type>::Quaternion( const Vector3<Other>& euler )
 //*************************************************************************************************
 
 
-//*************************************************************************************************
-/*!\brief The copy constructor for Quaternion.
- *
- * \param q Quaternion to be copied.
- *
- * The copy constructor is explicitly defined in order to enable/facilitate NRV optimization.
- */
-template< typename Type >  // Data type of the quaternion
-inline Quaternion<Type>::Quaternion( const Quaternion& q )
-{
-   v_[0] = q.v_[0];
-   v_[1] = q.v_[1];
-   v_[2] = q.v_[2];
-   v_[3] = q.v_[3];
-}
-//*************************************************************************************************
-
-
 //*************************************************************************************************
 /*!\brief Conversion constructor from different Quaternion instances.
  *
@@ -374,29 +346,6 @@ inline Quaternion<Type>::Quaternion( const Quaternion<Other>& q )
 //
 //=================================================================================================
 
-//*************************************************************************************************
-/*!\brief Copy assignment operator for Quaternion.
- *
- * \param rhs Quaternion to be copied.
- * \return Reference to the assigned quaternion.
- *
- * Explicit definition of a copy assignment operator for performance reasons.
- */
-template< typename Type >  // Data type of the quaternion
-inline Quaternion<Type>& Quaternion<Type>::operator=( const Quaternion<Type>& rhs )
-{
-   // This implementation is faster than the synthesized default copy assignment operator and
-   // faster than an implementation with the C library function 'memcpy' in combination with a
-   // protection against self-assignment. Additionally, this version goes without a protection
-   // against self-assignment.
-   v_[0] = rhs.v_[0];
-   v_[1] = rhs.v_[1];
-   v_[2] = rhs.v_[2];
-   v_[3] = rhs.v_[3];
-   return *this;
-}
-//*************************************************************************************************
-
 
 //*************************************************************************************************
 /*!\brief Assignment operator for different Quaternion instances.
diff --git a/src/core/math/Vector2.h b/src/core/math/Vector2.h
index 145bf302f..a6ad5c300 100644
--- a/src/core/math/Vector2.h
+++ b/src/core/math/Vector2.h
@@ -107,12 +107,12 @@ public:
    //*******************************************************************************************************************
 
    //**Constructors*****************************************************************************************************
-                              explicit inline Vector2();
+                              explicit inline Vector2() = default;
                               explicit inline Vector2( Type init );
    template< typename Other > explicit inline Vector2( Other init );
                               explicit inline Vector2( Type x, Type y );
                               explicit inline Vector2( const Type* init );
-                                       inline Vector2( const Vector2& v );
+                                       inline Vector2( const Vector2& v ) = default;
 
    template< typename Other >
    inline Vector2( const Vector2<Other>& v );
@@ -125,7 +125,7 @@ public:
    //**Operators********************************************************************************************************
    /*!\name Operators */
    //@{
-   inline Vector2&                              operator= ( const Vector2& v );
+   inline Vector2&                              operator= ( const Vector2& v ) = default;
    template< typename Other > inline Vector2&   operator= ( const Vector2<Other>& v );
    template< typename Other > inline bool       operator==( Other rhs )                 const;
    template< typename Other > inline bool       operator==( const Vector2<Other>& rhs ) const;
@@ -172,15 +172,20 @@ public:
    //**Member variables****************************************************************************
    /*!\name Member variables */
    //@{
-   Type v_[2];  //!< The two statically allocated vector elements.
-                /*!< Access to the vector values is gained via the subscript operator.
-                     The order of the elements is
-                     \f[\left(\begin{array}{*{2}{c}}
-                     0 & 1 \\
-                     \end{array}\right)\f] */
+   /**
+    * The two statically allocated vector elements.
+    *
+    * Access to the vector values is gained via the subscript operator.
+    * The order of the elements is
+    * \f[\left(\begin{array}{*{2}{c}}
+    * 0 & 1 \\
+    * \end{array}\right)\f]
+   **/
+   Type v_[2] = {Type(), Type()};
    //@}
    //*******************************************************************************************************************
 };
+static_assert( std::is_trivially_copyable<Vector2<real_t>>::value, "Vector2<real_t> has to be trivially copyable!");
 //**********************************************************************************************************************
 
 template<typename T>
@@ -193,19 +198,6 @@ Vector2<T> & normalize( Vector2<T> & v );
 //
 //======================================================================================================================
 
-//**********************************************************************************************************************
-/*!\fn Vector2<Type>::Vector2()
-// \brief The default constructor for Vector2.
-//
-// All vector elements are initialized to the default value (i.e. 0 for integral data types).
-*/
-template< typename Type >
-inline Vector2<Type>::Vector2()
-{
-   v_[0] = v_[1] = Type();
-}
-//**********************************************************************************************************************
-
 
 //**********************************************************************************************************************
 /*!\fn Vector2<Type>::Vector2( Type init )
@@ -271,23 +263,6 @@ inline Vector2<Type>::Vector2( const Type* init )
 //**********************************************************************************************************************
 
 
-//**********************************************************************************************************************
-/*!\fn Vector2<Type>::Vector2( const Vector2& v )
-// \brief The copy constructor for Vector2.
-//
-// \param v Vector to be copied.
-//
-// The copy constructor is explicitly defined in order to enable/facilitate NRV optimization.
-*/
-template< typename Type >
-inline Vector2<Type>::Vector2( const Vector2& v )
-{
-   v_[0] = v.v_[0];
-   v_[1] = v.v_[1];
-}
-//**********************************************************************************************************************
-
-
 //**********************************************************************************************************************
 /*!\fn Vector2<Type>::Vector2( const Vector2<Other>& v )
 // \brief Conversion constructor from different Vector2 instances.
@@ -312,28 +287,6 @@ inline Vector2<Type>::Vector2( const Vector2<Other>& v )
 //
 //======================================================================================================================
 
-//**********************************************************************************************************************
-/*!\fn Vector2<Type>& Vector2<Type>::operator=( const Vector2& v )
-// \brief Copy assignment operator for Vector2.
-//
-// \param v Vector to be copied.
-// \return Reference to the assigned vector.
-//
-// Explicit definition of a copy assignment operator for performance reasons.
-*/
-template< typename Type >
-inline Vector2<Type>& Vector2<Type>::operator=( const Vector2& v )
-{
-   // This implementation is faster than the synthesized default copy assignment operator and
-   // faster than an implementation with the C library function 'memcpy' in combination with a
-   // protection against self-assignment. Additionally, this version goes without a protection
-   // against self-assignment.
-   v_[0] = v.v_[0];
-   v_[1] = v.v_[1];
-   return *this;
-}
-//**********************************************************************************************************************
-
 
 //**********************************************************************************************************************
 /*!\fn Vector2<Type>& Vector2<Type>::operator=( const Vector2<Other>& v )
diff --git a/src/core/math/Vector3.h b/src/core/math/Vector3.h
index 662d2dfa5..da90e4cfd 100644
--- a/src/core/math/Vector3.h
+++ b/src/core/math/Vector3.h
@@ -108,12 +108,12 @@ public:
    //*******************************************************************************************************************
 
    //**Constructors*****************************************************************************************************
-                              explicit inline Vector3();
+                              explicit inline Vector3() = default;
                               explicit inline Vector3( Type init );
    template< typename Other > explicit inline Vector3( Other init );
                               explicit inline Vector3( Type x, Type y, Type z );
                               explicit inline Vector3( const Type* init );
-                                       inline Vector3( const Vector3& v );
+                                       inline Vector3( const Vector3& v ) = default;
 
    template< typename Other >
    inline Vector3( const Vector3<Other>& v );
@@ -126,7 +126,7 @@ public:
    //**Operators********************************************************************************************************
    /*!\name Operators */
    //@{
-   inline Vector3&                              operator= ( const Vector3& v );
+   inline Vector3&                              operator= ( const Vector3& v ) = default;
    template< typename Other > inline Vector3&   operator= ( const Vector3<Other>& v );
    template< typename Other > inline bool       operator==( Other rhs )                 const;
    template< typename Other > inline bool       operator==( const Vector3<Other>& rhs ) const;
@@ -179,15 +179,20 @@ public:
    //**Member variables****************************************************************************
    /*!\name Member variables */
    //@{
-   Type v_[3];  //!< The three statically allocated vector elements.
-                /*!< Access to the vector values is gained via the subscript operator.
-                     The order of the elements is
-                     \f[\left(\begin{array}{*{3}{c}}
-                     0 & 1 & 2 \\
-                     \end{array}\right)\f] */
+   /**
+    * The three statically allocated vector elements.
+    *
+    * Access to the vector values is gained via the subscript operator.
+    * The order of the elements is
+    * \f[\left(\begin{array}{*{3}{c}}
+    * 0 & 1 & 2 \\
+    * \end{array}\right)\f]
+   **/
+   Type v_[3] = {Type(), Type(), Type()};
    //@}
    //*******************************************************************************************************************
 };
+static_assert( std::is_trivially_copyable<Vector3<real_t>>::value, "Vector3<real_t> has to be trivially copyable!");
 //**********************************************************************************************************************
 
 template<typename T>
@@ -200,19 +205,6 @@ Vector3<T> & normalize( Vector3<T> & v );
 //
 //======================================================================================================================
 
-//**********************************************************************************************************************
-/*!\fn Vector3<Type>::Vector3()
-// \brief The default constructor for Vector3.
-//
-// All vector elements are initialized to the default value (i.e. 0 for integral data types).
-*/
-template< typename Type >
-inline Vector3<Type>::Vector3()
-{
-   v_[0] = v_[1] = v_[2] = Type();
-}
-//**********************************************************************************************************************
-
 
 //**********************************************************************************************************************
 /*!\fn Vector3<Type>::Vector3( Type init )
@@ -281,24 +273,6 @@ inline Vector3<Type>::Vector3( const Type* init )
 //**********************************************************************************************************************
 
 
-//**********************************************************************************************************************
-/*!\fn Vector3<Type>::Vector3( const Vector3& v )
-// \brief The copy constructor for Vector3.
-//
-// \param v Vector to be copied.
-//
-// The copy constructor is explicitly defined in order to enable/facilitate NRV optimization.
-*/
-template< typename Type >
-inline Vector3<Type>::Vector3( const Vector3& v )
-{
-   v_[0] = v.v_[0];
-   v_[1] = v.v_[1];
-   v_[2] = v.v_[2];
-}
-//**********************************************************************************************************************
-
-
 //**********************************************************************************************************************
 /*!\fn Vector3<Type>::Vector3( const Vector3<Other>& v )
 // \brief Conversion constructor from different Vector3 instances.
@@ -324,29 +298,6 @@ inline Vector3<Type>::Vector3( const Vector3<Other>& v )
 //
 //======================================================================================================================
 
-//**********************************************************************************************************************
-/*!\fn Vector3<Type>& Vector3<Type>::operator=( const Vector3& v )
-// \brief Copy assignment operator for Vector3.
-//
-// \param v Vector to be copied.
-// \return Reference to the assigned vector.
-//
-// Explicit definition of a copy assignment operator for performance reasons.
-*/
-template< typename Type >
-inline Vector3<Type>& Vector3<Type>::operator=( const Vector3& v )
-{
-   // This implementation is faster than the synthesized default copy assignment operator and
-   // faster than an implementation with the C library function 'memcpy' in combination with a
-   // protection against self-assignment. Additionally, this version goes without a protection
-   // against self-assignment.
-   v_[0] = v.v_[0];
-   v_[1] = v.v_[1];
-   v_[2] = v.v_[2];
-   return *this;
-}
-//**********************************************************************************************************************
-
 
 //**********************************************************************************************************************
 /*!\fn Vector3<Type>& Vector3<Type>::operator=( const Vector3<Other>& v )
diff --git a/src/pe/fcd/AnalyticCollisionDetection.h b/src/pe/fcd/AnalyticCollisionDetection.h
index 5318eaae9..2bf9513ba 100644
--- a/src/pe/fcd/AnalyticCollisionDetection.h
+++ b/src/pe/fcd/AnalyticCollisionDetection.h
@@ -818,7 +818,9 @@ bool collide( BoxID b1, BoxID b2, Container& container )
       for( unsigned int i=0; i<3; ++i ) {
          sign[i] = ( sign[i]>0 ) ? ( hl1[i] ) : ( -hl1[i] );
       }
+      #ifdef WALBERLA_LOGLEVEL_DETAIL
       const Vec3 tmp1( sign );
+      #endif
       pB1 += R1 * sign;
 
       Vec3 pB2 = b2->getPosition();
@@ -826,7 +828,9 @@ bool collide( BoxID b1, BoxID b2, Container& container )
       for( size_t i=0; i<3; ++i ) {
          sign[i] = ( sign[i]>0 ) ? ( -hl2[i] ) : ( hl2[i] );
       }
+      #ifdef WALBERLA_LOGLEVEL_DETAIL
       const Vec3 tmp2( sign );
+      #endif
       pB2 += R2 * sign;
 
       Vec3 ua, ub;
diff --git a/tests/core/math/PlaneTest.cpp b/tests/core/math/PlaneTest.cpp
index 12b1f32d0..98cfdb45e 100644
--- a/tests/core/math/PlaneTest.cpp
+++ b/tests/core/math/PlaneTest.cpp
@@ -115,7 +115,7 @@ int main(int argc, char * argv[])
 
    for( real_t x(-10); x < real_t(11); x += real_t(0.25) )
    {
-      static const Vector3<real_t> ZERO_VECTOR;
+      static const Vector3<real_t> ZERO_VECTOR {};
       Plane pShifted( p );
       pShifted.shift( x );
       WALBERLA_CHECK_FLOAT_EQUAL( pShifted.signedDistance( ZERO_VECTOR ), -x );
diff --git a/tests/lbm/boundary/DiffusionDirichlet.cpp b/tests/lbm/boundary/DiffusionDirichlet.cpp
index 98215ff64..79cee7c42 100644
--- a/tests/lbm/boundary/DiffusionDirichlet.cpp
+++ b/tests/lbm/boundary/DiffusionDirichlet.cpp
@@ -199,8 +199,8 @@ public:
    void val( real_t& _val, cell_idx_t x, cell_idx_t, cell_idx_t ) const override { _val = real_c( cos( period_*( real_c(x) + real_c(0.5) ) ) ); }
 
 private:
-   const real_t period_;
-   const vec3_t vel_;
+   const real_t period_ {};
+   const vec3_t vel_ {};
 };
 
 
-- 
GitLab