gps_pvt 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/CHANGELOG.md +5 -0
  4. data/CODE_OF_CONDUCT.md +84 -0
  5. data/Gemfile +10 -0
  6. data/README.md +86 -0
  7. data/Rakefile +86 -0
  8. data/bin/console +15 -0
  9. data/bin/setup +8 -0
  10. data/ext/gps_pvt/Coordinate/Coordinate_wrap.cxx +6613 -0
  11. data/ext/gps_pvt/GPS/GPS_wrap.cxx +16019 -0
  12. data/ext/gps_pvt/SylphideMath/SylphideMath_wrap.cxx +21050 -0
  13. data/ext/gps_pvt/extconf.rb +70 -0
  14. data/ext/ninja-scan-light/tool/navigation/EGM.h +2971 -0
  15. data/ext/ninja-scan-light/tool/navigation/GPS.h +2432 -0
  16. data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +479 -0
  17. data/ext/ninja-scan-light/tool/navigation/GPS_Solver_Base.h +1081 -0
  18. data/ext/ninja-scan-light/tool/navigation/GPS_Solver_MultiFrequency.h +199 -0
  19. data/ext/ninja-scan-light/tool/navigation/GPS_Solver_RAIM.h +210 -0
  20. data/ext/ninja-scan-light/tool/navigation/MagneticField.h +928 -0
  21. data/ext/ninja-scan-light/tool/navigation/NTCM.h +211 -0
  22. data/ext/ninja-scan-light/tool/navigation/RINEX.h +1781 -0
  23. data/ext/ninja-scan-light/tool/navigation/WGS84.h +186 -0
  24. data/ext/ninja-scan-light/tool/navigation/coordinate.h +406 -0
  25. data/ext/ninja-scan-light/tool/param/bit_array.h +145 -0
  26. data/ext/ninja-scan-light/tool/param/complex.h +558 -0
  27. data/ext/ninja-scan-light/tool/param/matrix.h +4049 -0
  28. data/ext/ninja-scan-light/tool/param/matrix_fixed.h +665 -0
  29. data/ext/ninja-scan-light/tool/param/matrix_special.h +562 -0
  30. data/ext/ninja-scan-light/tool/param/quaternion.h +765 -0
  31. data/ext/ninja-scan-light/tool/param/vector3.h +651 -0
  32. data/ext/ninja-scan-light/tool/swig/Coordinate.i +177 -0
  33. data/ext/ninja-scan-light/tool/swig/GPS.i +1102 -0
  34. data/ext/ninja-scan-light/tool/swig/SylphideMath.i +1234 -0
  35. data/ext/ninja-scan-light/tool/swig/extconf.rb +5 -0
  36. data/ext/ninja-scan-light/tool/swig/makefile +53 -0
  37. data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +417 -0
  38. data/ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb +489 -0
  39. data/gps_pvt.gemspec +57 -0
  40. data/lib/gps_pvt/receiver.rb +375 -0
  41. data/lib/gps_pvt/ubx.rb +148 -0
  42. data/lib/gps_pvt/version.rb +5 -0
  43. data/lib/gps_pvt.rb +9 -0
  44. data/sig/gps_pvt.rbs +4 -0
  45. metadata +117 -0
@@ -0,0 +1,665 @@
1
+ /*
2
+ * Copyright (c) 2019, M.Naruoka (fenrir)
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without modification,
6
+ * are permitted provided that the following conditions are met:
7
+ *
8
+ * - Redistributions of source code must retain the above copyright notice,
9
+ * this list of conditions and the following disclaimer.
10
+ * - Redistributions in binary form must reproduce the above copyright notice,
11
+ * this list of conditions and the following disclaimer in the documentation
12
+ * and/or other materials provided with the distribution.
13
+ * - Neither the name of the naruoka.org nor the names of its contributors
14
+ * may be used to endorse or promote products derived from this software
15
+ * without specific prior written permission.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
21
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
22
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ *
30
+ */
31
+
32
+ #ifndef __MATRIX_FIXED_H__
33
+ #define __MATRIX_FIXED_H__
34
+
35
+ /** @file
36
+ * @brief extension of Portable matrix library to add fixed size matrix
37
+ *
38
+ * This is hand-made fixed size matrix library whose features are
39
+ * 1) to use template for generic primitive type
40
+ * including not only double for general purpose,
41
+ * but also int used with fixed float for embedded environment.
42
+ * 2) Predetermined the buffer size, which implies running without heap memory.
43
+ * 3) to use views for transpose and partial matrices
44
+ * to reduce copies.
45
+ * 4) to use expression template technique
46
+ * for matrix multiplying, adding, and subtracting
47
+ * to eliminate temporary objects.
48
+ *
49
+ * Be careful, being different from the original (flexible) matrix,
50
+ * this fixed size matrix always utilizes deep copy.
51
+ */
52
+
53
+ #include "param/matrix.h"
54
+
55
+ #if (__cplusplus < 201103L) && !defined(noexcept)
56
+ #define noexcept throw()
57
+ #endif
58
+ #if defined(DEBUG) && !defined(throws_when_debug)
59
+ #define throws_when_debug
60
+ #else
61
+ #define throws_when_debug noexcept
62
+ #endif
63
+
64
+ template <class T, int nR, int nC = nR>
65
+ class Array2D_Fixed : public Array2D<T, Array2D_Fixed<T, nR, nC> > {
66
+ public:
67
+ typedef Array2D_Fixed<T, nR, nC> self_t;
68
+ typedef Array2D<T, self_t> super_t;
69
+ static const bool clonable = false;
70
+
71
+ template <class T2>
72
+ struct cast_t {
73
+ typedef Array2D_Fixed<T2, nR, nC> res_t;
74
+ };
75
+
76
+ using super_t::rows;
77
+ using super_t::columns;
78
+
79
+ template <class T2, class Array2D_Type2, class ViewType2>
80
+ friend class Matrix; // for protected copy(), which can only generate shallow copy
81
+
82
+ protected:
83
+ T (* const values)[nR][nC]; ///< array for values
84
+
85
+ void check_size() const {
86
+ if((nR < rows()) || (nC < columns())){
87
+ throw std::runtime_error("larger rows or columns");
88
+ }
89
+ }
90
+
91
+ template <class T2>
92
+ void fill_values(const Array2D_Frozen<T2> &array){
93
+ if(!values){
94
+ throw std::runtime_error("No buffer");
95
+ }
96
+ const unsigned int i_end(array.rows()), j_end(array.columns());
97
+ for(unsigned int i(0); i < i_end; ++i){
98
+ for(unsigned int j(0); j < j_end; ++j){
99
+ (*values)[i][j] = array(i, j);
100
+ }
101
+ }
102
+ }
103
+
104
+ public:
105
+ Array2D_Fixed(const unsigned int &rows = 0, const unsigned int &columns = 0)
106
+ : super_t(rows, columns), values(NULL) {
107
+ check_size();
108
+ }
109
+
110
+ Array2D_Fixed(
111
+ T (&buf)[nR][nC], const unsigned int &rows = 0, const unsigned int &columns = 0)
112
+ : super_t(rows, columns), values(&buf) {
113
+ check_size();
114
+ }
115
+
116
+ /**
117
+ * Copy constructor, which performs shallow copy.
118
+ *
119
+ * @param array another one
120
+ */
121
+ Array2D_Fixed(const self_t &src) noexcept
122
+ : super_t(src.rows(), src.columns()), values(src.values){
123
+ }
124
+
125
+ /**
126
+ * Destructor
127
+ */
128
+ ~Array2D_Fixed(){}
129
+
130
+ /**
131
+ * Assigners, which performs deep copy
132
+ * This is different from Array2D_Dense::operator=(const self_t &) doing shallow copy
133
+ */
134
+ self_t &operator=(const self_t &rhs) noexcept {
135
+ if(this != &rhs){
136
+ super_t::m_rows = rhs.m_rows;
137
+ super_t::m_columns = rhs.m_columns;
138
+ if(rhs.values){fill_values(rhs);}
139
+ }
140
+ return *this;
141
+ }
142
+
143
+ /**
144
+ * Assigners for different type, which performs deep copy
145
+ * This is same as Array2D_Dense::operator=(const self_t &)
146
+ */
147
+ template <class T2>
148
+ self_t &operator=(const Array2D_Frozen<T2> &array){
149
+ super_t::m_rows = array.rows();
150
+ super_t::m_columns = array.columns();
151
+ check_size();
152
+ fill_values(array);
153
+ return *this;
154
+ }
155
+
156
+ protected:
157
+ inline const T &get(
158
+ const unsigned int &row,
159
+ const unsigned int &column) const throws_when_debug {
160
+ #if defined(DEBUG)
161
+ super_t::check_index(row, column);
162
+ #endif
163
+ return (*values)[row][column];
164
+ }
165
+
166
+ public:
167
+ /**
168
+ * Accessor for element
169
+ *
170
+ * @param row Row index
171
+ * @param column Column Index
172
+ * @return (T) Element
173
+ * @throw std::out_of_range When the indices are out of range
174
+ */
175
+ T operator()(
176
+ const unsigned int &row,
177
+ const unsigned int &column) const throws_when_debug {
178
+ return get(row, column);
179
+ }
180
+ T &operator()(
181
+ const unsigned int &row,
182
+ const unsigned int &column) throws_when_debug {
183
+ return const_cast<T &>(
184
+ const_cast<const self_t *>(this)->get(row, column));
185
+ }
186
+
187
+ protected:
188
+ template <class T2, bool do_memory_op = std::numeric_limits<T2>::is_specialized>
189
+ struct setup_t {
190
+ static void copy(T2 *dest, const T2 *src, const unsigned int &length){
191
+ for(unsigned int i(0); i < length; ++i){
192
+ dest[i] = src[i];
193
+ }
194
+ }
195
+ static void clear(T2 *target){
196
+ for(unsigned int i(0); i < nR * nC; ++i){
197
+ target[i] = T2();
198
+ }
199
+ }
200
+ };
201
+ template <class T2>
202
+ struct setup_t<T2, true> {
203
+ static void copy(T2 *dest, const T2 *src, const unsigned int &length){
204
+ std::memcpy(dest, src, sizeof(T2) * length);
205
+ }
206
+ static void clear(T2 *target){
207
+ std::memset(target, 0, sizeof(T2) * nR * nC);
208
+ }
209
+ };
210
+
211
+ public:
212
+ void clear() noexcept {
213
+ setup_t<T>::clear((T *)values);
214
+ }
215
+
216
+ protected:
217
+ self_t copy(const bool &is_deep = false) const {
218
+ return self_t(*this); ///< is_deep flag will be ignored, and return shallow copy
219
+ }
220
+
221
+ public:
222
+ struct buf_t {
223
+ T buf[nR][nC]; ///< fixed size buffer
224
+ buf_t() noexcept {}
225
+ buf_t(
226
+ const unsigned int &rows, const unsigned int &columns,
227
+ const T *serialized) noexcept {
228
+ if(serialized){
229
+ for(unsigned int i(0), idx(0); i < rows; ++i, idx += columns){
230
+ setup_t<T>::copy(buf[i], &serialized[idx], columns);
231
+ }
232
+ }else{
233
+ setup_t<T>::clear((T *)&buf);
234
+ }
235
+ }
236
+ };
237
+ };
238
+
239
+ template <class T, int nR, int nC = nR>
240
+ class Matrix_Fixed
241
+ : protected Array2D_Fixed<T, nR, nC>::buf_t,
242
+ public Matrix<T, Array2D_Fixed<T, nR, nC> > {
243
+ public:
244
+ typedef typename Array2D_Fixed<T, nR, nC>::buf_t buf_t;
245
+ typedef Matrix<T, Array2D_Fixed<T, nR, nC> > super_t;
246
+
247
+ #if defined(__GNUC__) && (__GNUC__ < 5)
248
+ typedef typename super_t::storage_t storage_t;
249
+ #elif defined(_MSC_VER)
250
+ typedef typename super_t::storage_t storage_t; // To fix VC2010(C2514) in constructor
251
+ using super_t::operator(); // To fix VC2010(C2106) of X(r, c) = something
252
+ #else
253
+ using typename super_t::storage_t;
254
+ #endif
255
+
256
+ typedef Matrix_Fixed<T, nR, nC> self_t;
257
+
258
+ protected:
259
+ Matrix_Fixed(const storage_t &storage) noexcept
260
+ : buf_t(), super_t(storage_t(buf_t::buf) = storage) {}
261
+
262
+ template <class T2, class Array2D_Type2, class ViewType2>
263
+ friend class Matrix;
264
+
265
+ public:
266
+ /**
267
+ * Constructor without customization.
268
+ * The elements will be cleared with T(0).
269
+ *
270
+ */
271
+ Matrix_Fixed() noexcept
272
+ : buf_t(), super_t(storage_t(buf_t::buf)){}
273
+
274
+ /**
275
+ * Constructor with specified row and column numbers, and values.
276
+ * The size will be compared with the predefined numbers.
277
+ * If the size is larger than buffer, then error will be thrown.
278
+ * The elements will be cleared with T(0) if serialized is NULL (default).
279
+ *
280
+ * @param rows Row number
281
+ * @param columns Column number
282
+ * @param serialized Initial values of elements
283
+ */
284
+ Matrix_Fixed(
285
+ const unsigned int &rows, const unsigned int &columns,
286
+ const T *serialized = NULL)
287
+ : buf_t(rows, columns, serialized),
288
+ super_t(storage_t(buf_t::buf, rows, columns)) {}
289
+
290
+ /**
291
+ * Copy constructor generating deep copy.
292
+ */
293
+ Matrix_Fixed(const self_t &matrix) noexcept
294
+ : buf_t(), super_t(storage_t(buf_t::buf) = matrix.storage) {}
295
+
296
+ template <class T2, class Array2D_Type2, class ViewType2>
297
+ Matrix_Fixed(const Matrix_Frozen<T2, Array2D_Type2, ViewType2> &matrix)
298
+ : buf_t(), super_t(storage_t(buf_t::buf, matrix.rows(), matrix.columns())){
299
+ super_t::replace(matrix);
300
+ }
301
+ /**
302
+ * Destructor
303
+ */
304
+ virtual ~Matrix_Fixed(){}
305
+
306
+ /**
307
+ * Assigner performing deep copy by Array2D_Fixed::operator=(const Array2D_Fixed &)
308
+ */
309
+ self_t &operator=(const self_t &another){
310
+ super_t::operator=(another); // frozen_t::operator=(const frozen_t &) is exactly called.
311
+ return *this;
312
+ }
313
+
314
+ /**
315
+ * Assigner performing deep copy by Array2D_Fixed::operator=(const Array2D_Frozen &)
316
+ */
317
+ template <class T2, class Array2D_Type2>
318
+ self_t &operator=(const Matrix<T2, Array2D_Type2> &matrix){
319
+ super_t::operator=(matrix);
320
+ /* frozen_t::operator=(const frozen_t &) or frozen_t::operator=(const another_frozen_t &)
321
+ * is conditionally called.
322
+ */
323
+ return *this;
324
+ }
325
+
326
+ struct wrapped_t {
327
+ self_t mat;
328
+ wrapped_t(const self_t &mat_) noexcept
329
+ : mat(mat_) {}
330
+ };
331
+ };
332
+
333
+ template <class T, int nR, int nC>
334
+ struct MatrixBuilder<Matrix_Fixed<T, nR, nC> >
335
+ : public MatrixBuilder<Matrix<T, Array2D_Fixed<T, nR, nC> > > {};
336
+ // MatrixBuilder<typename Matrix_Fixed<T, nR, nC>::super_t> invokes "invalid use of incomplete type" error
337
+
338
+ template <
339
+ template <class, class, class> class MatrixT,
340
+ class T, class T2, int nR, int nC, class ViewType>
341
+ struct MatrixBuilder_Dependency<MatrixT<T, Array2D_Fixed<T2, nR, nC>, ViewType> > {
342
+
343
+ static const int row_buffer = (MatrixViewProperty<ViewType>::transposed ? nC : nR);
344
+ static const int column_buffer = (MatrixViewProperty<ViewType>::transposed ? nR : nC);
345
+
346
+ typedef Matrix_Fixed<T, row_buffer, column_buffer> assignable_t;
347
+
348
+ template <class T3>
349
+ struct cast_t {
350
+ typedef Matrix_Fixed<T3, row_buffer, column_buffer> assignable_t;
351
+ };
352
+
353
+ template <int nR_add = 0, int nC_add = 0, int nR_multiply = 1, int nC_multiply = 1>
354
+ struct resize_t {
355
+ typedef Matrix_Fixed<T,
356
+ row_buffer * nR_multiply + nR_add,
357
+ column_buffer * nC_multiply + nC_add> assignable_t;
358
+ };
359
+ };
360
+
361
+ template <
362
+ class T, class T_op,
363
+ class T2, class T3, class T4, class T5,
364
+ class ViewType,
365
+ int nR_L, int nC_L, class ViewType_L,
366
+ int nR_R, int nC_R, class ViewType_R>
367
+ struct MatrixBuilder_Dependency<
368
+ Matrix_Frozen<
369
+ T,
370
+ Array2D_Operator<T_op, Array2D_Operator_Multiply_by_Matrix<
371
+ Matrix_Frozen<T2, Array2D_Fixed<T3, nR_L, nC_L>, ViewType_L>,
372
+ Matrix_Frozen<T4, Array2D_Fixed<T5, nR_R, nC_R>, ViewType_R> > >,
373
+ ViewType> >
374
+ : public MatrixBuilder_Dependency<
375
+ Matrix_Frozen<
376
+ T,
377
+ Array2D_Fixed<
378
+ T,
379
+ (MatrixViewProperty<ViewType_L>::transposed ? nC_L : nR_L),
380
+ (MatrixViewProperty<ViewType_R>::transposed ? nR_R : nC_R)>,
381
+ ViewType> > {};
382
+
383
+ // For optimization of local temporary matrix
384
+ template <
385
+ template <class, class, class> class MatrixT,
386
+ class T, class Array2D_Type, class ViewType>
387
+ struct MatrixBuilder<MatrixT<T, Array2D_Type, ViewType> >
388
+ : public MatrixBuilderBase<MatrixT<T, Array2D_Type, ViewType> > {
389
+
390
+ template <int nR_add = 0, int nC_add = 0, int nR_multiply = 1, int nC_multiply = 1>
391
+ struct resize_t
392
+ : public MatrixBuilderBase<MatrixT<T, Array2D_Type, ViewType> >
393
+ ::template resize_t<nR_add, nC_add, nR_multiply, nC_multiply> {};
394
+
395
+ template <int nR_add, int nC_add>
396
+ struct resize_t<nR_add, nC_add, 0, 0> {
397
+ typedef Matrix_Fixed<T, nR_add, nC_add> assignable_t;
398
+ };
399
+ };
400
+
401
+ template <
402
+ class LHS_T, class RHS_T,
403
+ bool lhs_buffered = false, bool rhs_buffered = false>
404
+ struct Matrix_Fixed_BinaryOperator_buffer;
405
+
406
+ template <class LHS_T, class RHS_T>
407
+ struct Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, true, false> {
408
+ LHS_T lhs;
409
+ const RHS_T &rhs;
410
+ Matrix_Fixed_BinaryOperator_buffer(const LHS_T &lhs_, const RHS_T &rhs_) noexcept
411
+ : lhs(lhs_), rhs(rhs_) {}
412
+ };
413
+ template <class LHS_T, class RHS_T>
414
+ struct Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, false, true> {
415
+ const LHS_T &lhs;
416
+ RHS_T rhs;
417
+ Matrix_Fixed_BinaryOperator_buffer(const LHS_T &lhs_, const RHS_T &rhs_) noexcept
418
+ : lhs(lhs_), rhs(rhs_) {}
419
+ };
420
+ template <class LHS_T, class RHS_T>
421
+ struct Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, true, true> {
422
+ LHS_T lhs;
423
+ RHS_T rhs;
424
+ Matrix_Fixed_BinaryOperator_buffer(const LHS_T &lhs_, const RHS_T &rhs_) noexcept
425
+ : lhs(lhs_), rhs(rhs_) {}
426
+ };
427
+
428
+ template <
429
+ class Result_FrozenT, class LHS_T, class RHS_T,
430
+ bool lhs_buffered = false>
431
+ struct Matrix_Fixed_multipled_by_Scalar
432
+ : protected Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, lhs_buffered>,
433
+ public Result_FrozenT {
434
+ typedef Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, lhs_buffered> buf_t;
435
+ Matrix_Fixed_multipled_by_Scalar(const Matrix_Fixed_multipled_by_Scalar &another) noexcept
436
+ : buf_t(another.buf_t::lhs, another.buf_t::rhs),
437
+ Result_FrozenT(typename Result_FrozenT::storage_t(
438
+ buf_t::lhs.rows(), buf_t::lhs.columns(),
439
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
440
+ Matrix_Fixed_multipled_by_Scalar(const LHS_T &lhs, const RHS_T &rhs) noexcept
441
+ : buf_t(lhs, rhs),
442
+ Result_FrozenT(typename Result_FrozenT::storage_t(
443
+ lhs.rows(), lhs.columns(),
444
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
445
+ template <class, class, class, bool> friend struct Matrix_Fixed_multipled_by_Scalar;
446
+ template <class Result_FrozenT2>
447
+ Matrix_Fixed_multipled_by_Scalar(
448
+ const Matrix_Fixed_multipled_by_Scalar<
449
+ Result_FrozenT2, LHS_T, RHS_T, lhs_buffered> &another) noexcept
450
+ : buf_t(another), // use default copy constructor
451
+ Result_FrozenT(typename Result_FrozenT::storage_t(
452
+ buf_t::lhs.rows(), buf_t::lhs.columns(),
453
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
454
+ };
455
+
456
+ template <class T, int nR_L, int nC_L, class RHS_T>
457
+ struct Matrix_multiplied_by_Scalar<Matrix_Fixed<T, nR_L, nC_L>, RHS_T> {
458
+ typedef Matrix_Fixed<T, nR_L, nC_L> lhs_t;
459
+ typedef RHS_T rhs_t;
460
+ typedef Array2D_Operator_Multiply_by_Scalar<
461
+ Matrix_Frozen<T, Array2D_Fixed<T, nR_L, nC_L> >, rhs_t> impl_t;
462
+ typedef Matrix_Frozen<T, Array2D_Operator<T, impl_t> > frozen_t;
463
+ typedef Matrix_Fixed_multipled_by_Scalar<frozen_t, lhs_t, rhs_t, true> mat_t;
464
+ static mat_t generate(const lhs_t &mat, const rhs_t &scalar) {
465
+ return mat_t(mat, scalar);
466
+ }
467
+ };
468
+
469
+ template <
470
+ class Result_FrozenT, class LHS_T, class RHS_T,
471
+ bool lhs_buffered = false, bool rhs_buffered = false>
472
+ struct Matrix_Fixed_multipled_by_Matrix
473
+ : protected Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, lhs_buffered, rhs_buffered>,
474
+ public Result_FrozenT {
475
+ typedef Matrix_Fixed_BinaryOperator_buffer<LHS_T, RHS_T, lhs_buffered, rhs_buffered> buf_t;
476
+ Matrix_Fixed_multipled_by_Matrix(const Matrix_Fixed_multipled_by_Matrix &another) noexcept
477
+ : buf_t(another.buf_t::lhs, another.buf_t::rhs),
478
+ Result_FrozenT(typename Result_FrozenT::storage_t(
479
+ buf_t::lhs.rows(), buf_t::rhs.columns(),
480
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
481
+ Matrix_Fixed_multipled_by_Matrix(const LHS_T &lhs, const RHS_T &rhs) noexcept
482
+ : buf_t(lhs, rhs),
483
+ Result_FrozenT(typename Result_FrozenT::storage_t(
484
+ lhs.rows(), rhs.columns(),
485
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
486
+ template <class, class, class, bool, bool> friend struct Matrix_Fixed_multipled_by_Matrix;
487
+ template <class Result_FrozenT2>
488
+ Matrix_Fixed_multipled_by_Matrix(
489
+ const Matrix_Fixed_multipled_by_Matrix<
490
+ Result_FrozenT2, LHS_T, RHS_T, lhs_buffered, rhs_buffered> &another) noexcept
491
+ : buf_t(another), // use default copy constructor
492
+ Result_FrozenT(typename Result_FrozenT::storage_t(
493
+ buf_t::lhs.rows(), buf_t::rhs.columns(),
494
+ typename Result_FrozenT::storage_t::op_t(buf_t::lhs, buf_t::rhs))) {}
495
+
496
+ /* for optimization of scalar multiplication of (M * S) * M, M * (M * S), (M * S) * (M * S) */
497
+ template <class T>
498
+ struct Multiply_Matrix_by_Scalar {
499
+ typedef Matrix_Fixed_multipled_by_Matrix<
500
+ Result_FrozenT, LHS_T, RHS_T, lhs_buffered, rhs_buffered> lhs_t;
501
+ typedef T rhs_t;
502
+ typedef Array2D_Operator_Multiply_by_Scalar<Result_FrozenT, rhs_t> impl_t;
503
+ typedef Matrix_Frozen<T, Array2D_Operator<T, impl_t> > frozen_t;
504
+ typedef Matrix_Fixed_multipled_by_Scalar<frozen_t, lhs_t, rhs_t, lhs_buffered || rhs_buffered> mat_t;
505
+ static mat_t generate(const lhs_t &mat, const rhs_t &scalar) {
506
+ return mat_t(mat, scalar);
507
+ }
508
+ };
509
+ };
510
+
511
+ template <
512
+ class T_L, class Array2D_Type, class ViewType,
513
+ class T_R, int nR_R, int nC_R>
514
+ struct Array2D_Operator_Multiply_by_Matrix<
515
+ Matrix_Frozen<T_L, Array2D_Type, ViewType>,
516
+ Matrix_Fixed<T_R, nR_R, nC_R> > {
517
+ typedef Matrix_Frozen<T_L, Array2D_Type, ViewType> lhs_t;
518
+ typedef Matrix_Fixed<T_R, nR_R, nC_R> rhs_t;
519
+ typedef Array2D_Operator_Multiply_by_Matrix<lhs_t, typename rhs_t::frozen_t> op_t;
520
+ typedef Matrix_Frozen<T_L, Array2D_Operator<T_L, op_t> > frozen_t;
521
+ typedef Matrix_Fixed_multipled_by_Matrix<frozen_t, lhs_t, rhs_t, false, true> mat_t;
522
+ static mat_t generate(const lhs_t &lhs, const rhs_t &rhs) noexcept {
523
+ return mat_t(lhs, rhs);
524
+ }
525
+ };
526
+
527
+ template <
528
+ class T_L, int nR_L, int nC_L,
529
+ class T_R, class Array2D_Type, class ViewType>
530
+ struct Array2D_Operator_Multiply_by_Matrix<
531
+ Matrix_Fixed<T_L, nR_L, nC_L>,
532
+ Matrix_Frozen<T_R, Array2D_Type, ViewType> > {
533
+ typedef Matrix_Fixed<T_L, nR_L, nC_L> lhs_t;
534
+ typedef Matrix_Frozen<T_R, Array2D_Type, ViewType> rhs_t;
535
+ typedef Array2D_Operator_Multiply_by_Matrix<typename lhs_t::frozen_t, rhs_t> op_t;
536
+ typedef Matrix_Frozen<T_L, Array2D_Operator<T_L, op_t> > frozen_t;
537
+ typedef Matrix_Fixed_multipled_by_Matrix<frozen_t, lhs_t, rhs_t, true, false> mat_t;
538
+ static mat_t generate(const lhs_t &lhs, const rhs_t &rhs) noexcept {
539
+ return mat_t(lhs, rhs);
540
+ }
541
+ };
542
+
543
+ template <
544
+ class T_L, int nR_L, int nC_L,
545
+ class T_R, int nR_R, int nC_R>
546
+ struct Array2D_Operator_Multiply_by_Matrix<
547
+ Matrix_Fixed<T_L, nR_L, nC_L>,
548
+ Matrix_Fixed<T_R, nR_R, nC_R> > {
549
+ typedef Matrix_Fixed<T_L, nR_L, nC_L> lhs_t;
550
+ typedef Matrix_Fixed<T_R, nR_R, nC_R> rhs_t;
551
+ typedef Array2D_Operator_Multiply_by_Matrix<
552
+ typename lhs_t::frozen_t, typename rhs_t::frozen_t> op_t;
553
+ typedef Matrix_Frozen<T_L, Array2D_Operator<T_L, op_t> > frozen_t;
554
+ typedef Matrix_Fixed_multipled_by_Matrix<frozen_t, lhs_t, rhs_t, true, true> mat_t;
555
+ static mat_t generate(const lhs_t &lhs, const rhs_t &rhs) noexcept {
556
+ return mat_t(lhs, rhs);
557
+ }
558
+ };
559
+
560
+ template <
561
+ class T, int nR, int nC,
562
+ class Result_FrozenT = typename Matrix_Fixed<T, nR, nC>::frozen_t>
563
+ struct Matrix_Fixed_Wrapped
564
+ : protected Matrix_Fixed<T, nR, nC>::wrapped_t,
565
+ public Result_FrozenT {
566
+ typedef typename Matrix_Fixed<T, nR, nC>::wrapped_t buf_t;
567
+ Matrix_Fixed_Wrapped(const Matrix_Fixed<T, nR, nC> &mat) noexcept
568
+ : buf_t(mat),
569
+ Result_FrozenT(buf_t::mat) {}
570
+ Matrix_Fixed_Wrapped(const Matrix_Fixed_Wrapped<T, nR, nC, Result_FrozenT> &another) noexcept
571
+ : buf_t(another.buf_t::mat),
572
+ Result_FrozenT(buf_t::mat) {}
573
+ };
574
+
575
+ // { /* For matrix_special.h */
576
+ template <class MatrixT, template <class> class ViewType_Special>
577
+ struct MatrixBuilderSpecial;
578
+
579
+ template <
580
+ class T, int nR, int nC,
581
+ template <class> class ViewType_Special>
582
+ struct MatrixBuilderSpecial<Matrix_Fixed<T, nR, nC>, ViewType_Special>
583
+ : public MatrixBuilderSpecial<
584
+ typename Matrix_Fixed<T, nR, nC>::super_t, ViewType_Special> {
585
+ typedef Matrix_Fixed<T, nR, nC> fixed_t;
586
+ typedef Matrix_Fixed_Wrapped<T, nR, nC,
587
+ typename MatrixBuilderSpecial<
588
+ typename fixed_t::frozen_t, ViewType_Special>::special_t> special_t;
589
+ };
590
+
591
+ template <
592
+ class Result_FrozenT, class LHS_T, class RHS_T,
593
+ bool lhs_buffered, bool rhs_buffered,
594
+ template <class> class ViewType_Special>
595
+ struct MatrixBuilderSpecial<
596
+ Matrix_Fixed_multipled_by_Matrix<Result_FrozenT, LHS_T, RHS_T, lhs_buffered, rhs_buffered>,
597
+ ViewType_Special>
598
+ : public MatrixBuilderSpecial<Result_FrozenT, ViewType_Special> {
599
+ typedef Matrix_Fixed_multipled_by_Matrix<
600
+ typename MatrixBuilderSpecial<Result_FrozenT, ViewType_Special>::special_t,
601
+ LHS_T, RHS_T, lhs_buffered, rhs_buffered> special_t;
602
+ };
603
+
604
+ // { /* for operator/(special(Matrix_Fixed)) */
605
+ template <
606
+ class T_L, class Array2D_Type, class ViewType,
607
+ class T_R, int nR, int nC, class Result_FrozenT>
608
+ struct Array2D_Operator_Multiply_by_Matrix<
609
+ Matrix_Frozen<T_L, Array2D_Type, ViewType>,
610
+ Matrix_Fixed_Wrapped<T_R, nR, nC, Result_FrozenT> > {
611
+ typedef Matrix_Frozen<T_L, Array2D_Type, ViewType> lhs_t;
612
+ typedef Matrix_Fixed_Wrapped<T_R, nR, nC, Result_FrozenT> rhs_t;
613
+ typedef Array2D_Operator_Multiply_by_Matrix<lhs_t, Result_FrozenT> op_t;
614
+ typedef Matrix_Frozen<T_L, Array2D_Operator<T_L, op_t> > frozen_t;
615
+ typedef Matrix_Fixed_multipled_by_Matrix<frozen_t, lhs_t, rhs_t, false, true> mat_t;
616
+ static mat_t generate(const lhs_t &lhs, const rhs_t &rhs) noexcept {
617
+ return mat_t(lhs, rhs);
618
+ }
619
+ };
620
+ template <
621
+ class Result_FrozenT, class LHS_T, class RHS_T,
622
+ bool lhs_buffered, bool rhs_buffered>
623
+ struct MatrixBuilder<
624
+ Matrix_Fixed_multipled_by_Matrix<Result_FrozenT, LHS_T, RHS_T, lhs_buffered, rhs_buffered> > {
625
+ template <class ViewType>
626
+ struct view_replace_t {
627
+ typedef Matrix_Fixed_multipled_by_Matrix<
628
+ typename MatrixBuilder<Result_FrozenT>::template view_replace_t<ViewType>::replaced_t,
629
+ LHS_T, RHS_T, lhs_buffered, rhs_buffered> replaced_t;
630
+ };
631
+ };
632
+ // }
633
+
634
+ // for friend operator/(scalar, special(Matrix_Fixed))
635
+ template <class T, int nR, int nC, class Result_FrozenT, class RHS_T>
636
+ struct Matrix_multiplied_by_Scalar<Matrix_Fixed_Wrapped<T, nR, nC, Result_FrozenT>, RHS_T> {
637
+ typedef Matrix_Fixed_Wrapped<T, nR, nC, Result_FrozenT> lhs_t;
638
+ typedef RHS_T rhs_t;
639
+ typedef Array2D_Operator_Multiply_by_Scalar<Result_FrozenT, rhs_t> impl_t;
640
+ typedef Matrix_Frozen<T, Array2D_Operator<T, impl_t> > frozen_t;
641
+ typedef Matrix_Fixed_multipled_by_Scalar<frozen_t, lhs_t, rhs_t, true> mat_t;
642
+ static mat_t generate(const lhs_t &mat, const rhs_t &scalar) {
643
+ return mat_t(mat, scalar);
644
+ }
645
+ };
646
+
647
+ template <
648
+ class Result_FrozenT, class LHS_T, class RHS_T,
649
+ template <class> class ViewType_Special>
650
+ struct MatrixBuilderSpecial<
651
+ Matrix_Fixed_multipled_by_Scalar<Result_FrozenT, LHS_T, RHS_T, true>,
652
+ ViewType_Special>
653
+ : public MatrixBuilderSpecial<Result_FrozenT, ViewType_Special> {
654
+ typedef Matrix_Fixed_multipled_by_Scalar<
655
+ typename MatrixBuilderSpecial<Result_FrozenT, ViewType_Special>::special_t,
656
+ LHS_T, RHS_T, true> special_t;
657
+ };
658
+ // }
659
+
660
+ #undef throws_when_debug
661
+ #if (__cplusplus < 201103L) && defined(noexcept)
662
+ #undef noexcept
663
+ #endif
664
+
665
+ #endif /* __MATRIX_FIXED_H__ */