| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #pragma once
- #include <functional>
- #include "_vectorize.hpp"
- namespace glm {
- namespace detail
- {
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_vec_add {};
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_vec_sub {};
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_vec_mul {};
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_vec_div {};
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_vec_mod {};
- template<length_t L, typename T, qualifier Q, bool UseSimd>
- struct compute_splat {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_and {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_or {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_xor {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_shift_left {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_shift_right {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_equal {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_nequal {};
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
- struct compute_vec_bitwise_not {};
- template<length_t L, typename T, qualifier Q>
- struct compute_vec_add<L, T, Q, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- return detail::functor2<vec, L, T, Q>::call(std::plus<T>(), a, b);
- }
- };
- template<length_t L, typename T, qualifier Q>
- struct compute_vec_sub<L, T, Q, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- return detail::functor2<vec, L, T, Q>::call(std::minus<T>(), a, b);
- }
- };
- template<length_t L, typename T, qualifier Q>
- struct compute_vec_mul<L, T, Q, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- return detail::functor2<vec, L, T, Q>::call(std::multiplies<T>(), a, b);
- }
- };
- template<length_t L, typename T, qualifier Q>
- struct compute_vec_div<L, T, Q, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- return detail::functor2<vec, L, T, Q>::call(std::divides<T>(), a, b);
- }
- };
- template<length_t L, typename T, qualifier Q>
- struct compute_vec_mod<L, T, Q, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- return detail::functor2<vec, L, T, Q>::call(std::modulus<T>(), a, b);
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_and<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] &= static_cast<T>(b[i]);
- return v;
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_or<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] |= static_cast<T>(b[i]);
- return v;
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_xor<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] ^= static_cast<T>(b[i]);
- return v;
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_shift_left<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] <<= static_cast<T>(b[i]);
- return v;
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_shift_right<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] >>= static_cast<T>(b[i]);
- return v;
- }
- };
-
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_equal<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<L, T, Q> const& v1, vec<L, T, Q> const& v2)
- {
- bool b = true;
- for (length_t i = 0; i < L; ++i)
- b = b && detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x);
- return b;
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_nequal<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
- {
- return !compute_vec_equal<L, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
- }
- };
- template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
- struct compute_vec_bitwise_not<L, T, Q, IsInt, Size, false>
- {
- GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a)
- {
- vec<L, T, Q> v(a);
- for (length_t i = 0; i < L; ++i)
- v[i] = ~v[i];
- return v;
- }
- };
- }
- }
|