#pragma once
#include "ZXAlgorithms.h"
#include <utility>
#include <vector>
namespace ZXing {
namespace Pdf417 {
class ModulusGF;
class ModulusPoly
{
const ModulusGF* _field = nullptr;
std::vector<int> _coefficients;
public:
ModulusPoly() = default;
ModulusPoly(const ModulusGF& field, const std::vector<int>& coefficients);
const std::vector<int>& coefficients() const {
return _coefficients;
}
int degree() const {
return Size(_coefficients) - 1;
}
bool isZero() const {
return _coefficients.at(0) == 0;
}
int coefficient(int degree) const {
return _coefficients.at(_coefficients.size() - 1 - degree);
}
int evaluateAt(int a) const;
ModulusPoly add(const ModulusPoly& other) const;
ModulusPoly subtract(const ModulusPoly& other) const;
ModulusPoly multiply(const ModulusPoly& other) const;
ModulusPoly negative() const;
ModulusPoly multiply(int scalar) const;
ModulusPoly multiplyByMonomial(int degree, int coefficient) const;
void divide(const ModulusPoly& other, ModulusPoly& quotient, ModulusPoly& remainder) const;
friend void swap(ModulusPoly& a, ModulusPoly& b)
{
std::swap(a._field, b._field);
std::swap(a._coefficients, b._coefficients);
}
};
} }