mirror of
https://github.com/citra-emu/citra.git
synced 2024-11-25 07:30:15 +00:00
Common: Add MathUtil::SignExtend
This commit is contained in:
parent
e3eb4c068d
commit
7aaef09f7d
@ -5,6 +5,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <cstdlib>
|
||||
#include <type_traits>
|
||||
|
||||
@ -16,14 +17,24 @@ inline bool IntervalsIntersect(unsigned start0, unsigned length0, unsigned start
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
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<size_t NBits, typename T>
|
||||
inline T SignExtend(const T val) {
|
||||
static_assert(std::numeric_limits<T>::is_signed, "T must be signed");
|
||||
static_assert(NBits <= 8 * sizeof(T), "NBits larger that bitsize of T");
|
||||
|
||||
using unsignedT = typename std::make_unsigned<T>::type;
|
||||
|
||||
constexpr size_t shift = 8 * sizeof(T) - NBits;
|
||||
return static_cast<T>(static_cast<unsignedT>(val) << shift) >> shift;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
struct Rectangle
|
||||
{
|
||||
struct Rectangle {
|
||||
T left;
|
||||
T top;
|
||||
T right;
|
||||
|
Loading…
Reference in New Issue
Block a user