#pragma once
|
|
|
|
namespace gp{
|
|
template<typename T, typename U, typename ...rest>
|
|
constexpr T max(T first, U second, rest... args)
|
|
{
|
|
if constexpr (sizeof...(args) == 0)
|
|
{
|
|
return first > second ? first : second;
|
|
}
|
|
else
|
|
{
|
|
return max(first > second ? first : second, args...);
|
|
}
|
|
}
|
|
|
|
template<typename T, typename U, typename ...rest>
|
|
constexpr T min(T first, U second, rest... args)
|
|
{
|
|
if constexpr (sizeof...(args) == 0)
|
|
{
|
|
return first < second ? first : second;
|
|
}
|
|
else
|
|
{
|
|
return min(first < second ? first : second, args...);
|
|
}
|
|
}
|
|
|
|
template<typename T>
|
|
constexpr T clamp(T first, T value, T last)
|
|
{
|
|
if(value < first) return first;
|
|
if(value > last) return last;
|
|
return value;
|
|
}
|
|
}
|