Logo ROOT   6.16/01
Reference Guide
RVec.cxx
Go to the documentation of this file.
1#include "ROOT/RVec.hxx"
2
3#if (_VECOPS_USE_EXTERN_TEMPLATES)
4
5namespace ROOT {
6namespace VecOps {
7
8#define TVEC_DECLARE_UNARY_OPERATOR(T, OP) \
9 template RVec<T> operator OP(const RVec<T> &);
10
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])>;
15
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> &);
20
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> &);
24
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, ||)
46
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, ||)
79
80TVEC_DECLARE_INTEGER_TEMPLATE(char)
81TVEC_DECLARE_INTEGER_TEMPLATE(short)
82TVEC_DECLARE_INTEGER_TEMPLATE(int)
83TVEC_DECLARE_INTEGER_TEMPLATE(long)
84TVEC_DECLARE_INTEGER_TEMPLATE(long long)
85
86TVEC_DECLARE_INTEGER_TEMPLATE(unsigned char)
87TVEC_DECLARE_INTEGER_TEMPLATE(unsigned short)
88TVEC_DECLARE_INTEGER_TEMPLATE(unsigned int)
89TVEC_DECLARE_INTEGER_TEMPLATE(unsigned long)
90TVEC_DECLARE_INTEGER_TEMPLATE(unsigned long long)
91
92TVEC_DECLARE_FLOAT_TEMPLATE(float)
93TVEC_DECLARE_FLOAT_TEMPLATE(double)
94
95#define TVEC_DECLARE_UNARY_FUNCTION(T, NAME, FUNC) \
96 template RVec<PromoteType<T>> NAME(const RVec<T> &);
97
98#define TVEC_DECLARE_STD_UNARY_FUNCTION(T, F) TVEC_DECLARE_UNARY_FUNCTION(T, F, ::std::F)
99
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);
104
105#define TVEC_DECLARE_STD_BINARY_FUNCTION(T, F) TVEC_DECLARE_BINARY_FUNCTION(T, T, F, ::std::F)
106
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) \
146
147TVEC_DECLARE_STD_FUNCTIONS(float)
148TVEC_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
152
153#ifdef R__HAS_VDT
154
155#define TVEC_DECLARE_VDT_UNARY_FUNCTION(T, F) \
156 TVEC_DECLARE_UNARY_FUNCTION(T, F, vdt::F)
157
158TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_expf)
159TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_logf)
160TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_sinf)
161TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_cosf)
162TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_tanf)
163TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_asinf)
164TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_acosf)
165TVEC_DECLARE_VDT_UNARY_FUNCTION(float, fast_atanf)
166
167TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_exp)
168TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_log)
169TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_sin)
170TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_cos)
171TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_tan)
172TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_asin)
173TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_acos)
174TVEC_DECLARE_VDT_UNARY_FUNCTION(double, fast_atan)
175
176#endif // R__HAS_VDT
177
178} // namespace VecOps
179} // namespace ROOT
180
181#endif // _VECOPS_USE_EXTERN_TEMPLATES
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21