libcamera: matrix: Make most functions constexpr
By zero-initializing the data_ member we can make most functions constexpr which will come in handy in upcoming patches. Note that this is due to C++17. In C++20 we will be able to leave data_ uninitialized for constexpr. The Matrix(std::array) version of the constructor can not be constexpr because std::copy only became constexpr in C++20. Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
parent
1d8a6db31c
commit
5234e4936f
1 changed files with 12 additions and 8 deletions
|
@ -25,9 +25,8 @@ class Matrix
|
||||||
static_assert(std::is_arithmetic_v<T>, "Matrix type must be arithmetic");
|
static_assert(std::is_arithmetic_v<T>, "Matrix type must be arithmetic");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Matrix()
|
constexpr Matrix()
|
||||||
{
|
{
|
||||||
data_.fill(static_cast<T>(0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix(const std::array<T, Rows * Cols> &data)
|
Matrix(const std::array<T, Rows * Cols> &data)
|
||||||
|
@ -35,7 +34,7 @@ public:
|
||||||
std::copy(data.begin(), data.end(), data_.begin());
|
std::copy(data.begin(), data.end(), data_.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
static Matrix identity()
|
static constexpr Matrix identity()
|
||||||
{
|
{
|
||||||
Matrix ret;
|
Matrix ret;
|
||||||
for (size_t i = 0; i < std::min(Rows, Cols); i++)
|
for (size_t i = 0; i < std::min(Rows, Cols); i++)
|
||||||
|
@ -63,14 +62,14 @@ public:
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
Span<const T, Rows * Cols> data() const { return data_; }
|
constexpr Span<const T, Rows * Cols> data() const { return data_; }
|
||||||
|
|
||||||
Span<const T, Cols> operator[](size_t i) const
|
constexpr Span<const T, Cols> operator[](size_t i) const
|
||||||
{
|
{
|
||||||
return Span<const T, Cols>{ &data_.data()[i * Cols], Cols };
|
return Span<const T, Cols>{ &data_.data()[i * Cols], Cols };
|
||||||
}
|
}
|
||||||
|
|
||||||
Span<T, Cols> operator[](size_t i)
|
constexpr Span<T, Cols> operator[](size_t i)
|
||||||
{
|
{
|
||||||
return Span<T, Cols>{ &data_.data()[i * Cols], Cols };
|
return Span<T, Cols>{ &data_.data()[i * Cols], Cols };
|
||||||
}
|
}
|
||||||
|
@ -88,7 +87,12 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::array<T, Rows * Cols> data_;
|
/*
|
||||||
|
* \todo The initializer is only necessary for the constructor to be
|
||||||
|
* constexpr in C++17. Remove the initializer as soon as we are on
|
||||||
|
* C++20.
|
||||||
|
*/
|
||||||
|
std::array<T, Rows * Cols> data_ = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef __DOXYGEN__
|
#ifndef __DOXYGEN__
|
||||||
|
@ -141,7 +145,7 @@ constexpr Matrix<T, R1, C2> operator*(const Matrix<T, R1, C1> &m1, const Matrix<
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, unsigned int Rows, unsigned int Cols>
|
template<typename T, unsigned int Rows, unsigned int Cols>
|
||||||
Matrix<T, Rows, Cols> operator+(const Matrix<T, Rows, Cols> &m1, const Matrix<T, Rows, Cols> &m2)
|
constexpr Matrix<T, Rows, Cols> operator+(const Matrix<T, Rows, Cols> &m1, const Matrix<T, Rows, Cols> &m2)
|
||||||
{
|
{
|
||||||
Matrix<T, Rows, Cols> result;
|
Matrix<T, Rows, Cols> result;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue