diff --git a/src/common/math_util.h b/src/common/math_util.h index d44b06e74..fbcc09490 100644 --- a/src/common/math_util.h +++ b/src/common/math_util.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include #include @@ -16,14 +17,24 @@ inline bool IntervalsIntersect(unsigned start0, unsigned length0, unsigned start } template -inline T Clamp(const T val, const T& min, const T& max) -{ +inline T Clamp(const T val, const T& min, const T& max) { return std::max(min, std::min(max, val)); } +/// Sign-extends a val of type T that has NBits bits. +template +inline T SignExtend(const T val) { + static_assert(std::numeric_limits::is_signed, "T must be signed"); + static_assert(NBits <= 8 * sizeof(T), "NBits larger that bitsize of T"); + + using unsignedT = typename std::make_unsigned::type; + + constexpr size_t shift = 8 * sizeof(T) - NBits; + return static_cast(static_cast(val) << shift) >> shift; +} + template -struct Rectangle -{ +struct Rectangle { T left; T top; T right;