4 #ifndef ROOT_Math_MatrixRepresentationsStatic
5 #define ROOT_Math_MatrixRepresentationsStatic 1
26 #include <type_traits>
52 template <
class T,
unsigned int D1,
unsigned int D2=D1>
59 inline const T& operator()(
unsigned int i,
unsigned int j)
const {
60 return fArray[i*D2+j];
62 inline T& operator()(
unsigned int i,
unsigned int j) {
63 return fArray[i*D2+j];
65 inline T& operator[](
unsigned int i) {
return fArray[i]; }
67 inline const T& operator[](
unsigned int i)
const {
return fArray[i]; }
69 inline T apply(
unsigned int i)
const {
return fArray[i]; }
71 inline T* Array() {
return fArray; }
73 inline const T* Array()
const {
return fArray; }
76 inline MatRepStd<T, D1, D2>& operator+=(
const R& rhs) {
77 for(
unsigned int i=0; i<kSize; ++i) fArray[i] += rhs[i];
82 inline MatRepStd<T, D1, D2>& operator-=(
const R& rhs) {
83 for(
unsigned int i=0; i<kSize; ++i) fArray[i] -= rhs[i];
88 inline MatRepStd<T, D1, D2>& operator=(
const R& rhs) {
89 for(
unsigned int i=0; i<kSize; ++i) fArray[i] = rhs[i];
94 inline bool operator==(
const R& rhs)
const {
96 for(
unsigned int i=0; i<kSize; ++i) {
97 rc = rc && (fArray[i] == rhs[i]);
129 template<
unsigned int D>
131 inline RowOffsets() {
134 for (
unsigned int i=1; i<D; ++i)
136 for (
unsigned int i=0; i<D; ++i) {
137 for (
unsigned int j=0; j<=i; ++j)
138 fOff[i*D+j] = v[i]+j;
139 for (
unsigned int j=i+1; j<D; ++j)
140 fOff[i*D+j] = v[j]+i ;
143 inline int operator()(
unsigned int i,
unsigned int j)
const {
return fOff[i*D+j]; }
144 inline int apply(
unsigned int i)
const {
return fOff[i]; }
148 namespace rowOffsetsUtils {
152 template<
int...>
struct indices{};
154 template<
int I,
class IndexTuple,
int N>
155 struct make_indices_impl;
157 template<
int I,
int... Indices,
int N>
158 struct make_indices_impl<I, indices<Indices...>, N>
160 typedef typename make_indices_impl<I + 1, indices<Indices..., I>,
164 template<
int N,
int... Indices>
165 struct make_indices_impl<N, indices<Indices...>, N> {
166 typedef indices<Indices...> type;
170 struct make_indices : make_indices_impl<0, indices<>, N> {};
175 template<
int I0,
class F,
int... I>
176 constexpr std::array<decltype(std::declval<F>()(std::declval<int>())),
sizeof...(I)>
177 do_make(F f, indices<I...>)
179 return std::array<decltype(std::declval<F>()(std::declval<int>())),
180 sizeof...(I)>{{ f(I0 + I)... }};
183 template<
int N,
int I0 = 0,
class F>
184 constexpr std::array<decltype(std::declval<F>()(std::declval<int>())), N>
186 return do_make<I0>(f,
typename make_indices<N>::type());
211 template <
class T,
unsigned int D>
218 typedef T value_type;
221 inline T & operator()(
unsigned int i,
unsigned int j)
222 {
return fArray[offset(i, j)]; }
224 inline T
const & operator()(
unsigned int i,
unsigned int j)
const
225 {
return fArray[offset(i, j)]; }
227 inline T& operator[](
unsigned int i) {
228 return fArray[off(i)];
231 inline T
const & operator[](
unsigned int i)
const {
232 return fArray[off(i)];
235 inline T apply(
unsigned int i)
const {
236 return fArray[off(i)];
239 inline T* Array() {
return fArray; }
241 inline const T* Array()
const {
return fArray; }
247 inline MatRepSym<T, D>& operator=(
const R&) {
249 Cannot_assign_general_to_symmetric_matrix_representation);
252 inline MatRepSym<T, D>& operator=(
const MatRepSym& rhs) {
253 for(
unsigned int i=0; i<kSize; ++i) fArray[i] = rhs.Array()[i];
261 inline MatRepSym<T, D>& operator+=(
const R&) {
263 Cannot_add_general_to_symmetric_matrix_representation);
266 inline MatRepSym<T, D>& operator+=(
const MatRepSym& rhs) {
267 for(
unsigned int i=0; i<kSize; ++i) fArray[i] += rhs.Array()[i];
275 inline MatRepSym<T, D>& operator-=(
const R&) {
277 Cannot_substract_general_to_symmetric_matrix_representation);
280 inline MatRepSym<T, D>& operator-=(
const MatRepSym& rhs) {
281 for(
unsigned int i=0; i<kSize; ++i) fArray[i] -= rhs.Array()[i];
285 inline bool operator==(
const R& rhs)
const {
287 for(
unsigned int i=0; i<D*D; ++i) {
288 rc = rc && (operator[](i) == rhs[i]);
302 static constexpr
int off0(
int i) {
return i==0 ? 0 : off0(i-1)+i;}
303 static constexpr
int off2(
int i,
int j) {
return j<i ? off0(i)+j : off0(j)+i; }
304 static constexpr
int off1(
int i) {
return off2(i/D, i%D);}
306 static int off(
int i) {
307 static constexpr
auto v = rowOffsetsUtils::make<D*D>(off1);
311 static inline constexpr
unsigned int
312 offset(
unsigned int i,
unsigned int j)
330 #endif // MATH_MATRIXREPRESENTATIONSSTATIC_H