Loading...
Searching...
No Matches
math.h
Go to the documentation of this file.
1#ifndef _BBM_MATH_BACKBONE_CONCEPT_H_
2#define _BBM_MATH_BACKBONE_CONCEPT_H_
3
4#include <concepts>
5
6/************************************************************************/
7/*! \file math.h
8
9 \brief Extended math functionality
10
11*************************************************************************/
12
13namespace bbm {
14 namespace concepts {
15 namespace backbone {
16
17 /******************************************************************/
18 /*! \brief Concept to check if a type has all bbm math functions
19
20 + fmod(a, b): modulo
21 + lerp(a, b, t): linear interpolation
22 + exp(a): \f$ e^a \f$
23 + log(a): natural logarithm
24 + pow(a, b): \f$ a^b \f$
25 + sqrt(a): \f$ \sqrt{a} \f$
26 + cos(a), sin(a), tan(a): trig functions
27 + acos(a), asin(a), atan(a): inverse trig functions
28 + atan2(a, b) = atan(a/b)
29 + cossin(a) : vec2d(cos(a), sin(a))
30 + cosh(a), sinh(a), tanh(a); hyperbolic functions
31 + acosh(a), asinh(a), atanh(a); inversehyperbolic functions
32 + abs(a): absolute value
33 + copysign(a, b) : copy the sign of b and the magnitude of a
34 + sign(a) = copysign(1, a)
35 + max(a,b), min(a,b)
36 + ceil(a), floor(a)
37 + round(a)
38 + clamp(a, l, u): min(max(a, l), u)
39 + safe_sqrt(a) : \f$ \sqrt{ max(a,0) } \f$
40 + safe_acos(a) : asin( clamp(a, -1, +1) )
41 + safe_asin(a) : acos( clamp(a, -1, +1) )
42 + eq, neq: equals and not equals; yields mask_t
43 + isnan, isinfinite, isinf; yields mask_t
44 ******************************************************************/
45 template<typename T>
46 concept has_math_functions = requires(T a)
47 {
49
50 // General
51 { bbm::fmod(a, a) } -> std::convertible_to<T>;
52 { bbm::lerp(a, a, a) } -> std::convertible_to<T>;
53
54 // Exponentionals
55 { bbm::exp(a) } -> std::convertible_to<T>;
56 { bbm::log(a) } -> std::convertible_to<T>;
57 { bbm::pow(a, a) } -> std::convertible_to<T>;
58 { bbm::sqrt(a) } -> std::convertible_to<T>;
59
60 // Trig
61 { bbm::cossin(a) } -> std::convertible_to<vec2d<T>>;
62 { bbm::cos(a) } -> std::convertible_to<T>;
63 { bbm::acos(a) } -> std::convertible_to<T>;
64 { bbm::sin(a) } -> std::convertible_to<T>;
65 { bbm::asin(a) } -> std::convertible_to<T>;
66 { bbm::tan(a) } -> std::convertible_to<T>;
67 { bbm::atan(a) } -> std::convertible_to<T>;
68 //{ bbm::atan2(a, a) } -> std::convertible_to<T>;
69
70 // Hyperbolic
71 { bbm::cosh(a) } -> std::convertible_to<T>;
72 { bbm::acosh(a) } -> std::convertible_to<T>;
73 { bbm::sinh(a) } -> std::convertible_to<T>;
74 { bbm::asinh(a) } -> std::convertible_to<T>;
75 { bbm::tanh(a) } -> std::convertible_to<T>;
76 { bbm::atanh(a) } -> std::convertible_to<T>;
77
78 // Sign
79 { bbm::abs(a) } -> std::convertible_to<T>;
80 { bbm::copysign(a, a) } -> std::convertible_to<T>;
81 { bbm::sign(a) } -> std::convertible_to<T>;
82
83 // Rounding & Limiting
84 { bbm::max(a,a) } -> std::convertible_to<T>;
85 { bbm::min(a,a) } -> std::convertible_to<T>;
86 { bbm::ceil(a) } -> std::convertible_to<T>;
87 { bbm::floor(a) } -> std::convertible_to<T>;
88 { bbm::round(a) } -> std::convertible_to<T>;
89 { bbm::clamp(a,a,a) } ->std::convertible_to<T>;
90
91 // Safe versions
92 { bbm::safe_sqrt(a) } -> std::convertible_to<T>;
93 { bbm::safe_asin(a) } -> std::convertible_to<T>;
94 { bbm::safe_acos(a) } -> std::convertible_to<T>;
95
96 // Comparisons
97 { bbm::eq(a,a) } -> std::convertible_to<mask_t<T>>;
98 { bbm::neq(a,a) } -> std::convertible_to<mask_t<T>>;
99
100 { bbm::isnan(a) } -> std::convertible_to<mask_t<T>>;
101 { bbm::isinf(a) } -> std::convertible_to<mask_t<T>>;
102 { bbm::isfinite(a) } -> std::convertible_to<mask_t<T>>;
103 };
104
105 } // end backbone namespace
106 } // end concepts namespace
107} // end bbm namespace
108
109
110#endif /* _BBM_MATH_BACKBONE_CONCEPT_H_ */
Concept to check if a type has all bbm math functions.
Definition: math.h:46
Definition: util.h:25
Random number generator; built on top of Drjit.
Definition: backbone.h:53
Definition: aggregatebsdf.h:29