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
5153template <size_t _Order, typename _T=double > class Fixed1D
5254{
5355protected:
54- _T mCoef [ _Order+1 ] ;
56+ std::array<_T, _Order+1 > mCoef ;
5557public:
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 /* !
0 commit comments