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;
};
}