diff --git a/shared/source/helpers/vec.h b/shared/source/helpers/vec.h index b9a72a538b..8a769e859a 100644 --- a/shared/source/helpers/vec.h +++ b/shared/source/helpers/vec.h @@ -7,8 +7,16 @@ #pragma once +#include "shared/source/helpers/debug_helpers.h" + +#include +#include +#include + template struct Vec3 { + static_assert(std::is_pod::value); + Vec3(T x, T y, T z) : x(x), y(y), z(z) {} Vec3(const Vec3 &v) : x(v.x), y(v.y), z(v.z) {} Vec3(const T *arr) { @@ -43,6 +51,16 @@ struct Vec3 { return !operator==(vec); } + T &operator[](uint32_t i) { + UNRECOVERABLE_IF(i > 2); + return values[i]; + } + + T operator[](uint32_t i) const { + UNRECOVERABLE_IF(i > 2); + return values[i]; + } + unsigned int getSimplifiedDim() const { if (z > 1) { return 3; @@ -56,7 +74,14 @@ struct Vec3 { return 0; } - T x; - T y; - T z; + union { + struct { + T x, y, z; + }; + T values[3]; + }; }; + +static_assert(offsetof(Vec3, x) == offsetof(Vec3, values[0])); +static_assert(offsetof(Vec3, y) == offsetof(Vec3, values[1])); +static_assert(offsetof(Vec3, z) == offsetof(Vec3, values[2])); diff --git a/shared/test/unit_test/helpers/basic_math_tests.cpp b/shared/test/unit_test/helpers/basic_math_tests.cpp index 930d406b60..e72e201cd2 100644 --- a/shared/test/unit_test/helpers/basic_math_tests.cpp +++ b/shared/test/unit_test/helpers/basic_math_tests.cpp @@ -6,6 +6,7 @@ */ #include "shared/source/helpers/basic_math.h" +#include "shared/source/helpers/vec.h" #include "gtest/gtest.h" @@ -214,3 +215,28 @@ TEST(ffs, givenNonZeroThenReturnFirstSetBitIndex) { EXPECT_EQ(16ULL, ffs((1ULL << 63ULL) | (1ULL << 32ULL) | (1ULL << 16ULL))); EXPECT_EQ(63ULL, ffs(1ULL << 63ULL)); } + +TEST(Vec3Tests, whenAccessingVec3ThenCorrectResultsAreReturned) { + Vec3 vec{1, 2, 3}; + + EXPECT_EQ(1u, vec[0]); + EXPECT_EQ(2u, vec[1]); + EXPECT_EQ(3u, vec[2]); + EXPECT_EQ(vec.x, vec[0]); + EXPECT_EQ(vec.y, vec[1]); + EXPECT_EQ(vec.z, vec[2]); + + vec[0] = 10u; + vec[1] = 20u; + vec[2] = 30u; + EXPECT_EQ(10u, vec.x); + EXPECT_EQ(20u, vec.y); + EXPECT_EQ(30u, vec.z); + EXPECT_ANY_THROW(vec[3]); + + const Vec3 vec2 = {1, 2, 3}; + EXPECT_EQ(1u, vec2[0]); + EXPECT_EQ(2u, vec2[1]); + EXPECT_EQ(3u, vec2[2]); + EXPECT_ANY_THROW(vec2[3]); +}