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:
parent
57d5b22a95
commit
8845866c00
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue