17#include "vdt/vdtMath.h"
29static_assert(
alignof(
RVec<Struct16B>) >=
alignof(Struct16B),
"wrong alignment for 16-byte aligned T");
30static_assert(
alignof(
RVec<Struct32B>) >=
alignof(Struct32B),
"wrong alignment for 32-byte aligned T");
31static_assert(
sizeof(
RVec<Struct16B>) >=
alignof(Struct16B),
"missing padding for 16-byte aligned T");
32static_assert(
sizeof(
RVec<Struct32B>) >=
alignof(Struct32B),
"missing padding for 32-byte aligned T");
33static_assert(
sizeof(
RVecN<void *, 0>) ==
sizeof(int32_t) * 2 +
sizeof(
void *),
"wasted space in RVec");
34static_assert(
sizeof(
RVecN<void *, 1>) ==
sizeof(int32_t) * 2 +
sizeof(
void *) * 2,
35 "wasted space in SmallVector size 1");
39 "wasted space in RVec");
43 std::string
Reason =
"RVec unable to grow. Requested capacity (" + std::to_string(MinSize) +
44 ") is larger than maximum value for size type (" + std::to_string(
SizeTypeMax()) +
")";
45 throw std::length_error(
Reason);
50 std::string
Reason =
"RVec capacity unable to grow. Already at maximum size " + std::to_string(SizeTypeMax());
51 throw std::length_error(
Reason);
59 if (MinSize > SizeTypeMax())
60 report_size_overflow(MinSize);
66 if (capacity() == SizeTypeMax())
67 report_at_maximum_capacity();
75 if (fBeginX == FirstEl || !this->Owns()) {
91#if (_VECOPS_USE_EXTERN_TEMPLATES)
96#define RVEC_DECLARE_UNARY_OPERATOR(T, OP) \
97 template RVec<T> operator OP(const RVec<T> &);
99#define RVEC_DECLARE_BINARY_OPERATOR(T, OP) \
100 template auto operator OP(const RVec<T> &v, const T &y) -> RVec<decltype(v[0] OP y)>; \
101 template auto operator OP(const T &x, const RVec<T> &v) -> RVec<decltype(x OP v[0])>; \
102 template auto operator OP(const RVec<T> &v0, const RVec<T> &v1) -> RVec<decltype(v0[0] OP v1[0])>;
104#define RVEC_DECLARE_LOGICAL_OPERATOR(T, OP) \
105 template RVec<int> operator OP(const RVec<T> &, const T &); \
106 template RVec<int> operator OP(const T &, const RVec<T> &); \
107 template RVec<int> operator OP(const RVec<T> &, const RVec<T> &);
109#define RVEC_DECLARE_ASSIGN_OPERATOR(T, OP) \
110 template RVec<T> &operator OP(RVec<T> &, const T &); \
111 template RVec<T> &operator OP(RVec<T> &, const RVec<T> &);
113#define RVEC_DECLARE_FLOAT_TEMPLATE(T) \
114 template class RVec<T>; \
115 RVEC_DECLARE_UNARY_OPERATOR(T, +) \
116 RVEC_DECLARE_UNARY_OPERATOR(T, -) \
117 RVEC_DECLARE_UNARY_OPERATOR(T, !) \
118 RVEC_DECLARE_BINARY_OPERATOR(T, +) \
119 RVEC_DECLARE_BINARY_OPERATOR(T, -) \
120 RVEC_DECLARE_BINARY_OPERATOR(T, *) \
121 RVEC_DECLARE_BINARY_OPERATOR(T, /) \
122 RVEC_DECLARE_ASSIGN_OPERATOR(T, +=) \
123 RVEC_DECLARE_ASSIGN_OPERATOR(T, -=) \
124 RVEC_DECLARE_ASSIGN_OPERATOR(T, *=) \
125 RVEC_DECLARE_ASSIGN_OPERATOR(T, /=) \
126 RVEC_DECLARE_LOGICAL_OPERATOR(T, <) \
127 RVEC_DECLARE_LOGICAL_OPERATOR(T, >) \
128 RVEC_DECLARE_LOGICAL_OPERATOR(T, ==) \
129 RVEC_DECLARE_LOGICAL_OPERATOR(T, !=) \
130 RVEC_DECLARE_LOGICAL_OPERATOR(T, <=) \
131 RVEC_DECLARE_LOGICAL_OPERATOR(T, >=) \
132 RVEC_DECLARE_LOGICAL_OPERATOR(T, &&) \
133 RVEC_DECLARE_LOGICAL_OPERATOR(T, ||)
135#define RVEC_DECLARE_INTEGER_TEMPLATE(T) \
136 template class RVec<T>; \
137 RVEC_DECLARE_UNARY_OPERATOR(T, +) \
138 RVEC_DECLARE_UNARY_OPERATOR(T, -) \
139 RVEC_DECLARE_UNARY_OPERATOR(T, ~) \
140 RVEC_DECLARE_UNARY_OPERATOR(T, !) \
141 RVEC_DECLARE_BINARY_OPERATOR(T, +) \
142 RVEC_DECLARE_BINARY_OPERATOR(T, -) \
143 RVEC_DECLARE_BINARY_OPERATOR(T, *) \
144 RVEC_DECLARE_BINARY_OPERATOR(T, /) \
145 RVEC_DECLARE_BINARY_OPERATOR(T, %) \
146 RVEC_DECLARE_BINARY_OPERATOR(T, &) \
147 RVEC_DECLARE_BINARY_OPERATOR(T, |) \
148 RVEC_DECLARE_BINARY_OPERATOR(T, ^) \
149 RVEC_DECLARE_ASSIGN_OPERATOR(T, +=) \
150 RVEC_DECLARE_ASSIGN_OPERATOR(T, -=) \
151 RVEC_DECLARE_ASSIGN_OPERATOR(T, *=) \
152 RVEC_DECLARE_ASSIGN_OPERATOR(T, /=) \
153 RVEC_DECLARE_ASSIGN_OPERATOR(T, %=) \
154 RVEC_DECLARE_ASSIGN_OPERATOR(T, &=) \
155 RVEC_DECLARE_ASSIGN_OPERATOR(T, |=) \
156 RVEC_DECLARE_ASSIGN_OPERATOR(T, ^=) \
157 RVEC_DECLARE_ASSIGN_OPERATOR(T, >>=) \
158 RVEC_DECLARE_ASSIGN_OPERATOR(T, <<=) \
159 RVEC_DECLARE_LOGICAL_OPERATOR(T, <) \
160 RVEC_DECLARE_LOGICAL_OPERATOR(T, >) \
161 RVEC_DECLARE_LOGICAL_OPERATOR(T, ==) \
162 RVEC_DECLARE_LOGICAL_OPERATOR(T, !=) \
163 RVEC_DECLARE_LOGICAL_OPERATOR(T, <=) \
164 RVEC_DECLARE_LOGICAL_OPERATOR(T, >=) \
165 RVEC_DECLARE_LOGICAL_OPERATOR(T, &&) \
166 RVEC_DECLARE_LOGICAL_OPERATOR(T, ||)
183#define RVEC_DECLARE_UNARY_FUNCTION(T, NAME, FUNC) \
184 template RVec<PromoteType<T>> NAME(const RVec<T> &);
186#define RVEC_DECLARE_STD_UNARY_FUNCTION(T, F) RVEC_DECLARE_UNARY_FUNCTION(T, F, ::std::F)
188#define RVEC_DECLARE_BINARY_FUNCTION(T0, T1, NAME, FUNC) \
189 template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v, const T1 &y); \
190 template RVec<PromoteTypes<T0, T1>> NAME(const T0 &x, const RVec<T1> &v); \
191 template RVec<PromoteTypes<T0, T1>> NAME(const RVec<T0> &v0, const RVec<T1> &v1);
193#define RVEC_DECLARE_STD_BINARY_FUNCTION(T, F) RVEC_DECLARE_BINARY_FUNCTION(T, T, F, ::std::F)
195#define RVEC_DECLARE_STD_FUNCTIONS(T) \
196 RVEC_DECLARE_STD_UNARY_FUNCTION(T, abs) \
197 RVEC_DECLARE_STD_BINARY_FUNCTION(T, fdim) \
198 RVEC_DECLARE_STD_BINARY_FUNCTION(T, fmod) \
199 RVEC_DECLARE_STD_BINARY_FUNCTION(T, remainder) \
200 RVEC_DECLARE_STD_UNARY_FUNCTION(T, exp) \
201 RVEC_DECLARE_STD_UNARY_FUNCTION(T, exp2) \
202 RVEC_DECLARE_STD_UNARY_FUNCTION(T, expm1) \
203 RVEC_DECLARE_STD_UNARY_FUNCTION(T, log) \
204 RVEC_DECLARE_STD_UNARY_FUNCTION(T, log10) \
205 RVEC_DECLARE_STD_UNARY_FUNCTION(T, log2) \
206 RVEC_DECLARE_STD_UNARY_FUNCTION(T, log1p) \
207 RVEC_DECLARE_STD_BINARY_FUNCTION(T, pow) \
208 RVEC_DECLARE_STD_UNARY_FUNCTION(T, sqrt) \
209 RVEC_DECLARE_STD_UNARY_FUNCTION(T, cbrt) \
210 RVEC_DECLARE_STD_BINARY_FUNCTION(T, hypot) \
211 RVEC_DECLARE_STD_UNARY_FUNCTION(T, sin) \
212 RVEC_DECLARE_STD_UNARY_FUNCTION(T, cos) \
213 RVEC_DECLARE_STD_UNARY_FUNCTION(T, tan) \
214 RVEC_DECLARE_STD_UNARY_FUNCTION(T, asin) \
215 RVEC_DECLARE_STD_UNARY_FUNCTION(T, acos) \
216 RVEC_DECLARE_STD_UNARY_FUNCTION(T, atan) \
217 RVEC_DECLARE_STD_BINARY_FUNCTION(T, atan2) \
218 RVEC_DECLARE_STD_UNARY_FUNCTION(T, sinh) \
219 RVEC_DECLARE_STD_UNARY_FUNCTION(T, cosh) \
220 RVEC_DECLARE_STD_UNARY_FUNCTION(T, tanh) \
221 RVEC_DECLARE_STD_UNARY_FUNCTION(T, asinh) \
222 RVEC_DECLARE_STD_UNARY_FUNCTION(T, acosh) \
223 RVEC_DECLARE_STD_UNARY_FUNCTION(T, atanh) \
224 RVEC_DECLARE_STD_UNARY_FUNCTION(T, floor) \
225 RVEC_DECLARE_STD_UNARY_FUNCTION(T, ceil) \
226 RVEC_DECLARE_STD_UNARY_FUNCTION(T, trunc) \
227 RVEC_DECLARE_STD_UNARY_FUNCTION(T, round) \
228 RVEC_DECLARE_STD_UNARY_FUNCTION(T, lround) \
229 RVEC_DECLARE_STD_UNARY_FUNCTION(T, llround) \
230 RVEC_DECLARE_STD_UNARY_FUNCTION(T, erf) \
231 RVEC_DECLARE_STD_UNARY_FUNCTION(T, erfc) \
232 RVEC_DECLARE_STD_UNARY_FUNCTION(T, lgamma) \
233 RVEC_DECLARE_STD_UNARY_FUNCTION(T, tgamma) \
237#undef RVEC_DECLARE_STD_UNARY_FUNCTION
238#undef RVEC_DECLARE_STD_BINARY_FUNCTION
239#undef RVEC_DECLARE_STD_UNARY_FUNCTIONS
243#define RVEC_IMPLEMENT_VDT_UNARY_FUNCTION(FP, FUNC) \
244 RVec<FP> FUNC(RVec<FP> const &in) \
246 RVec<FP> out(in.size()); \
247 for (unsigned int i = 0; i < in.size(); ++i) { \
248 out[i] = vdt::FUNC(in[i]); \
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
static constexpr size_t SizeTypeMax()
The maximum value of the Size_T used.
static void report_size_overflow(size_t MinSize)
Report that MinSize doesn't fit into this vector's size type.
static void report_at_maximum_capacity()
Report that this vector is already at maximum capacity.
void grow_pod(void *FirstEl, size_t MinSize, size_t TSize)
This is an implementation of the grow() method which only works on POD-like data types and is out of ...
The size of the inline storage of an RVec.