diff options
author | Zaggy1024 <zaggy1024@gmail.com> | 2022-09-30 17:38:24 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-10-25 11:06:11 +0200 |
commit | ba79de0439ff797c3e922c5908d3ad60eafbdb43 (patch) | |
tree | a17ce982306562e80869c7e897e868506db2f978 /Userland/Libraries/LibGfx | |
parent | 0994e6964b21f619ae1db83449769aaace8129a6 (diff) | |
download | serenity-ba79de0439ff797c3e922c5908d3ad60eafbdb43.zip |
LibGfx: Make Matrix and VectorN more constexpr-friendly
This allows the copy constructor of Matrix to be called constexpr,
which should allow more values to be compile-time calculated.
Likewise, VectorN.data() is now constexpr so that it can be compile-time
evaluated.
Diffstat (limited to 'Userland/Libraries/LibGfx')
-rw-r--r-- | Userland/Libraries/LibGfx/Matrix.h | 16 | ||||
-rw-r--r-- | Userland/Libraries/LibGfx/VectorN.h | 4 |
2 files changed, 15 insertions, 5 deletions
diff --git a/Userland/Libraries/LibGfx/Matrix.h b/Userland/Libraries/LibGfx/Matrix.h index 638ced76f5..1d7d0a7d94 100644 --- a/Userland/Libraries/LibGfx/Matrix.h +++ b/Userland/Libraries/LibGfx/Matrix.h @@ -36,13 +36,23 @@ public: { } - Matrix(Matrix const& other) + constexpr Matrix(Matrix const& other) { - __builtin_memcpy(m_elements, other.elements(), sizeof(T) * N * N); + *this = other; } - Matrix& operator=(Matrix const& other) + constexpr Matrix& operator=(Matrix const& other) { +#ifndef __clang__ + if (is_constant_evaluated()) { + for (size_t i = 0; i < N; i++) { + for (size_t j = 0; j < N; j++) { + m_elements[i][j] = other.elements()[i][j]; + } + } + return *this; + } +#endif __builtin_memcpy(m_elements, other.elements(), sizeof(T) * N * N); return *this; } diff --git a/Userland/Libraries/LibGfx/VectorN.h b/Userland/Libraries/LibGfx/VectorN.h index 0f3f5f38ca..66c70d7eea 100644 --- a/Userland/Libraries/LibGfx/VectorN.h +++ b/Userland/Libraries/LibGfx/VectorN.h @@ -251,8 +251,8 @@ public: return result; } - auto& data() { return m_data; } - auto const& data() const { return m_data; } + constexpr auto& data() { return m_data; } + constexpr auto const& data() const { return m_data; } private: AK::Array<T, N> m_data; |