From 7aaef09f7db2ca315d7358c61a0f5686e25650e8 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 28 Mar 2016 00:14:57 +0100 Subject: [PATCH] Common: Add MathUtil::SignExtend --- src/common/math_util.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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;