Skip to content
Snippets Groups Projects
Commit 870aeeef authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add no_init value

This value is used to define explicitly constructors with no initialization. In
particular, it allows to define default (no init) constructor helper when
writing trivial types: default constructor being defined as (=default). This
helps to avoid compiler to complain about false uninitialized variables.
parent b8b86947
No related branches found
No related tags found
1 merge request!11Feature/mpi
...@@ -36,7 +36,7 @@ public: ...@@ -36,7 +36,7 @@ public:
PASTIS_INLINE PASTIS_INLINE
constexpr TinyMatrix operator-() const constexpr TinyMatrix operator-() const
{ {
TinyMatrix opposed; TinyMatrix opposed{no_init};
for (size_t i=0; i<N*N; ++i) { for (size_t i=0; i<N*N; ++i) {
opposed.m_values[i] = -m_values[i]; opposed.m_values[i] = -m_values[i];
} }
...@@ -63,7 +63,7 @@ public: ...@@ -63,7 +63,7 @@ public:
constexpr TinyMatrix operator*(const TinyMatrix& B) const constexpr TinyMatrix operator*(const TinyMatrix& B) const
{ {
const TinyMatrix& A = *this; const TinyMatrix& A = *this;
TinyMatrix AB; TinyMatrix AB{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
for (size_t j=0; j<N; ++j) { for (size_t j=0; j<N; ++j) {
T sum = A(i,0)*B(0,j); T sum = A(i,0)*B(0,j);
...@@ -80,7 +80,7 @@ public: ...@@ -80,7 +80,7 @@ public:
constexpr TinyVector<N,T> operator*(const TinyVector<N,T>& x) const constexpr TinyVector<N,T> operator*(const TinyVector<N,T>& x) const
{ {
const TinyMatrix& A = *this; const TinyMatrix& A = *this;
TinyVector<N,T> Ax; TinyVector<N,T> Ax{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
T sum = A(i,0)*x[0]; T sum = A(i,0)*x[0];
for (size_t j=1; j<N; ++j) { for (size_t j=1; j<N; ++j) {
...@@ -129,7 +129,7 @@ public: ...@@ -129,7 +129,7 @@ public:
PASTIS_INLINE PASTIS_INLINE
constexpr TinyMatrix operator+(const TinyMatrix& A) const constexpr TinyMatrix operator+(const TinyMatrix& A) const
{ {
TinyMatrix sum; TinyMatrix sum{no_init};
for (size_t i=0; i<N*N; ++i) { for (size_t i=0; i<N*N; ++i) {
sum.m_values[i] = m_values[i]+A.m_values[i]; sum.m_values[i] = m_values[i]+A.m_values[i];
} }
...@@ -148,7 +148,7 @@ public: ...@@ -148,7 +148,7 @@ public:
PASTIS_INLINE PASTIS_INLINE
constexpr TinyMatrix operator-(const TinyMatrix& A) const constexpr TinyMatrix operator-(const TinyMatrix& A) const
{ {
TinyMatrix difference; TinyMatrix difference{no_init};
for (size_t i=0; i<N*N; ++i) { for (size_t i=0; i<N*N; ++i) {
difference.m_values[i] = m_values[i]-A.m_values[i]; difference.m_values[i] = m_values[i]-A.m_values[i];
} }
...@@ -255,6 +255,11 @@ public: ...@@ -255,6 +255,11 @@ public:
} }
} }
// Default constructor helper. Used to define uninitialized TinyMatrix
// avoiding compiler's false uninitialized warning.
PASTIS_INLINE
constexpr TinyMatrix(const NoInitType&) noexcept {}
PASTIS_INLINE PASTIS_INLINE
constexpr TinyMatrix(const TinyMatrix&) noexcept = default; constexpr TinyMatrix(const TinyMatrix&) noexcept = default;
...@@ -270,7 +275,7 @@ PASTIS_INLINE ...@@ -270,7 +275,7 @@ PASTIS_INLINE
constexpr TinyMatrix<N,T> tensorProduct(const TinyVector<N,T>& x, constexpr TinyMatrix<N,T> tensorProduct(const TinyVector<N,T>& x,
const TinyVector<N,T>& y) const TinyVector<N,T>& y)
{ {
TinyMatrix<N,T> A; TinyMatrix<N,T> A{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
for (size_t j=0; j<N; ++j) { for (size_t j=0; j<N; ++j) {
A(i,j) = x[i]*y[j]; A(i,j) = x[i]*y[j];
...@@ -287,7 +292,7 @@ constexpr T det(const TinyMatrix<N,T>& A) ...@@ -287,7 +292,7 @@ constexpr T det(const TinyMatrix<N,T>& A)
static_assert(std::is_floating_point<T>::value, "determinent for arbitrary dimension N is defined for floating point types only"); static_assert(std::is_floating_point<T>::value, "determinent for arbitrary dimension N is defined for floating point types only");
TinyMatrix<N,T> M = A; TinyMatrix<N,T> M = A;
TinyVector<N, size_t> index; TinyVector<N, size_t> index{no_init};
for (size_t i=0; i<N; ++i) index[i]=i; for (size_t i=0; i<N; ++i) index[i]=i;
T determinent = 1; T determinent = 1;
...@@ -358,7 +363,7 @@ constexpr TinyMatrix<N-1,T> getMinor(const TinyMatrix<N,T>& A, ...@@ -358,7 +363,7 @@ constexpr TinyMatrix<N-1,T> getMinor(const TinyMatrix<N,T>& A,
{ {
static_assert(N>=2, "minor calculation requires at least 2x2 matrices"); static_assert(N>=2, "minor calculation requires at least 2x2 matrices");
Assert((I<N) and (J<N)); Assert((I<N) and (J<N));
TinyMatrix<N-1, T> M; TinyMatrix<N-1,T> M{no_init};
for (size_t i=0; i<I; ++i) { for (size_t i=0; i<I; ++i) {
for (size_t j=0; j<J; ++j) { for (size_t j=0; j<J; ++j) {
M(i,j)=A(i,j); M(i,j)=A(i,j);
......
...@@ -31,7 +31,7 @@ class TinyVector ...@@ -31,7 +31,7 @@ class TinyVector
PASTIS_INLINE PASTIS_INLINE
constexpr TinyVector operator-() const constexpr TinyVector operator-() const
{ {
TinyVector opposed; TinyVector opposed{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
opposed.m_values[i] =-m_values[i]; opposed.m_values[i] =-m_values[i];
} }
...@@ -106,7 +106,7 @@ class TinyVector ...@@ -106,7 +106,7 @@ class TinyVector
PASTIS_INLINE PASTIS_INLINE
constexpr TinyVector operator+(const TinyVector& v) const constexpr TinyVector operator+(const TinyVector& v) const
{ {
TinyVector sum; TinyVector sum{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
sum.m_values[i] = m_values[i]+v.m_values[i]; sum.m_values[i] = m_values[i]+v.m_values[i];
} }
...@@ -125,7 +125,7 @@ class TinyVector ...@@ -125,7 +125,7 @@ class TinyVector
PASTIS_INLINE PASTIS_INLINE
constexpr TinyVector operator-(const TinyVector& v) const constexpr TinyVector operator-(const TinyVector& v) const
{ {
TinyVector difference; TinyVector difference{no_init};
for (size_t i=0; i<N; ++i) { for (size_t i=0; i<N; ++i) {
difference.m_values[i] = m_values[i]-v.m_values[i]; difference.m_values[i] = m_values[i]-v.m_values[i];
} }
...@@ -197,6 +197,11 @@ class TinyVector ...@@ -197,6 +197,11 @@ class TinyVector
this->_unpackVariadicInput(t, args...); this->_unpackVariadicInput(t, args...);
} }
// Default constructor helper. Used to define uninitialized TinyVector
// avoiding compiler's false uninitialized warning.
PASTIS_INLINE
constexpr TinyVector(const NoInitType&) noexcept {}
PASTIS_INLINE PASTIS_INLINE
constexpr TinyVector() noexcept = default; constexpr TinyVector() noexcept = default;
......
#ifndef TYPES_HPP #ifndef TYPES_HPP
#define TYPES_HPP #define TYPES_HPP
enum class NoInitType { no_init };
constexpr NoInitType no_init=NoInitType::no_init;
enum class ZeroType { zero }; enum class ZeroType { zero };
constexpr ZeroType zero=ZeroType::zero; constexpr ZeroType zero=ZeroType::zero;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment