Add ChiakiSeqNum32

This commit is contained in:
Florian Märkl 2019-06-26 21:27:51 +02:00
commit b3f71fc5ab
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
2 changed files with 45 additions and 19 deletions

View file

@ -27,27 +27,31 @@
extern "C" {
#endif
typedef uint16_t ChiakiSeqNum16;
#define CHIAKI_SEQ_NUM_16_MAX 0xffff
static inline bool chiaki_seq_num_16_lt(ChiakiSeqNum16 a, ChiakiSeqNum16 b)
{
if(a == b)
return false;
int32_t d = (int32_t)b - (int32_t)a;
return (a < b && d < (1 << 15))
|| ((a > b) && -d > (1 << 15));
#define CHIAKI_DEFINE_SEQNUM(bits, greater_sint) \
\
typedef uint##bits##_t ChiakiSeqNum##bits; \
\
static inline bool chiaki_seq_num_##bits##_lt(ChiakiSeqNum##bits a, ChiakiSeqNum##bits b) \
{ \
if(a == b) \
return false; \
greater_sint d = (greater_sint)b - (greater_sint)a; \
return (a < b && d < ((ChiakiSeqNum##bits)1 << (bits - 1))) \
|| ((a > b) && -d > ((ChiakiSeqNum##bits)1 << (bits - 1))); \
} \
\
static inline bool chiaki_seq_num_##bits##_gt(ChiakiSeqNum##bits a, ChiakiSeqNum##bits b) \
{ \
if(a == b) \
return false; \
greater_sint d = (greater_sint)b - (greater_sint)a; \
return (a < b && d > ((ChiakiSeqNum##bits)1 << (bits - 1))) \
|| ((a > b) && -d < ((ChiakiSeqNum##bits)1 << (bits - 1))); \
}
static inline bool chiaki_seq_num_16_gt(ChiakiSeqNum16 a, ChiakiSeqNum16 b)
{
if(a == b)
return false;
int32_t d = (int32_t)b - (int32_t)a;
return (a < b && d > (1 << 15))
|| ((a > b) && -d < (1 << 15));
}
CHIAKI_DEFINE_SEQNUM(16, int32_t)
CHIAKI_DEFINE_SEQNUM(32, int64_t)
#undef CHIAKI_DEFINE_SEQNUM
#ifdef __cplusplus
}

View file

@ -51,6 +51,20 @@ static MunitResult test_seq_num_16(const MunitParameter params[], void *user)
}
static MunitResult test_seq_num_32(const MunitParameter params[], void *user)
{
munit_assert(chiaki_seq_num_32_gt(1, 0));
munit_assert(!chiaki_seq_num_32_gt(0, 1));
munit_assert(!chiaki_seq_num_32_lt(1, 0));
munit_assert(chiaki_seq_num_32_lt(0, 1));
munit_assert(chiaki_seq_num_32_gt(1, 0xfffffff5));
munit_assert(!chiaki_seq_num_32_gt(0xfffffff5, 1));
return MUNIT_OK;
}
MunitTest tests_seq_num[] = {
{
"/seq_num_16",
@ -60,5 +74,13 @@ MunitTest tests_seq_num[] = {
MUNIT_TEST_OPTION_NONE,
NULL
},
{
"/seq_num_32",
test_seq_num_32,
NULL,
NULL,
MUNIT_TEST_OPTION_NONE,
NULL
},
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
};