Select Git revision
PugsParser.cpp
-
Stéphane Del Pino authored
This helper class is not finished, does not handle statements correctly
Stéphane Del Pino authoredThis helper class is not finished, does not handle statements correctly
PolynomialBasis.hpp 1.97 KiB
#ifndef POLYNOMIALBASIS_HPP
#define POLYNOMIALBASIS_HPP
#include <algebra/TinyVector.hpp>
#include <analysis/Polynomial.hpp>
#include <utils/Messenger.hpp>
enum class BasisType
{
canonical
};
template <size_t N>
class PolynomialBasis
{
private:
static_assert((N >= 0), "Number of elements in the basis must be non-negative");
TinyVector<N + 1, Polynomial<N>> m_elements;
BasisType m_basis_type;
PUGS_INLINE
constexpr PolynomialBasis<N>&
_buildCanonicalBasis()
{
for (size_t i = 0; i <= N; i++) {
TinyVector<N + 1> coefficients(zero);
coefficients[i] = 1;
elements()[i] = Polynomial<N>(coefficients);
}
return *this;
}
public:
PUGS_INLINE
constexpr size_t
size() const
{
return N + 1;
}
PUGS_INLINE
constexpr size_t
degree() const
{
return N;
}
PUGS_INLINE
constexpr BasisType&
type()
{
return m_basis_type;
}
PUGS_INLINE
std::string_view
displayType()
{
switch (m_basis_type) {
case BasisType::canonical:
return "canonical";
default:
return "unknown basis type";
}
}
PUGS_INLINE
constexpr const TinyVector<N + 1, Polynomial<N>>&
elements() const
{
return m_elements;
}
PUGS_INLINE
constexpr TinyVector<N + 1, Polynomial<N>>&
elements()
{
return m_elements;
}
PUGS_INLINE
constexpr PolynomialBasis<N>&
build(BasisType basis_type)
{
type() = basis_type;
switch (basis_type) {
case BasisType::canonical: {
return _buildCanonicalBasis();
break;
}
default:
throw UnexpectedError("unknown basis type");
}
}
PUGS_INLINE constexpr PolynomialBasis(const TinyVector<N + 1, Polynomial<N>>& elements) noexcept
: m_elements{elements}
{}
PUGS_INLINE
constexpr PolynomialBasis(TinyVector<N + 1, Polynomial<N>>&& elements) noexcept : m_elements{elements} {}
PUGS_INLINE
constexpr PolynomialBasis() noexcept = default;
~PolynomialBasis() = default;
};
#endif // POLYNOMIAL_HPP