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" { extern "C" {
#endif #endif
typedef uint16_t ChiakiSeqNum16; #define CHIAKI_DEFINE_SEQNUM(bits, greater_sint) \
\
#define CHIAKI_SEQ_NUM_16_MAX 0xffff typedef uint##bits##_t ChiakiSeqNum##bits; \
\
static inline bool chiaki_seq_num_16_lt(ChiakiSeqNum16 a, ChiakiSeqNum16 b) static inline bool chiaki_seq_num_##bits##_lt(ChiakiSeqNum##bits a, ChiakiSeqNum##bits b) \
{ { \
if(a == b) if(a == b) \
return false; return false; \
int32_t d = (int32_t)b - (int32_t)a; greater_sint d = (greater_sint)b - (greater_sint)a; \
return (a < b && d < (1 << 15)) return (a < b && d < ((ChiakiSeqNum##bits)1 << (bits - 1))) \
|| ((a > b) && -d > (1 << 15)); || ((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) CHIAKI_DEFINE_SEQNUM(16, int32_t)
{ CHIAKI_DEFINE_SEQNUM(32, int64_t)
if(a == b) #undef CHIAKI_DEFINE_SEQNUM
return false;
int32_t d = (int32_t)b - (int32_t)a;
return (a < b && d > (1 << 15))
|| ((a > b) && -d < (1 << 15));
}
#ifdef __cplusplus #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[] = { MunitTest tests_seq_num[] = {
{ {
"/seq_num_16", "/seq_num_16",
@ -60,5 +74,13 @@ MunitTest tests_seq_num[] = {
MUNIT_TEST_OPTION_NONE, MUNIT_TEST_OPTION_NONE,
NULL NULL
}, },
{
"/seq_num_32",
test_seq_num_32,
NULL,
NULL,
MUNIT_TEST_OPTION_NONE,
NULL
},
{ NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }
}; };