diff --git a/libnum/include/num/num.h b/libnum/include/num/num.h index 52d75a3..a5a257f 100644 --- a/libnum/include/num/num.h +++ b/libnum/include/num/num.h @@ -94,6 +94,24 @@ struct num8 v %= other.v; return *this; } + + /* Comparisons with int */ + + inline constexpr bool operator==(int const &i) { + return i == 0 && v == 0; + } + inline constexpr bool operator<(int const &i) { + return i >= 1; + } + inline constexpr bool operator<=(int const &i) { + return *this < i || *this == i; + } + inline constexpr bool operator>(int const &i) { + return i + (v == 0) <= 0; + } + inline constexpr bool operator>=(int const &i) { + return i <= 0; + } }; /* num16: Signed 8:8 fixed-point type @@ -155,6 +173,24 @@ struct num16 v %= other.v; return *this; } + + /* Comparisons with int */ + + inline constexpr bool operator==(int const &i) { + return ((v & 0xff) == 0) && (v >> 8) == i; + } + inline constexpr bool operator<(int const &i) { + return (v >> 8) < i; + } + inline constexpr bool operator<=(int const &i) { + return (v >> 8) + ((v & 0xff) != 0) <= i; + } + inline constexpr bool operator>(int const &i) { + return (v >> 8) + ((v & 0xff) != 0) > i; + } + inline constexpr bool operator>=(int const &i) { + return (v >> 8) >= i; + } }; /* num32: Signed 16:16 fixed-point type diff --git a/libnum/src/static_checks.cpp b/libnum/src/static_checks.cpp index 3055bd7..3767a54 100644 --- a/libnum/src/static_checks.cpp +++ b/libnum/src/static_checks.cpp @@ -1,8 +1,12 @@ #include -using namespace libnum; +using namespace num; static_assert(sizeof(num8) == 1); +static_assert(sizeof(num16) == 2); +static_assert(sizeof(num32) == 4); +static_assert(sizeof(num64) == 8); + static_assert(num8(1).v == 0x00); static_assert(num8(0.5).v == 0x80); static_assert(num8(0.0625f).v == 0x10); @@ -11,16 +15,39 @@ static_assert(num8(0.625) + num8(0.125) == num8(0.75)); static_assert(num8(0.25) < num8(0.75)); static_assert(num8(0.5) >= num8(0.5)); -static_assert(sizeof(num16) == 2); static_assert((uint16_t)num16(-1).v == 0xff00); static_assert(num16(num8(0.25)).v == num16(0.25).v); -static_assert(sizeof(num32) == 4); -// static_assert(num32(num16(-15)) == num32(-15)); +static_assert(num32(num16(-15)) == num32(-15)); -static_assert(sizeof(num64) == 8); static_assert(num64(num16(1)) == num64(1)); static_assert(num64(num16(-1)) == num64(-1)); -static_assert(libnum::is_num_v == true); -static_assert(libnum::is_num_v == false); +/* Comparisons between num8 and int */ + +static_assert(num8(0) == 0); +static_assert(num8(0) != 1); +static_assert(num8(0.5) != 0); +static_assert(num8(0.5) != 1); +static_assert(num8(1) == 0); // overflow +static_assert(num8(1) != 1); // overflow + +static_assert(!(num8(0) < 0)); +static_assert(num8(0) < 1); +static_assert(!(num8(0.5) < 0)); +static_assert(num8(0.5) < 1); + +static_assert(num8(0) <= 0); +static_assert(num8(0) <= 1); +static_assert(!(num8(0.5) <= 0)); +static_assert(num8(0.5) <= 1); + +static_assert(!(num8(0) > 0)); +static_assert(!(num8(0) > 1)); +static_assert(num8(0.5) > 0); +static_assert(!(num8(0.5) > 1)); + +static_assert(num8(0) >= 0); +static_assert(!(num8(0) >= 1)); +static_assert(num8(0.5) >= 0); +static_assert(!(num8(0.5) >= 1));