33#ifndef _GEOM_SL_MULTIPOLY_H_
34#define _GEOM_SL_MULTIPOLY_H_
46namespace Geom {
namespace SL {
58template <
size_t N,
typename CoeffT>
87 typename std::enable_if_t<(M > 0) && (M <
N)>* = 0)
109 template <
typename OrderT>
117 template <
typename OrderT>
120 return (*
this)(degree<OrderT>());
123 template <
typename OrderT>
126 return (*
this)(degree<OrderT>());
193 template <
typename T>
199 template <
typename T>
200 typename std::enable_if_t<(
N == 1), T>
201 operator() (T
const& x0)
const
203 std::array<T, N>
X = {{x0}};
207 template <
typename T>
208 typename std::enable_if_t<(
N == 2), T>
209 operator() (T
const& x0, T
const& x1)
const
211 std::array<T, N>
X = {{x0, x1}};
215 template <
typename T>
216 typename std::enable_if_t<(
N == 3), T>
217 operator() (T
const& x0, T
const& x1, T
const& x2)
const
219 std::array<T, N>
X = {{x0, x1, x2}};
241 typename std::enable_if_t<(M > 0) && (M <
N)>* = 0)
const
253 return ((*
this) ==
zero);
297 return !((*this) == q);
358 typename std::enable_if_t<(M > 0) && (M <
N),
MultiPoly> &
367 typename std::enable_if_t<(M > 0) && (M <
N),
MultiPoly> &
376 typename std::enable_if_t<(M > 0) && (M <
N),
MultiPoly> &
389 template<
size_t M,
typename C>
392 template<
typename charT,
size_t M,
typename C>
394 std::basic_ostream<charT> &
411template <
size_t N,
typename CoeffT>
423template <
size_t N,
typename CoeffT>
438template <
size_t N,
typename CoeffT>
442template <
size_t N,
typename CoeffT>
446template <
size_t N,
typename CoeffT>
450template <
size_t N,
typename CoeffT>
458template <
typename charT,
size_t N,
typename CoeffT>
460std::basic_ostream<charT> &
469template <
size_t N,
typename CoeffT>
474 MultiPoly<N, CoeffT> r(p);
483template <
size_t M,
size_t N,
typename CoeffT>
485typename std::enable_if_t<(M > 0) && (M <=
N), MultiPoly<N, CoeffT> >
494template <
size_t M,
size_t N,
typename CoeffT>
496typename std::enable_if_t<(
N > 0) && (M >
N), MultiPoly<M, CoeffT> >
505template <
size_t M,
size_t N,
typename CoeffT>
507typename std::enable_if_t<(M > 0) && (M <=
N), MultiPoly<N, CoeffT> >
516template <
size_t M,
size_t N,
typename CoeffT>
518typename std::enable_if_t<(
N > 0) && (M >
N), MultiPoly<M, CoeffT> >
528template <
size_t M,
size_t N,
typename CoeffT>
530typename std::enable_if_t<(M > 0) && (M <=
N), MultiPoly<N, CoeffT> >
539template <
size_t M,
size_t N,
typename CoeffT>
541typename std::enable_if_t<(
N > 0) && (M >
N), MultiPoly<M, CoeffT> >
554template <
size_t N,
typename CoeffT>
563template <
size_t N,
typename CoeffT>
572template <
size_t N,
typename CoeffT>
581template <
size_t N,
typename CoeffT>
590template <
size_t N,
typename CoeffT>
599template <
size_t N,
typename CoeffT>
609template <
size_t N,
typename CoeffT>
coeff_type const & leading_coefficient() const
poly_type const & get_poly() const
friend std::basic_ostream< charT > & operator<<(std::basic_ostream< charT > &os, const MultiPoly< M, C > &p)
bool operator==(MultiPoly const &q) const
poly_type::coeff_type const & coefficient(size_t const &i) const
coeff_type const & trailing_coefficient() const
MultiPoly & operator*=(poly_type const &p)
MultiPoly & operator=(coeff_type const &c)
MultiPoly & operator*=(CoeffT const &c)
MultiPoly & operator+=(MultiPoly const &p)
static const MultiPoly zero
MultiPoly operator-() const
poly_type::coeff_type const & operator[](size_t const &i) const
coeff_type & leading_coefficient()
MultiPoly & operator/=(CoeffT const &c)
coeff_type const & coefficient(multi_index_type const &I) const
MultiPoly & operator-=(poly_type const &p)
static const coeff_type one_coeff
mvpoly< N, CoeffT >::type poly_type
MultiPoly & operator<<=(multi_index_type const &I)
coeff_type const & operator()(multi_index_type const &I) const
mvpoly< M, CoeffT >::type const & select(multi_index_type const &I=multi_index_zero(N-M), typename std::enable_if_t<(M > 0) &&(M< N)> *=0) const
coeff_type & trailing_coefficient()
MultiPoly & operator+=(poly_type const &p)
MultiPoly(coeff_type c, multi_index_type const &I=multi_index_zero(N))
void coefficient(size_t const &i, typename poly_type::coeff_type const &c)
MultiPoly & operator-=(MultiPoly const &p)
MultiPoly & operator=(poly_type const &p)
MultiPoly & operator-=(CoeffT const &c)
bool operator!=(MultiPoly const &q) const
MultiPoly & operator*=(MultiPoly const &p)
multi_index_type degree() const
static const coeff_type zero_coeff
void coefficient(multi_index_type const &I, coeff_type const &c)
MultiPoly & operator+=(CoeffT const &c)
MultiPoly(MultiPoly< M, CoeffT > const &p, multi_index_type const &I=multi_index_zero(N-M), typename std::enable_if_t<(M > 0) &&(M< N)> *=0)
static const MultiPoly one
coeff_type const & coefficient(size_t i) const
std::enable_if_t<(M > 0) &&(M<=N), MultiPoly< N, CoeffT > > operator-(MultiPoly< N, CoeffT > const &p, MultiPoly< M, CoeffT > const &q)
std::enable_if_t<(M > 0) &&(M<=N), MultiPoly< N, CoeffT > > operator+(MultiPoly< N, CoeffT > const &p, MultiPoly< M, CoeffT > const &q)
std::valarray< size_t > multi_index_type
MultiPoly< N, CoeffT > operator/(MultiPoly< N, CoeffT > const &p, CoeffT const &c)
multi_index_type multi_index_zero(size_t N)
std::enable_if_t<(M > 0) &&(M<=N), MultiPoly< N, CoeffT > > operator*(MultiPoly< N, CoeffT > const &p, MultiPoly< M, CoeffT > const &q)
Various utility functions.
std::ostream & operator<<(std::ostream &os, const Bezier &b)
static void normalize(type &p)
static T evaluate(type const &p, std::array< T, N > const &X)
static void shift(type &p, multi_index_type const &I)