InfiniTime/src/components/utility/LinearApproximation.h
Riku Isokoski 6dc49e5bdb clang-format: Always break template declarations
I find this format easier to read, because the definitions are at the
expected indentation, making it easier to find what I'm looking for.
2023-02-16 09:13:58 +02:00

43 lines
993 B
C++

#pragma once
#include <cstddef>
#include <array>
namespace Pinetime {
namespace Utility {
// based on: https://github.com/SHristov92/LinearApproximation/blob/main/Linear.h
template <typename Key, typename Value, std::size_t Size>
class LinearApproximation {
using Point = struct {
Key key;
Value value;
};
public:
LinearApproximation(const std::array<Point, Size>&& sorted_points) : points {sorted_points} {
}
Value GetValue(Key key) const {
if (key <= points[0].key) {
return points[0].value;
}
for (std::size_t i = 1; i < Size; i++) {
const auto& p = points[i];
const auto& p_prev = points[i - 1];
if (key < p.key) {
return p_prev.value + (key - p_prev.key) * (p.value - p_prev.value) / (p.key - p_prev.key);
}
}
return points[Size - 1].value;
}
private:
std::array<Point, Size> points;
};
}
}