Skip to content

Commit f4b0a71

Browse files
authored
Make fixed polys more user friendly (mdaus#788)
* Make fixed polys more user friendly * Use empt initializer list * Use empty initializers
1 parent 036b17d commit f4b0a71

File tree

2 files changed

+64
-8
lines changed

2 files changed

+64
-8
lines changed

modules/c++/math.poly/include/math/poly/Fixed1D.h

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#ifndef __MATH_POLY_FIXED_1D_H__
2424
#define __MATH_POLY_FIXED_1D_H__
2525

26+
#include <array>
27+
2628
#include <import/except.h>
2729
#include <import/sys.h>
2830
#include <math/poly/OneD.h>
@@ -51,7 +53,7 @@ namespace poly
5153
template <size_t _Order, typename _T=double> class Fixed1D
5254
{
5355
protected:
54-
_T mCoef[_Order+1];
56+
std::array<_T, _Order+1> mCoef;
5557
public:
5658

5759
/*!
@@ -63,7 +65,7 @@ template <size_t _Order, typename _T=double> class Fixed1D
6365
// Initialize coefficents;
6466
for (size_t i = 0; i < _Order+1; i++)
6567
{
66-
mCoef[i] = 0;
68+
mCoef[i] = _T{};
6769
}
6870
}
6971

@@ -81,6 +83,41 @@ template <size_t _Order, typename _T=double> class Fixed1D
8183
}
8284
}
8385

86+
/*!
87+
* Construct from C array
88+
*/
89+
Fixed1D(const _T* coeffs, const size_t nCoeff)
90+
{
91+
size_t sizeC = std::min<size_t>(nCoeff, _Order);
92+
for (size_t i = 0; i <= sizeC; i++)
93+
{
94+
mCoef[i] = coeffs[i];
95+
}
96+
}
97+
98+
/*!
99+
* Construct from std::array
100+
*/
101+
template<size_t O> Fixed1D(const std::array<_T, O>& coeffs)
102+
{
103+
size_t sizeC = std::min<size_t>(O, _Order);
104+
for (size_t i = 0; i <= sizeC; i++)
105+
{
106+
mCoef[i] = coeffs[i];
107+
}
108+
}
109+
110+
/*!
111+
* Construct from std::vector
112+
*/
113+
Fixed1D(const std::vector<_T>& coeffs)
114+
{
115+
size_t sizeC = std::min<size_t>(coeffs.size()-1, _Order);
116+
for (size_t i = 0; i <= sizeC; i++)
117+
{
118+
mCoef[i] = coeffs[i];
119+
}
120+
}
84121
/*!
85122
* Unlike the non-fixed size poly, this constructor
86123
* will truncate higher orders. This allows us to do something like
@@ -138,7 +175,7 @@ template <size_t _Order, typename _T=double> class Fixed1D
138175
*/
139176
_T operator() (double at) const
140177
{
141-
double rv(0);
178+
_T rv{};
142179
double atPower = 1;
143180

144181
for (size_t i = 0; i <= _Order; i++)
@@ -155,7 +192,7 @@ template <size_t _Order, typename _T=double> class Fixed1D
155192
*/
156193
_T integrate(double start, double end) const
157194
{
158-
_T rv(0);
195+
_T rv{};
159196
double div;
160197
double newCoef;
161198
double endAtPower = end;
@@ -169,7 +206,6 @@ template <size_t _Order, typename _T=double> class Fixed1D
169206
rv -= newCoef * startAtPower;
170207
endAtPower *= end;
171208
startAtPower *= start;
172-
173209
}
174210
return rv;
175211
}
@@ -215,6 +251,15 @@ template <size_t _Order, typename _T=double> class Fixed1D
215251
return mCoef[i];
216252

217253
}
254+
inline const std::array<_T, _Order+1>& coeffs() const
255+
{
256+
return mCoef;
257+
}
258+
259+
inline std::array<_T, _Order+1>& coeffs()
260+
{
261+
return mCoef;
262+
}
218263

219264

220265
/*!

modules/c++/math.poly/include/math/poly/Fixed2D.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#ifndef __MATH_POLY_FIXED_2D_H__
2424
#define __MATH_POLY_FIXED_2D_H__
2525

26+
#include <array>
2627
#include <math/poly/Fixed1D.h>
2728
#include <math/poly/TwoD.h>
2829
#include <math/poly/Utils.h>
@@ -40,7 +41,7 @@ namespace poly
4041
template<size_t _OrderX, size_t _OrderY, typename _T=double> class Fixed2D
4142
{
4243
protected:
43-
Fixed1D<_OrderY, _T> mCoef[_OrderX+1];
44+
std::array<Fixed1D<_OrderY, _T>, _OrderX+1> mCoef;
4445
public:
4546
Fixed2D() {}
4647

@@ -94,9 +95,19 @@ template<size_t _OrderX, size_t _OrderY, typename _T=double> class Fixed2D
9495
size_t orderX() const { return _OrderX; }
9596
size_t orderY() const { return _OrderY; }
9697

98+
inline const std::array<Fixed1D<_OrderY, _T>, _OrderX+1>& coeffs() const
99+
{
100+
return mCoef;
101+
}
102+
103+
inline std::array<Fixed1D<_OrderY, _T>, _OrderX+1>& coeffs()
104+
{
105+
return mCoef;
106+
}
107+
97108
inline _T operator()(double atX, double atY) const
98109
{
99-
_T rv(0);
110+
_T rv{};
100111
double atXPower(1);
101112

102113
for (size_t i = 0; i <= _OrderX; i++)
@@ -109,7 +120,7 @@ template<size_t _OrderX, size_t _OrderY, typename _T=double> class Fixed2D
109120
}
110121
_T integrate(double startX, double endX, double startY, double endY) const
111122
{
112-
_T rv(0);
123+
_T rv{};
113124
double div(0);
114125
double endAtPower = endX;
115126
double startAtPower = startX;

0 commit comments

Comments
 (0)