Add generic swizzling function

This commit is contained in:
Nikita Lisitsa 2021-01-25 22:16:24 +03:00
parent b2012aaa77
commit 2a04f0d421

View file

@ -0,0 +1,31 @@
#pragma once
#include <cstddef>
#include <type_traits>
namespace psemek::geom
{
namespace detail
{
template <typename T>
struct swizzle_rebind;
template <template <typename, std::size_t> typename C, typename T, std::size_t N>
struct swizzle_rebind<C<T, N>>
{
template <std::size_t M>
using type = C<T, M>;
};
}
template <std::size_t ... I>
constexpr auto swizzle = [](auto const & x){
using result = typename detail::swizzle_rebind<std::decay_t<decltype(x)>>::template type<sizeof...(I)>;
return result{(I == (-1) ? 0 : x[I])...};
};
}