libnum: add num8/num16 comparisons with integers and some tests
This commit is contained in:
parent
d75ef1b2e9
commit
d77c7fef78
|
@ -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
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
#include <num/num.h>
|
||||
|
||||
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<num8> == true);
|
||||
static_assert(libnum::is_num_v<int> == 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));
|
||||
|
|
Loading…
Reference in New Issue