#pragma once namespace gp{ template 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 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 constexpr T clamp(T first, T value, T last) { if(value < first) return first; if(value > last) return last; return value; } }