43 lines
944 B
C++
43 lines
944 B
C++
#pragma once
|
|
#include <bits/unique_ptr.h>
|
|
|
|
namespace floatpump {
|
|
|
|
struct ICalibrator {
|
|
virtual ~ICalibrator() = default;
|
|
virtual auto translate(double measurand) -> double = 0;
|
|
};
|
|
|
|
struct LinearCalibrator
|
|
{
|
|
LinearCalibrator(std::pair<std::pair<double, double>, std::pair<double, double>>);
|
|
auto translate(double measurand) -> double;
|
|
|
|
private:
|
|
std::pair<std::pair<double, double>, std::pair<double, double>> _calibration_points;
|
|
double _a;
|
|
double _b;
|
|
};
|
|
|
|
|
|
|
|
template<typename T>
|
|
class Calibrator : public ICalibrator
|
|
{
|
|
public:
|
|
template<typename ...As>
|
|
explicit Calibrator(As&&... args)
|
|
{
|
|
_internal_calibrator = std::make_unique<T>(std::forward<As>(args)...);
|
|
}
|
|
|
|
double translate(double measurand) override
|
|
{
|
|
return _internal_calibrator->translate(measurand);
|
|
}
|
|
|
|
private:
|
|
std::unique_ptr<T> _internal_calibrator;
|
|
};
|
|
|
|
} |