|
|
|
@ -14,10 +14,15 @@ namespace detail |
|
|
|
|
{ |
|
|
|
|
enum relational_type |
|
|
|
|
{ |
|
|
|
|
EQUAL, |
|
|
|
|
NOT_EQUAL, |
|
|
|
|
LESS, |
|
|
|
|
LESS_EQUAL, |
|
|
|
|
GREATER, |
|
|
|
|
GREATER_EQUAL |
|
|
|
|
GREATER_EQUAL, |
|
|
|
|
ANY, |
|
|
|
|
ALL, |
|
|
|
|
NOT |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <relational_type R> |
|
|
|
@ -27,6 +32,26 @@ namespace detail |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T Src1); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<EQUAL> |
|
|
|
|
{ |
|
|
|
|
template<typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T Src1) |
|
|
|
|
{ |
|
|
|
|
return Src0 == Src1; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<NOT_EQUAL> |
|
|
|
|
{ |
|
|
|
|
template<typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T Src1) |
|
|
|
|
{ |
|
|
|
|
return Src0 != Src1; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<LESS> |
|
|
|
|
{ |
|
|
|
@ -67,6 +92,59 @@ namespace detail |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<ANY> |
|
|
|
|
{ |
|
|
|
|
template<typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T Src1) |
|
|
|
|
{ |
|
|
|
|
return Src0 || Src1; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<ALL> |
|
|
|
|
{ |
|
|
|
|
template<typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T Src1) |
|
|
|
|
{ |
|
|
|
|
return Src0 && Src1; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
struct relational<NOT> |
|
|
|
|
{ |
|
|
|
|
template<typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(T Src0, T) |
|
|
|
|
{ |
|
|
|
|
return !Src0; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<length_t I, length_t N, relational_type R> |
|
|
|
|
struct reduce_relational |
|
|
|
|
{ |
|
|
|
|
template<typename vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static void call(bool& Dst, vecType const& Src) |
|
|
|
|
{ |
|
|
|
|
Dst = relational<R>::call(Dst, Src[I]); |
|
|
|
|
reduce_relational<I + 1, N, R>::call(Dst, Src); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
template <length_t N, relational_type R> |
|
|
|
|
struct reduce_relational<N, N, R> |
|
|
|
|
{ |
|
|
|
|
template<typename vecType> |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR static void call(bool&, vecType const&) |
|
|
|
|
{} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<length_t I, length_t N, relational_type R> |
|
|
|
|
struct loop_relational |
|
|
|
|
{ |
|
|
|
@ -120,47 +198,42 @@ namespace detail |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<length_t L, typename T, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y) |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> equal(vec<L, T, Q> const& x, vec<L, T, Q> const& y) |
|
|
|
|
{ |
|
|
|
|
vec<L, bool, Q> Result GLM_BUG_VC_INIT; |
|
|
|
|
for(length_t i = 0; i < x.length(); ++i) |
|
|
|
|
Result[i] = detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(x[i], y[i]); |
|
|
|
|
detail::loop_relational<0, L, detail::EQUAL>::call(Result, x, y); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<length_t L, typename T, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y) |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> notEqual(vec<L, T, Q> const& x, vec<L, T, Q> const& y) |
|
|
|
|
{ |
|
|
|
|
vec<L, bool, Q> Result GLM_BUG_VC_INIT; |
|
|
|
|
for(length_t i = 0; i < x.length(); ++i) |
|
|
|
|
Result[i] = !detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(x[i], y[i]); |
|
|
|
|
detail::loop_relational<0, L, detail::NOT_EQUAL>::call(Result, x, y); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<length_t L, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER bool any(vec<L, bool, Q> const& v) |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool any(vec<L, bool, Q> const& v) |
|
|
|
|
{ |
|
|
|
|
bool Result = false; |
|
|
|
|
for(length_t i = 0; i < v.length(); ++i) |
|
|
|
|
Result = Result || v[i]; |
|
|
|
|
detail::reduce_relational<0, L, detail::ANY>::call(Result, v); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<length_t L, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER bool all(vec<L, bool, Q> const& v) |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool all(vec<L, bool, Q> const& v) |
|
|
|
|
{ |
|
|
|
|
bool Result = true; |
|
|
|
|
for(length_t i = 0; i < v.length(); ++i) |
|
|
|
|
Result = Result && v[i]; |
|
|
|
|
detail::reduce_relational<0, L, detail::ALL>::call(Result, v); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<length_t L, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER vec<L, bool, Q> not_(vec<L, bool, Q> const& v) |
|
|
|
|
GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<L, bool, Q> not_(vec<L, bool, Q> const& v) |
|
|
|
|
{ |
|
|
|
|
vec<L, bool, Q> Result; |
|
|
|
|
for(length_t i = 0; i < v.length(); ++i) |
|
|
|
|
Result[i] = !v[i]; |
|
|
|
|
detail::loop_relational<0, L, detail::NOT>::call(Result, v, v); |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
}//namespace glm |
|
|
|
|