#pragma once #include #include // Include array for std::array::at namespace Basalt::Shared::Math { using FloatPoint = float; struct Vector3 { FloatPoint x, y, z; FloatPoint& operator[](size_t index); const FloatPoint& operator[](size_t index) const; }; struct Vector4 { FloatPoint x, y, z, w; FloatPoint& operator[](size_t index); const FloatPoint& operator[](size_t index) const; }; struct Matrix4x4 { private: std::array data; // Use std::array instead of raw array for .at() method public: Vector4& operator[](size_t index); const Vector4& operator[](size_t index) const; }; #define NOT_IMPLEMENTED throw std::logic_error("not implemented function"); template struct Vector3Traits {}; template struct Matrix4x4Traits {}; #undef NOT_IMPLEMENTED } // namespace Basalt::Shared::Math