1.0.0 API documentation: compute_common.hpp Source File

| 1.0.0 API documentation

compute_common.hpp
1 #pragma once
2
3 #include "setup.hpp"
4 #include <limits>
5
6 namespace glm{
7 namespace detail
8 {
9 template<typename genFIType, bool /*signed*/>
10 struct compute_abs
11 {};
12
13 template<typename genFIType>
14 struct compute_abs<genFIType, true>
15 {
16 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x)
17 {
18 GLM_STATIC_ASSERT(
19 std::numeric_limits<genFIType>::is_iec559 || GLM_CONFIG_UNRESTRICTED_FLOAT || std::numeric_limits<genFIType>::is_signed,
20 "'abs' only accept floating-point and integer scalar or vector inputs");
21
22 return x >= genFIType(0) ? x : -x;
23 // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff;
24 }
25 };
26
27 #if (GLM_COMPILER & GLM_COMPILER_CUDA) || (GLM_COMPILER & GLM_COMPILER_HIP)
28 template<>
29 struct compute_abs<float, true>
30 {
31 GLM_FUNC_QUALIFIER static float call(float x)
32 {
33 return fabsf(x);
34 }
35 };
36 #endif
37
38 template<typename genFIType>
39 struct compute_abs<genFIType, false>
40 {
41 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static genFIType call(genFIType x)
42 {
43 GLM_STATIC_ASSERT(
44 (!std::numeric_limits<genFIType>::is_signed && std::numeric_limits<genFIType>::is_integer),
45 "'abs' only accept floating-point and integer scalar or vector inputs");
46 return x;
47 }
48 };
49 }//namespace detail
50 }//namespace glm