diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-12-07 16:23:20 -0500 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-12-07 16:23:20 -0500 |
commit | caa765bff49d54217b75aaf0e7acf4e5392a11e4 (patch) | |
tree | 9b92914dfb88b99599e8e60e4512e9e9ea9a25db /glm/detail/compute_common.hpp | |
parent | a9274459443f1d560d7580a162deb581549980cb (diff) |
upload base code
Diffstat (limited to 'glm/detail/compute_common.hpp')
-rw-r--r-- | glm/detail/compute_common.hpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/glm/detail/compute_common.hpp b/glm/detail/compute_common.hpp new file mode 100644 index 0000000..7267a49 --- /dev/null +++ b/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) || (GLM_COMPILER & GLM_COMPILER_HIP) + 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 |