diff options
Diffstat (limited to 'Project/glm/detail/compute_common.hpp')
-rw-r--r-- | Project/glm/detail/compute_common.hpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Project/glm/detail/compute_common.hpp b/Project/glm/detail/compute_common.hpp new file mode 100644 index 0000000..cc24b9e --- /dev/null +++ b/Project/glm/detail/compute_common.hpp @@ -0,0 +1,50 @@ +#pragma once + +#include "setup.hpp" +#include <limits> + +namespace glm{ +namespace detail +{ + template<typename genFIType, bool /*signed*/> + struct compute_abs + {}; + + template<typename genFIType> + struct compute_abs<genFIType, true> + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + std::numeric_limits<genFIType>::is_iec559 || std::numeric_limits<genFIType>::is_signed, + "'abs' only accept floating-point and integer scalar or vector inputs"); + + return x >= genFIType(0) ? x : -x; + // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff; + } + }; + +#if GLM_COMPILER & GLM_COMPILER_CUDA + template<> + struct compute_abs<float, true> + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static float call(float x) + { + return fabsf(x); + } + }; +#endif + + template<typename genFIType> + struct compute_abs<genFIType, false> + { + GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x) + { + GLM_STATIC_ASSERT( + (!std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer), + "'abs' only accept floating-point and integer scalar or vector inputs"); + return x; + } + }; +}//namespace detail +}//namespace glm |