#pragma once #include namespace lt::math { template struct vec3_impl { vec3_impl(): x(), y(), z() { } explicit vec3_impl(T scalar): x(scalar), y(scalar), z(scalar) { } vec3_impl(T x, T y, T z): x(x), y(y), z(z) { } [[nodiscard]] auto operator-(const vec3_impl &other) const -> vec3_impl { return { x - other.x, y - other.y, z - other.z, }; } [[nodiscard]] auto operator*(const vec3_impl &other) const -> vec3_impl { return { x * other.x, y * other.y, z * other.z, }; } T x; // NOLINT T y; // NOLINT T z; // NOLINT }; using vec3 = vec3_impl; using ivec3 = vec3_impl; using uvec3 = vec3_impl; } // namespace lt::math