1
0
Fork 0
mirror of https://github.com/polybar/polybar.git synced 2024-10-27 05:23:39 -04:00
polybar/include/utils/math.hpp

106 lines
3.6 KiB
C++
Raw Normal View History

#pragma once
2016-05-19 10:41:06 -04:00
#include <algorithm>
#include <cmath>
2016-05-19 10:41:06 -04:00
2016-06-14 23:32:35 -04:00
#include "common.hpp"
2016-11-19 00:22:44 -05:00
POLYBAR_NS
2016-06-14 23:32:35 -04:00
namespace math_util {
2016-06-14 23:32:35 -04:00
/**
* Limit value T by min and max bounds
*/
template <typename ValueType>
ValueType cap(ValueType value, ValueType min_value, ValueType max_value) {
value = std::min<ValueType>(value, max_value);
value = std::max<ValueType>(value, min_value);
2016-05-19 10:41:06 -04:00
return value;
}
/**
* Calculate the percentage for a value
* between min_value and max_value
*/
template <typename ValueType, typename ReturnType = int>
ReturnType unbounded_percentage(ValueType value, ValueType min_value, ValueType max_value) {
auto upper = (max_value - min_value);
auto lower = static_cast<float>(value - min_value);
float percentage = (lower / upper) * 100.0f;
if (std::is_integral<ReturnType>()) {
return static_cast<ReturnType>(std::round(percentage));
} else {
return percentage;
}
}
2017-01-12 14:28:44 -05:00
/**
* Calculates percentage for a value and
* clamps it to a percentage between 0 and 100
*/
template <typename ValueType, typename ReturnType = int>
ReturnType percentage(ValueType value, ValueType min_value, ValueType max_value) {
auto raw_percentage = unbounded_percentage<ValueType, ReturnType>(value, min_value, max_value);
return cap<ReturnType>(raw_percentage, 0.0f, 100.0f);
}
/**
* Calculates percentage for a value and
* clamps it to a percentage between 0 and 100
2017-01-12 14:28:44 -05:00
*/
template <typename ValueType, typename ReturnType = int>
ReturnType percentage(ValueType value, ValueType max_value) {
return percentage<ValueType, ReturnType>(value, max_value - max_value, max_value);
}
/**
* Get value for signed percentage of `max_value` (cap between -max_value and max_value)
*/
template <typename ValueType, typename ReturnType = int>
ReturnType signed_percentage_to_value(ValueType signed_percentage, ValueType max_value) {
if (std::is_integral<ReturnType>())
return cap<ReturnType>(signed_percentage * max_value / 100.0f + 0.5f, -max_value, max_value);
else
return cap<ReturnType>(signed_percentage * max_value / 100.0f, -max_value, max_value);
}
/**
* Get value for percentage of `max_value` (cap between 0 and max_value)
*/
template <typename ValueType, typename ReturnType = int>
ReturnType percentage_to_value(ValueType percentage, ValueType max_value) {
if (std::is_integral<ReturnType>())
return cap<ReturnType>(percentage * max_value / 100.0f + 0.5f, 0, max_value);
else
return cap<ReturnType>(percentage * max_value / 100.0f, 0.0f, max_value);
}
/**
* Get value for percentage of `min_value` to `max_value`
*/
template <typename ValueType, typename ReturnType = int>
ReturnType percentage_to_value(ValueType percentage, ValueType min_value, ValueType max_value) {
if (std::is_integral<ReturnType>())
2016-11-25 02:42:31 -05:00
return cap<ReturnType>(percentage * (max_value - min_value) / 100.0f + 0.5f, 0, max_value - min_value) +
min_value;
else
return cap<ReturnType>(percentage * (max_value - min_value) / 100.0f, 0.0f, max_value - min_value) + min_value;
}
template <typename ReturnType = int>
ReturnType nearest_10(double value) {
return static_cast<ReturnType>(static_cast<int>(value / 10.0 + 0.5) * 10.0);
}
template <typename ReturnType = int>
ReturnType nearest_5(double value) {
return static_cast<ReturnType>(static_cast<int>(value / 5.0 + 0.5) * 5.0);
}
2017-01-18 23:38:42 -05:00
inline int ceil(double value, int step = 1) {
return static_cast<int>((value * 10 + step * 10 - 1) / (step * 10)) * step;
}
} // namespace math_util
2016-06-14 23:32:35 -04:00
2016-11-19 00:22:44 -05:00
POLYBAR_NS_END