Files
cpputils/src/cpputils.h
T

122 lines
2.6 KiB
C++
Raw Normal View History

2021-02-04 01:56:39 +01:00
#pragma once
// system includes
#include <utility>
#include <type_traits>
2021-08-20 13:16:30 +02:00
#include <algorithm>
2021-02-04 01:56:39 +01:00
namespace cpputils {
namespace literals {
/**
* User-defined Literals
* usage:
*
* uint32_t = test = 10_MHz; // --> 10000000
*/
constexpr unsigned long long operator"" _kHz(unsigned long long x)
{
return x * 1000;
}
constexpr unsigned long long operator"" _MHz(unsigned long long x)
{
return x * 1000 * 1000;
}
constexpr unsigned long long operator"" _GHz(unsigned long long x)
{
return x * 1000 * 1000 * 1000;
}
constexpr unsigned long long operator"" _kBit(unsigned long long x)
{
return x * 1024;
}
constexpr unsigned long long operator"" _MBit(unsigned long long x)
{
return x * 1024 * 1024;
}
constexpr unsigned long long operator"" _GBit(unsigned long long x)
{
return x * 1024 * 1024 * 1024;
}
constexpr unsigned long long operator"" _kB(unsigned long long x)
{
return x * 1024;
}
constexpr unsigned long long operator"" _MB(unsigned long long x)
{
return x * 1024 * 1024;
}
constexpr unsigned long long operator"" _GB(unsigned long long x)
{
return x * 1024 * 1024 * 1024;
}
} // namespace literals
template<typename T>
T vmin(T&&t)
{
return std::forward<T>(t);
}
template<typename T0, typename T1, typename... Ts>
typename std::common_type<T0, T1, Ts...>::type vmin(T0&& val1, T1&& val2, Ts&&... vs)
{
if (val1 < val2)
return vmin(val1, std::forward<Ts>(vs)...);
else
return vmin(val2, std::forward<Ts>(vs)...);
}
2021-04-22 12:50:04 +02:00
template<typename T>
T vmax(T&&t)
{
return std::forward<T>(t);
}
template<typename T0, typename T1, typename... Ts>
typename std::common_type<T0, T1, Ts...>::type vmax(T0&& val1, T1&& val2, Ts&&... vs)
{
if (val1 > val2)
return vmax(val1, std::forward<Ts>(vs)...);
else
return vmax(val2, std::forward<Ts>(vs)...);
}
2021-02-04 01:56:39 +01:00
template<class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi )
{
// assert( !(hi < lo) );
return (v < lo) ? lo : (hi < v) ? hi : v;
}
template<typename T>
T mapValue(T x, T in_min, T in_max, T out_min, T out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
2021-08-20 13:16:30 +02:00
template<typename T>
T mapValueClamped(T x, T in_min, T in_max, T out_min, T out_max)
{
if (x < std::min(in_min, in_max))
x = std::min(in_min, in_max);
else if (x > std::max(in_min, in_max))
x = std::max(in_min, in_max);
return mapValue(x, in_min, in_max, out_min, out_max);
}
2021-02-04 01:56:39 +01:00
template<typename First, typename ... T>
bool is_in(First &&first, T && ... t)
{
return ((first == t) || ...);
}
} // namespace cpputils