qvec: use fold expression for qv::dot

seems to help codegen on msvc.

gmsp3v2.bsp vis times: 51.9s , 52.1s
prev commit was 56s
This commit is contained in:
Eric Wasylishen 2023-11-09 00:25:31 -07:00
parent 57d5b22a95
commit 8845866c00
1 changed files with 9 additions and 5 deletions

View File

@ -364,16 +364,20 @@ template<class T, class T2>
v1[1] * v2[2] - v1[2] * v2[1], v1[2] * v2[0] - v1[0] * v2[2], v1[0] * v2[1] - v1[1] * v2[0]}; v1[1] * v2[2] - v1[2] * v2[1], v1[2] * v2[0] - v1[0] * v2[2], v1[0] * v2[1] - v1[1] * v2[0]};
} }
template<typename T, typename U, std::size_t... pack>
constexpr auto dot_impl(const T &v1, const U &v2, std::index_sequence<pack...> packed)
{
return ((v1[pack] * v2[pack]) + ...);
}
template<typename T, typename U, typename L = std::common_type_t<typename T::value_type, typename U::value_type>> template<typename T, typename U, typename L = std::common_type_t<typename T::value_type, typename U::value_type>>
[[nodiscard]] constexpr L dot(const T &v1, const U &v2) [[nodiscard]] constexpr L dot(const T &v1, const U &v2)
{ {
static_assert(std::size(T()) == std::size(U()), "Can't dot() with two differently-sized vectors"); static_assert(std::size(T()) == std::size(U()), "Can't dot() with two differently-sized vectors");
L result = 0; constexpr size_t N = std::size(T());
for (size_t i = 0; i < std::size(v1); i++) {
result += v1[i] * v2[i]; return dot_impl(v1, v2, std::make_index_sequence<N>());
}
return result;
} }
template<size_t N, class T> template<size_t N, class T>