polybar/include/utils/math.hpp

47 lines
1.3 KiB
C++

#pragma once
#include <algorithm>
#include "common.hpp"
LEMONBUDDY_NS
namespace math_util {
/**
* 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);
return value;
}
/**
* Calculate the percentage for a value
* within given range
*/
template <typename ValueType, typename ReturnType = int>
ReturnType percentage(ValueType value, ValueType min_value, ValueType max_value) {
auto upper = (max_value - min_value);
auto lower = static_cast<float>(value - min_value);
ValueType percentage = (lower / upper) * 100.0f;
if (std::is_integral<ReturnType>())
percentage += 0.5f;
return cap<ReturnType>(percentage, 0.0f, 100.0f);
}
/**
* Get value for percentage of `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);
}
}
LEMONBUDDY_NS_END