2016-05-31 03:58:58 +00:00
|
|
|
#pragma once
|
2016-05-19 14:41:06 +00:00
|
|
|
|
|
|
|
#include <algorithm>
|
2021-03-03 21:38:05 +00:00
|
|
|
#include <cmath>
|
2016-05-19 14:41:06 +00:00
|
|
|
|
2016-06-15 03:32:35 +00:00
|
|
|
#include "common.hpp"
|
|
|
|
|
2016-11-19 05:22:44 +00:00
|
|
|
POLYBAR_NS
|
2016-06-15 03:32:35 +00:00
|
|
|
|
2016-10-19 12:46:43 +00:00
|
|
|
namespace math_util {
|
2016-11-26 12:09:29 +00:00
|
|
|
/**
|
|
|
|
* Get the min value
|
|
|
|
*/
|
|
|
|
template <typename ValueType>
|
|
|
|
ValueType min(ValueType one, ValueType two) {
|
2017-01-19 04:38:42 +00:00
|
|
|
return one < two ? one : two;
|
2016-11-26 12:09:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the max value
|
|
|
|
*/
|
|
|
|
template <typename ValueType>
|
|
|
|
ValueType max(ValueType one, ValueType two) {
|
2017-01-19 04:38:42 +00:00
|
|
|
return one > two ? one : two;
|
2016-11-26 12:09:29 +00:00
|
|
|
}
|
|
|
|
|
2016-06-15 03:32:35 +00:00
|
|
|
/**
|
|
|
|
* Limit value T by min and max bounds
|
|
|
|
*/
|
2016-10-25 05:04:14 +00:00
|
|
|
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 14:41:06 +00:00
|
|
|
return value;
|
|
|
|
}
|
2016-10-19 12:46:43 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Calculate the percentage for a value
|
2020-09-20 12:26:17 +00:00
|
|
|
* between min_value and max_value
|
2016-10-19 12:46:43 +00:00
|
|
|
*/
|
2021-03-03 21:38:05 +00:00
|
|
|
template <typename ValueType, typename ReturnType = int>
|
|
|
|
ReturnType unbounded_percentage(ValueType value, ValueType min_value, ValueType max_value) {
|
2016-10-25 05:04:14 +00:00
|
|
|
auto upper = (max_value - min_value);
|
|
|
|
auto lower = static_cast<float>(value - min_value);
|
2021-03-03 21:38:05 +00:00
|
|
|
float percentage = (lower / upper) * 100.0f;
|
|
|
|
if (std::is_integral<ReturnType>()) {
|
|
|
|
return static_cast<ReturnType>(std::round(percentage));
|
|
|
|
} else {
|
|
|
|
return percentage;
|
|
|
|
}
|
2016-10-25 05:04:14 +00:00
|
|
|
}
|
|
|
|
|
2017-01-12 19:28:44 +00:00
|
|
|
/**
|
2020-09-20 12:26:17 +00: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 19:28:44 +00: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);
|
|
|
|
}
|
|
|
|
|
2016-10-25 05:04:14 +00:00
|
|
|
/**
|
2019-03-22 08:55:08 +00:00
|
|
|
* 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)
|
2016-10-25 05:04:14 +00:00
|
|
|
*/
|
|
|
|
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);
|
2016-10-19 12:46:43 +00:00
|
|
|
}
|
2016-11-20 22:49:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 07:42:31 +00:00
|
|
|
return cap<ReturnType>(percentage * (max_value - min_value) / 100.0f + 0.5f, 0, max_value - min_value) +
|
|
|
|
min_value;
|
2016-11-20 22:49:07 +00:00
|
|
|
else
|
|
|
|
return cap<ReturnType>(percentage * (max_value - min_value) / 100.0f, 0.0f, max_value - min_value) + min_value;
|
|
|
|
}
|
2017-01-11 03:16:33 +00:00
|
|
|
|
|
|
|
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-19 04:38:42 +00:00
|
|
|
|
|
|
|
inline int ceil(double value, int step = 1) {
|
|
|
|
return static_cast<int>((value * 10 + step * 10 - 1) / (step * 10)) * step;
|
|
|
|
}
|
2021-03-03 21:38:05 +00:00
|
|
|
} // namespace math_util
|
2016-06-15 03:32:35 +00:00
|
|
|
|
2016-11-19 05:22:44 +00:00
|
|
|
POLYBAR_NS_END
|