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:
Stefan Klug 2025-04-03 17:49:07 +02:00
parent 1d8a6db31c
commit 5234e4936f

View file

@ -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;