3 #if (_VECOPS_USE_EXTERN_TEMPLATES) 8 #define TVEC_DECLARE_UNARY_OPERATOR(T, OP) \ 9 template RVec<T> operator OP(const RVec<T> &); 11 #define TVEC_DECLARE_BINARY_OPERATOR(T, OP) \ 12 template auto operator OP(const RVec<T> &v, const T &y) -> RVec<decltype(v[0] OP y)>; \ 13 template auto operator OP(const T &x, const RVec<T> &v) -> RVec<decltype(x OP v[0])>; \ 14 template auto operator OP(const RVec<T> &v0, const RVec<T> &v1) -> RVec<decltype(v0[0] OP v1[0])>; 16 #define TVEC_DECLARE_LOGICAL_OPERATOR(T, OP) \ 17 template RVec<int> operator OP(const RVec<T> &, const T &); \ 18 template RVec<int> operator OP(const T &, const RVec<T> &); \ 19 template RVec<int> operator OP(const RVec<T> &, const RVec<T> &); 21 #define TVEC_DECLARE_ASSIGN_OPERATOR(T, OP) \ 22 template RVec<T> &operator OP(RVec<T> &, const T &); \ 23 template RVec<T> &operator OP(RVec<T> &, const RVec<T> &); 25 #define TVEC_DECLARE_FLOAT_TEMPLATE(T) \ 26 template class RVec<T>; \ 27 TVEC_DECLARE_UNARY_OPERATOR(T, +) \ 28 TVEC_DECLARE_UNARY_OPERATOR(T, -) \ 29 TVEC_DECLARE_UNARY_OPERATOR(T, !) \ 30 TVEC_DECLARE_BINARY_OPERATOR(T, +) \ 31 TVEC_DECLARE_BINARY_OPERATOR(T, -) \ 32 TVEC_DECLARE_BINARY_OPERATOR(T, *) \ 33 TVEC_DECLARE_BINARY_OPERATOR(T, /) \ 34 TVEC_DECLARE_ASSIGN_OPERATOR(T, +=) \ 35 TVEC_DECLARE_ASSIGN_OPERATOR(T, -=) \ 36 TVEC_DECLARE_ASSIGN_OPERATOR(T, *=) \ 37 TVEC_DECLARE_ASSIGN_OPERATOR(T, /=) \ 38 TVEC_DECLARE_LOGICAL_OPERATOR(T, <) \ 39 TVEC_DECLARE_LOGICAL_OPERATOR(T, >) \ 40 TVEC_DECLARE_LOGICAL_OPERATOR(T, ==) \ 41 TVEC_DECLARE_LOGICAL_OPERATOR(T, !=) \ 42 TVEC_DECLARE_LOGICAL_OPERATOR(T, <=) \ 43 TVEC_DECLARE_LOGICAL_OPERATOR(T, >=) \ 44 TVEC_DECLARE_LOGICAL_OPERATOR(T, &&) \ 45 TVEC_DECLARE_LOGICAL_OPERATOR(T, ||) 47 #define TVEC_DECLARE_INTEGER_TEMPLATE(T) \ 48 template class RVec<T>; \ 49 TVEC_DECLARE_UNARY_OPERATOR(T, +) \ 50 TVEC_DECLARE_UNARY_OPERATOR(T, -) \ 51 TVEC_DECLARE_UNARY_OPERATOR(T, ~) \ 52 TVEC_DECLARE_UNARY_OPERATOR(T, !) \ 53 TVEC_DECLARE_BINARY_OPERATOR(T, +) \ 54 TVEC_DECLARE_BINARY_OPERATOR(T, -) \ 55 TVEC_DECLARE_BINARY_OPERATOR(T, *) \ 56 TVEC_DECLARE_BINARY_OPERATOR(T, /) \ 57 TVEC_DECLARE_BINARY_OPERATOR(T, %) \ 58 TVEC_DECLARE_BINARY_OPERATOR(T, &) \ 59 TVEC_DECLARE_BINARY_OPERATOR(T, |) \ 60 TVEC_DECLARE_BINARY_OPERATOR(T, ^) \ 61 TVEC_DECLARE_ASSIGN_OPERATOR(T, +=) \ 62 TVEC_DECLARE_ASSIGN_OPERATOR(T, -=) \ 63 TVEC_DECLARE_ASSIGN_OPERATOR(T, *=) \ 64 TVEC_DECLARE_ASSIGN_OPERATOR(T, /=) \ 65 TVEC_DECLARE_ASSIGN_OPERATOR(T, %=) \ 66 TVEC_DECLARE_ASSIGN_OPERATOR(T, &=) \ 67 TVEC_DECLARE_ASSIGN_OPERATOR(T, |=) \ 68 TVEC_DECLARE_ASSIGN_OPERATOR(T, ^=) \ 69 TVEC_DECLARE_ASSIGN_OPERATOR(T, >>=) \ 70 TVEC_DECLARE_ASSIGN_OPERATOR(T, <<=) \ 71 TVEC_DECLARE_LOGICAL_OPERATOR(T, <) \ 72 TVEC_DECLARE_LOGICAL_OPERATOR(T, >) \ 73 TVEC_DECLARE_LOGICAL_OPERATOR(T, ==) \ 74 TVEC_DECLARE_LOGICAL_OPERATOR(T, !=) \ 75 TVEC_DECLARE_LOGICAL_OPERATOR(T, <=) \ 76 TVEC_DECLARE_LOGICAL_OPERATOR(T, >=) \ 77 TVEC_DECLARE_LOGICAL_OPERATOR(T, &&) \ 78 TVEC_DECLARE_LOGICAL_OPERATOR(T, ||) 80 TVEC_DECLARE_INTEGER_TEMPLATE(
char)
81 TVEC_DECLARE_INTEGER_TEMPLATE(
short)
82 TVEC_DECLARE_INTEGER_TEMPLATE(
int)
83 TVEC_DECLARE_INTEGER_TEMPLATE(
long)
84 TVEC_DECLARE_INTEGER_TEMPLATE(
long long)
86 TVEC_DECLARE_INTEGER_TEMPLATE(
unsigned char)
87 TVEC_DECLARE_INTEGER_TEMPLATE(
unsigned short)
88 TVEC_DECLARE_INTEGER_TEMPLATE(
unsigned int)
89 TVEC_DECLARE_INTEGER_TEMPLATE(
unsigned long)
90 TVEC_DECLARE_INTEGER_TEMPLATE(
unsigned long long)
92 TVEC_DECLARE_FLOAT_TEMPLATE(
float)
93 TVEC_DECLARE_FLOAT_TEMPLATE(
double)
95 #define TVEC_DECLARE_UNARY_FUNCTION(T, NAME, FUNC) \ 96 template RVec<PromoteType<T>> NAME(const RVec<T> &); 98 #define TVEC_DECLARE_STD_UNARY_FUNCTION(T, F) TVEC_DECLARE_UNARY_FUNCTION(T, F, ::std::F) 100 #define TVEC_DECLARE_BINARY_FUNCTION(T0, T1, NAME, FUNC) \ 101 template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v, const T1 &y); \ 102 template RVec<PromoteTypes<T0, T1>> NAME(const T0 &x, const RVec<T1> &v); \ 103 template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v0, const RVec<T1> &v1); 105 #define TVEC_DECLARE_STD_BINARY_FUNCTION(T, F) TVEC_DECLARE_BINARY_FUNCTION(T, T, F, ::std::F) 107 #define TVEC_DECLARE_STD_FUNCTIONS(T) \ 108 TVEC_DECLARE_STD_UNARY_FUNCTION(T, abs) \ 109 TVEC_DECLARE_STD_BINARY_FUNCTION(T, fdim) \ 110 TVEC_DECLARE_STD_BINARY_FUNCTION(T, fmod) \ 111 TVEC_DECLARE_STD_BINARY_FUNCTION(T, remainder) \ 112 TVEC_DECLARE_STD_UNARY_FUNCTION(T, exp) \ 113 TVEC_DECLARE_STD_UNARY_FUNCTION(T, exp2) \ 114 TVEC_DECLARE_STD_UNARY_FUNCTION(T, expm1) \ 115 TVEC_DECLARE_STD_UNARY_FUNCTION(T, log) \ 116 TVEC_DECLARE_STD_UNARY_FUNCTION(T, log10) \ 117 TVEC_DECLARE_STD_UNARY_FUNCTION(T, log2) \ 118 TVEC_DECLARE_STD_UNARY_FUNCTION(T, log1p) \ 119 TVEC_DECLARE_STD_BINARY_FUNCTION(T, pow) \ 120 TVEC_DECLARE_STD_UNARY_FUNCTION(T, sqrt) \ 121 TVEC_DECLARE_STD_UNARY_FUNCTION(T, cbrt) \ 122 TVEC_DECLARE_STD_BINARY_FUNCTION(T, hypot) \ 123 TVEC_DECLARE_STD_UNARY_FUNCTION(T, sin) \ 124 TVEC_DECLARE_STD_UNARY_FUNCTION(T, cos) \ 125 TVEC_DECLARE_STD_UNARY_FUNCTION(T, tan) \ 126 TVEC_DECLARE_STD_UNARY_FUNCTION(T, asin) \ 127 TVEC_DECLARE_STD_UNARY_FUNCTION(T, acos) \ 128 TVEC_DECLARE_STD_UNARY_FUNCTION(T, atan) \ 129 TVEC_DECLARE_STD_BINARY_FUNCTION(T, atan2) \ 130 TVEC_DECLARE_STD_UNARY_FUNCTION(T, sinh) \ 131 TVEC_DECLARE_STD_UNARY_FUNCTION(T, cosh) \ 132 TVEC_DECLARE_STD_UNARY_FUNCTION(T, tanh) \ 133 TVEC_DECLARE_STD_UNARY_FUNCTION(T, asinh) \ 134 TVEC_DECLARE_STD_UNARY_FUNCTION(T, acosh) \ 135 TVEC_DECLARE_STD_UNARY_FUNCTION(T, atanh) \ 136 TVEC_DECLARE_STD_UNARY_FUNCTION(T, floor) \ 137 TVEC_DECLARE_STD_UNARY_FUNCTION(T, ceil) \ 138 TVEC_DECLARE_STD_UNARY_FUNCTION(T, trunc) \ 139 TVEC_DECLARE_STD_UNARY_FUNCTION(T, round) \ 140 TVEC_DECLARE_STD_UNARY_FUNCTION(T, lround) \ 141 TVEC_DECLARE_STD_UNARY_FUNCTION(T, llround) \ 142 TVEC_DECLARE_STD_UNARY_FUNCTION(T, erf) \ 143 TVEC_DECLARE_STD_UNARY_FUNCTION(T, erfc) \ 144 TVEC_DECLARE_STD_UNARY_FUNCTION(T, lgamma) \ 145 TVEC_DECLARE_STD_UNARY_FUNCTION(T, tgamma) \ 147 TVEC_DECLARE_STD_FUNCTIONS(
float)
148 TVEC_DECLARE_STD_FUNCTIONS(
double)
149 #undef TVEC_DECLARE_STD_UNARY_FUNCTION 150 #undef TVEC_DECLARE_STD_BINARY_FUNCTION 151 #undef TVEC_DECLARE_STD_UNARY_FUNCTIONS 155 #define TVEC_DECLARE_VDT_UNARY_FUNCTION(T, F) \ 156 TVEC_DECLARE_UNARY_FUNCTION(T, F, vdt::F) 158 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_expf)
159 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_logf)
160 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_sinf)
161 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_cosf)
162 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_tanf)
163 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_asinf)
164 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_acosf)
165 TVEC_DECLARE_VDT_UNARY_FUNCTION(
float, fast_atanf)
167 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_exp)
168 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_log)
169 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_sin)
170 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_cos)
171 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_tan)
172 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_asin)
173 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_acos)
174 TVEC_DECLARE_VDT_UNARY_FUNCTION(
double, fast_atan)
181 #endif // _VECOPS_USE_EXTERN_TEMPLATES Namespace for new ROOT classes and functions.